文章目录
ServletContest概述
一、提出问题
两个问题:
- 大家在访问某个网站的时候,往往都会看到网站的首页面显示您是第几位浏览者(网站计数器),这是怎么实现的?
- 我们在访问某个bbs网站的时候,往往会显示有多少人在线,这是怎么实现的?
可能我们会想到的常规实现思路:数据库或者文件。这种做法比较简单,但是却会对数据库或者文件访问过于频繁,开销比较大。
解决之道是用ServletContext
二、ServletContext概述
1、什么是ServletContext
你可以把它想象成一个公用的空间,可以被所有的客户访问,也就是说A客户端可以访问D,B客户端可以访问D,C客户端也可以访问D。
- WEB容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext,它代表当前Web应用。并且它被所有客户端共享。
- ServletContext对象可以通过
ServletConfig.getServletContext()方法
获得对ServletContext对象的引用,也可以通过this.getServletContext()方法
获得其对象的引用。 - 由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。公共聊天室就会用到它。
- 当web应用关闭、Tomcat关闭或者Web应用reload的时候,ServletContext对象会被销毁
2、怎么使用ServletContext
① 获取ServletContext对象
-
通过request对象获取:
request.getServletContext();
-
通过HttpServlet获取:
this.getServletContext();
② 域对象:共享数据
SetAttribute(String name, Object value);
向ServletContext中存数据getAttribute(String name);
从ServletContext中取数据removeAttribute(String name);
从ServletContext中移除数据
注:ServletContext对象范围:所有用户的数据
TestServlet_1
@WebServlet("/Servlet1")
public class TestServlet_1 extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 获取ServletContext对象的引用
// 第一种方法
ServletContext servletContext = this.getServletContext();
// 第二种方法
// ServletContext servletContext2 = this.getServletConfig().getServletContext();
servletContext.setAttribute("name", "小明");
out.println("将 name=小明 写入了ServletContext");
}
}
TestServlet_2
@WebServlet("/Servlet2")
public class TestServlet_2 extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException