概述
package com.dymolu.javaweb.servlet;
import jakarta.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
public class Aservlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//获取响应
servletResponse.setContentType("text/html");
PrintWriter out = servletResponse.getWriter();
ServletContext
Servlet对象的环境对象。(Servlet对象的上下文对象。)
获取servletontext对象
// 获取ServletContext环境对象
ServletContext application = this.getServletContext();
//页面输出
out.print("ServletContext环境对象是:" + application);
//输出结果是
//ServletContext对象是:org.apache.catalina.core.ApplicationContextFacade@413bcb3f
ServletContext对象其实对应的就是整个web.xml文件。
1. ServletContext是什么?
ServletContext是接口,是Servlet规范中的一员。
2. ServletContext是谁实现的?
Tomcat服务器(WEB服务器)实现了ServletContext接口。
public class org.apache.catalina.core.ApplicationContextFacade implements ServletContext {}
3. ServletContext对象是谁创建的?在什么时候创建的?
ServletContext对象在WEB服务器启动的时候创建。
对于一个webapp来说,ServletContext对象只有一个。
ServletContext对象在服务器关闭的时候销毁
4. ServletContext怎么理解?
放在ServletContext对象当中的数据,所有Servlet一定是共享的。
一个教室里有多个学生,那么每一个学生就是一个Servlet,这些学生都在同一个教室当中,那么我们可以把这个教室叫做ServletContext对象。那么也就是说放在这个ServletContext对象(环境)当中的数据,在同一个教室当中,物品都是共享的。比如:教室中有一个空调,所有的学生都可以操作。可见,空调是共享的。因为空调放在教室当中。教室就是ServletContext对象。
只要在同一个webapp当中,只要在同一个应用当中,所有的Servlet对象都是共享同一个ServletContext对象的。
Tomcat是一个容器,一个容器当中可以放多个webapp,一个webapp对应一个ServletContext对象。
5.ServletContext接口中有哪些常用的方法?
获取所有的初始化参数的name
public Enumeration<String> getInitParameterNames();
通过初始化参数的name获取value
public String getInitParameter(String name);
<context-param>
<param-name>pageSize</param-name>
<param-value>10</param-value>
</context-param>
<context-param>
<param-name>startIndex</param-name>
<param-value>0</param-value>
</context-param>
<!--上下文的初始化参数,以上的这些配置信息(属于全局配置,基本上不会有变动),可以通过ServletContext对象来获取-->
<!--注意:以上的配置信息属于应用级的配置信息,一般一个项目中共享的公共的配置信息会放到以上的标签当中。-->
<!--<servlet>的初始化参数属于局部配置-->
<!--如果你的配置信息只是想给某一个servlet作为参考,那么你配置到servlet标签当中即可,使用ServletConfig对象来获取。-->
// 获取上下文的初始化参数<context-param> </context-param>
Enumeration<String> initParameterNames = application.getInitParameterNames();
//遍历集合
while (initParameterNames.hasMoreElements()){
String name = initParameterNames.nextElement();//获得name
String value = application.getInitParameter(name);//根据name获取value
out.print(name + "=" + value + "<br>"); //输出结果
//startIndex=0
//pageSize=10
}
6.ServletContext对象的其他方法
6.1.获取应用的根路径(非常重要)
因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径。
public String getContextPath();
//获取应用上下文的根路径
String contextPath = application.getContextPath();
out.print("应用上下文的根路径=" +contextPath + "<br>");
//应用上下文的根路径=/servlet04
// 获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径
// 在java源码当中,不要将应用的根路径写死,因为你永远都不知道这个应用在最终部署的时候,起一个什么名字。
6.2.获取文件的绝对路径(真实路径)
public String getRealPath(String path);
// 获取文件的绝对路径
//后面的这个路径,加了一个“/”,这个“/”代表的是web的根
// 你不加“/”,默认也是从根下开始找。
String realPath = application.getRealPath("text.html");
out.print(realPath);
//C:UsersAdministratorIdeaProjectsdymoluoutartifactsservlet04_war_explodedtext.html
6.3.通过ServletContext对象也是可以记录日志的
这个日志会自动记录到 /logs目录下。
public void log(String message);
public void log(String message, Throwable t);
application.log("今天的学习很开心!");
int age = 17; // 17岁
// 当年龄小于18岁的时候,表示非法,记录日志和异常
if(age < 18) {
application.log("对不起,您未成年,请绕行!", new RuntimeException("小屁孩,快走开,不适合你!"));
}
6.4Tomcat服务器的logs目录下都有哪些日志文件?
catalina.2022-04-03.log 服务器端的java程序运行的控制台信息。
localhost.2022-04-03.log ServletContext对象的log方法记录的日志信息存储到这个文件中。
localhost_access_log.2022-04-03.txt 访问日志
7.ServletContext对象还有另一个名字:应用域
数据量小、所有用户共享、又不经常或从不修改,这样的数据放到ServletContext这个应用域当中,会大大提升效率。
因为应用域相当于一个缓存,放到缓存中的数据,下次在用的时候,不需要从数据库中再次获取,大大提升执行效率。
8.对ServletContext应用域中的数据进行操作
存(向ServletContext应用域中存数据)
方法类似 map.put(k, v)
public void setAttribute(String name, Object value);
取(从ServletContext应用域中取数据)
方法类似 Object v = map.get(k)
public Object getAttribute(String name);
删(删除ServletContext应用域中的数据)
方法类似 map.remove(k)
public void removeAttribute(String name);
//准备数据
//单独创建一个类
public class User {
private String name;
private String password;
--------下面构造方法等代码省略--------
---------Aservlet---------
//new一个对象
User user = new User("jack", "123");
// 向ServletContext应用域当中存储数据
application.setAttribute("userObj", user);
// 取出来
Object userObj = application.getAttribute("userObj");
//删除
application.removeAttribute("userObj");
9.注意:
以后我们编写Servlet类的时候,实际上是不会去直接继承GenericServlet类的,因为我们是B/S结构的系统,这种系统是基于HTTP超文本传输协议的,在Servlet规范当中,提供了一个类叫做HttpServlet,它是专门为HTTP协议准备的一个Servlet类。
我们编写的Servlet类要继承HttpServlet(HttpServlet是HTTP协议专用的)使用HttpServlet处理HTTP协议更便捷。
但是需要知道它的继承结构:
jakarta.servlet.Servlet(接口)【父亲】
jakarta.servlet.GenericServlet implements Servlet(抽象类)【儿子】
jakarta.servlet.http.HttpServlet extends GenericServlet(抽象类)【孙子】
以后编写的Servlet要继承HttpServlet类。
最后
以上就是俊秀缘分为你收集整理的ServletContext的全部内容,希望文章能够帮你解决ServletContext所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复