ServletContext初步理解笔记
ServletContext:
解释为servlet
的上下文,当项目部署到服务器的时候,服务器会为这个项目创建一个对象,而这个对象就是ServletContext
对象,并且这个对象是全局唯一的,而且所有的servlet都共享这个对象。可以理解为全局程序共享对象。
从图中就可以很清晰看出,并不是一个servlet对应一个servletContext,而是一整个项目只有一个servletContext。
1.1 四大域对象
域对象 | 范围 | 具体类 |
---|---|---|
page | 仅在jsp中有效 | page域:pageContext |
request | 一次请求 | request域: HttpServletContext |
session | 一次会话 | session域: HttpSession |
application | 整个web应用 | application域:ServletContext |
上表可以看做是从小到大排序,也就是说servletContext是四大域对象中最大的一个域对象。
1.2 声明周期
可以值只要你的服务器不宕机,servletContext就一直存在。
1.3 常用方法
setAttribute()
getAttribute()
getAttributeNames()
removeAttribute()
1.4 应用方法
1.实现数据之间的共享
通过ServletContext 对象,可以实现数据共享,类似于session,但是session只能在一个客户端中共享数据,但是servletContext中的数据是在所有客户端中都可以实现实现数据共享。
2.实现请求转发
我们都知道request可以实现转发,同样的道理,同样作为域对象的servletContext也可以实现转发
this.getServletContext().getRequestDispatcher("xxx").forward(request, response);
3. 利用ServletContext对象读取资源文件(比如properties文件)
读取资源文件要根据资源文件的位置所决定,一般分为两种情况:
3.1 web应用的根目录(WebRoot文件夹)
在web应用的根目录里下面,就可以使用servletContext来读取文件,假设我们Web根目录下有一个配置数据库信息的db.properties文件,里面配置了name和password属性,这时候可以通过ServletContext去读取这个文件:
// 这种方法的默认读取路径就是Web应用的根目录,以流的方式读取
InputStream stream = this.getServletContext().getResourceAsStream("dbinfo.properties");
// 创建属性对象
Properties properties = new Properties();
// 以流的方式加载
properties.load(stream);
// 根据key,value的方式获取参数
String name = properties.getProperty("name");
String password = properties.getProperty("password");
out.println("name="+name+";password="+password);
如果图片放在web应用的根路径下面,也就是说webroot文件下面有一个img的文件里面有一张test.jpg的图片,可以得到这个图片的全路径:
// 如何读取到一个文件的全路径,这里会得到在Tomcat的全路径
String path = this.getServletContext().getRealPath("/img/test.jpg");
3.2 放在src目录下面
放在src目录下面的文件,不能用servletContext来读取,必须使用类加载器去读取。(因为项目部署以war包的形式部署到服务器,里面只有.class文件,没有.java文件)
// 类加载器的默认读取路径是src根目录
InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("dbinfo.properties")
如果文件没有在src目录下面,必须加上包下的相对路径
InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("com/gavin/dbinfo.properties")
1.5 通常在spring项目中获取servletContext有以下方式
第一种:request获取servletContext
ServletContext servletContext = request.getServletContext()
第二种:使用ContextLoader
ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext()
第三种:使用spring注入自动注入
@Autowired
private ServletContext servletContext;
ServletContext使用建议
因为存在ServletContext中的数据在服务器中会长时间,这样就会占用很多内存,因此在使用ServletContext时,建议不要往里面添加过大的数据!土豪随意~
本文的参考博文:
1.https://blog.youkuaiyun.com/qq_36371449/article/details/80314024
2. https://www.w3cschool.cn/servlet/servlet-3ceg2p0t.html