1、什么是ServletContext
ServletContext是一个全局储存空间,随服务器的生命周期变化,
Cookie,Session,ServletContext的区别
Cookie: 存在于客户端的本地文本文件
Session: 存在于服务器的文本文件,一个客户端有唯一session
ServletContext: 存在于服务器,并开辟一块服务器区域,可以被所有客户端访问。
ServletContext对象通常也被称为context域对象。
Servlet对象之间可以通过ServlertContext对象来实现通讯。
当WEB容器在启动时,为每个Web应用程序都创建一个对应的ServletContext,它代表当前Web应用并且它被所有客户端共享。
我们可以拓展场景,通常在咨询网站浏览时,会有客服弹窗,这就可以基于ServletContext进行通讯。
当web应用关闭、Tomcat关闭或者Web应用reload的时候,ServletContext对象会被销毁。【即关闭浏览器客户端】
2、ServletContext使用方法
- 获取ServletContext对象
//直接调取ServletContext对象
this.getServletContext();
//通过ServletConfig对象,调取ServletContext对象
this.getServletConfig().getServletContext();
ServletContext对象的结构
名字(String) | 值(Object) |
---|---|
操作方法
添加属性:boolean setAttribute(String name,Object obj)
得到值:Object getAttribute(String name)
删除属性:boolean removeAttribute(String name)
生命周期
ServletContext中的生命周期从创建开始,到服务器关闭结束。
使用实例
1.分别创建两个Servlet对象
servlet1.java
public class servlet1 extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
ServletContext servletContext = this.getServletContext();
//ServletContext servletCOntext = this.getServletConfig().getServletContext();
servletContext.setAttribute("name","小明");
out.println("将 name = " + servletContext.getAttribute("name")+"写入ServletContext");
}
}
servlet2.java
public class servlet2 extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
ServletContext servletContext = this.getServletContext();
//ServletContext servletCOntext = this.getServletConfig().getServletContext();
String name = servletContext.getAttribute("name");
out.println("name = " + name);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>servlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>servlet2</servlet-name>
<servlet-class>servlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet2</servlet-name>
<url-pattern>/servlet2</url-pattern>
</servlet-mapping>
</web-app>
效果图
chrom浏览器
QQ浏览器
3、ServletContext应用
- 多Servlet对象共享数据
- 实现Servlet的请求转发
两种请求转发方法:
request对象转发
request.getRequestDispatcher("转发目的路径").forward(reqeust,response);
ServletContext实现请求转发
this.getServletContext().getRequestDispatcher("转发目的路径").forwaard(request,response);
配置Web应用初始化
<!--
init-param标签用于servlet配置初始化参数,通过ServletConfig对象获取参数
-->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>MyServlet</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
获取初始化参数
String encoding = this.getServletConfig().getInitParameter("encoding");
配置Servlet全局配置
<context-param>
<param-name>name</param-name>
<param-value>gavin</param-value>
</context-param>
4、利用ServletContext对象读取资源文件(比如properties文件)
读取资源文件要根据资源文件所在位置决定,有两种情况:
4.1 文件在WebRoot文件夹下,即Web应用的根目录。
假设Web根目录下【web文件夹下】有一个配置数据库信息的dbinfo.properties文件,配置了name和password属性,通过ServletContext读取文件:
//这种方法默认读取路径为Web应用的根目录
InputStream stream = this.getServletContext().getResourceAsStream("dbinfo.properties");
// 创建属性对象
Properties properties = new Properties();
properties.load(stream);
String name = properties.getProperty("name");
String password = properties.getProperty("password");
out.println("name="+name+";password="+password);
dbinfo.properties
name=root
password=root
**4.2 文件放置在src目录下 **
这时需要使用类加载器,其默认加载src根目录
InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("dbinfo.properties");
若文件放置在src的子文件夹中,则加载方式为
InputStream inputStream = MyServlet.class.getClassLoader().getResourceAsStream("com/properties/dbinfo.properties");
注意: ServletContext只有在读取web应用根目录下的文件,才能获取文件的全路径。
String path = this.getServletContext().getRealPath("/images/Servlet.jpg");
网站开发中的功能模块应用
网站计数器,网站在线用户显示,聊天系统等功能
若涉及不同用户共享数据,且数据量不打,且不希望占用数据库内存,可以考虑使用ServletContext实现。