1
2
3
4
5
6
7
8
9
10
11package 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对象
1
2
3
4
5
6// 获取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接口。
1public 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接口中有哪些常用的方法?
1
2
3
4获取所有的初始化参数的name public Enumeration<String> getInitParameterNames(); 通过初始化参数的name获取value public String getInitParameter(String name);
1
2
3
4
5
6
7
8
9
10
11
12
13<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对象来获取。-->
1
2
3
4
5
6
7
8
9
10// 获取上下文的初始化参数<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源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径。
1public String getContextPath();
1
2
3
4
5
6//获取应用上下文的根路径 String contextPath = application.getContextPath(); out.print("应用上下文的根路径=" +contextPath + "<br>"); //应用上下文的根路径=/servlet04 // 获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径 // 在java源码当中,不要将应用的根路径写死,因为你永远都不知道这个应用在最终部署的时候,起一个什么名字。
6.2.获取文件的绝对路径(真实路径)
1public String getRealPath(String path);
1
2
3
4
5
6// 获取文件的绝对路径 //后面的这个路径,加了一个“/”,这个“/”代表的是web的根 // 你不加“/”,默认也是从根下开始找。 String realPath = application.getRealPath("text.html"); out.print(realPath); //C:UsersAdministratorIdeaProjectsdymoluoutartifactsservlet04_war_explodedtext.html
6.3.通过ServletContext对象也是可以记录日志的
这个日志会自动记录到 /logs目录下。
1
2public void log(String message); public void log(String message, Throwable t);
1
2
3
4
5
6application.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应用域中的数据进行操作
1
2
3
4
5
6
7
8
9存(向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);
1
2
3
4
5
6//准备数据 //单独创建一个类 public class User { private String name; private String password; --------下面构造方法等代码省略--------
1
2
3
4
5
6
7
8
9---------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协议更便捷。
但是需要知道它的继承结构:
1
2
3
4jakarta.servlet.Servlet(接口)【父亲】 jakarta.servlet.GenericServlet implements Servlet(抽象类)【儿子】 jakarta.servlet.http.HttpServlet extends GenericServlet(抽象类)【孙子】 以后编写的Servlet要继承HttpServlet类。
最后
以上就是俊秀缘分最近收集整理的关于ServletContext的全部内容,更多相关ServletContext内容请搜索靠谱客的其他文章。
发表评论 取消回复