ServletContext简介
ServletContext是一个全局的储存信息的空间,服务器开始就存在,服务器关闭才释放。这个ServletContext是所有Servlet所共享的,作用范围是整个服务器。
WEB容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext,它代表当前Web应用,并且它被所有客户端共享。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
当web应用关闭、Tomcat关闭或者Web应用reload的时候,ServletContext对象会被销毁
ServletContext有2种获取方式,分别是
我们查看下源码
发现第二种获取方法就是和第一个一样的,无论使用哪种都行。
ServletContext主要有以下作用
- 读取web.xml中配置的上下文参数,context-param,这个是属于所有Servlet共享的,而不是某个Servlet单独的
- 获取当前工程路径
- 获取工程部署服务器后的绝对路径
- 像Map一样进行全局的数据存储,多个Servlet共享数据
ServletContext使用
我们这里使用ServletContext的全局共享数据的特性,我们来做一个网址访问计数器,原理就是在ServletContext中设置一个全局的参数,每个Servlet被访问时,都将这个参数+1。我们创建2个Servlet进行测试。并且提取了一个静态方法。代码如下
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/test01")
public class ServletTest01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取ServletContext
ServletContext servletContext = this.getServletContext();
//得到全局参数count
Integer count = ServletUtils.getTotalVisitCount(servletContext);
//设置MIME和编码
response.setContentType("text/html;charset=utf-8");
//获取输出流
PrintWriter writer = response.getWriter();
//像游览器写出内容
writer.write("我是Servlet01,<h1>服务器一共被访问"+count+"次</h1>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/test02")
public class ServletTest02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取ServletContext
ServletContext servletContext = this.getServletContext();
//得到全局参数count
Integer count = ServletUtils.getTotalVisitCount(servletContext);
//设置MIME和编码
response.setContentType("text/html;charset=utf-8");
//获取输出流
PrintWriter writer = response.getWriter();
//像游览器写出内容
writer.write("我是Servlet02,<h1>服务器一共被访问"+count+"次</h1>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
import javax.servlet.ServletContext;
public class ServletUtils {
public static Integer getTotalVisitCount(ServletContext servletContext) {
//得到全局参数count
Object count = servletContext.getAttribute("count");
//判读count是否存在,存在就+1,否则创建count。
if (count != null) {
servletContext.setAttribute("count", (Integer) count + 1);
count = (Integer)count + 1;
} else {
servletContext.setAttribute("count", 1);
count = 1;
}
return (Integer) count;
}
}
我们启动服务器分别访问/test01和/test02,看网页输出情况
我们先后访问2个不同的Servlet,发现确实已经实现网址统计的功能,我们多刷新一下试试
我们发现确实每次刷新都会增多,到此我们已经实现了该功能,ServletContext可以做的功能很多,当我们需要使用到全局属性时使用ServletContex就行了,我们看下ServletContext的方法名其实就能把功能猜的差不多,不会时网上搜索对应的教程就行了,如果想深入理解,那么就看源码吧!!!
ServletContext方法非常多,上面是一部分,基本可以满足我们所有需求。最后,我们必须记住ServletContext是全局共享的!!!