我是靠谱客的博主 俊秀缘分,这篇文章主要介绍ServletContext,现在分享给大家,希望可以做个参考。

复制代码
1
2
3
4
5
6
7
8
9
10
11
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对象

复制代码
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接口。

复制代码
1
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接口中有哪些常用的方法?

复制代码
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源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径。 

复制代码
1
public String getContextPath();
复制代码
1
2
3
4
5
6
//获取应用上下文的根路径 String contextPath = application.getContextPath(); out.print("应用上下文的根路径=" +contextPath + "<br>"); //应用上下文的根路径=/servlet04 // 获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径 // 在java源码当中,不要将应用的根路径写死,因为你永远都不知道这个应用在最终部署的时候,起一个什么名字。

 6.2.获取文件的绝对路径(真实路径)

复制代码
1
public 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
2
public void log(String message); public void log(String message, Throwable t);
复制代码
1
2
3
4
5
6
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应用域中的数据进行操作

复制代码
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
4
jakarta.servlet.Servlet(接口)【父亲】 jakarta.servlet.GenericServlet implements Servlet(抽象类)【儿子】 jakarta.servlet.http.HttpServlet extends GenericServlet(抽象类)【孙子】 以后编写的Servlet要继承HttpServlet类。

最后

以上就是俊秀缘分最近收集整理的关于ServletContext的全部内容,更多相关ServletContext内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部