ServletContext:解释为servlet的上下文,当项目部署到服务器的时候,服务器会为这个项目创建一个对象,而这个对象就是ServletContext对象,并且这个对象是全局唯一的,而且所有的servlet都共享这个对象。可以理解为全局程序共享对象。 从图中就可以很清晰看出,并不是一个servlet对应一个servletContext,而是一整个项目只有一个servletContext。
上表可以看做是从小到大排序,也就是说servletContext是四大域对象中最大的一个域对象。
可以值只要你的服务器不宕机,servletContext就一直存在。
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")第一种:request获取servletContext
ServletContext servletContext = request.getServletContext()第二种:使用ContextLoader
ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext()第三种:使用spring注入自动注入
@Autowired private ServletContext servletContext;因为存在ServletContext中的数据在服务器中会长时间,这样就会占用很多内存,因此在使用ServletContext时,建议不要往里面添加过大的数据!土豪随意~
本文的参考博文: 1.https://blog.csdn.net/qq_36371449/article/details/80314024 2. https://www.w3cschool.cn/servlet/servlet-3ceg2p0t.html