ServletContext
- ServletContext 是一个容器(域对象),可以存储键值对数据
(String key, Object value)
,保存在 ServletContext 中的数据不仅可以提供给所有的 Servlet 使用,而且可以在整个项目范围内使用(后期的过滤器、监听器也可以使用 ServletContext)。
- ServletContext 的主要作用有 3 个:
- 作为域对象;
- 可以获取当前应用下任何路径下的任何资源;
- 获取初始化参数。
1. ServletContext 作为域对象
- ServletContext 是一个域对象, 域存储数据都是
setAttribute(key, value)
,也是键值对的形式存在,所以说和 map 很像。
- ServletContext 中定义了很多方法,在 JavaWeb 中最常用的就是将 ServletContext 作为容器(域对象)使用。下面将介绍这个容器(域对象)的API。
a. API 介绍
ServletContext getServletContext() 获取ServletContext对象
1. void setAttribute(String name, Object object) 往servletcontext容器中存入数据,name为数据名称,object为数据的值
2. Object getAttribute(String name) 从ServletContext中获取数据,根据指定的数据名称
3. void removeAttribute(String name) 从ServletContext中移除数据,根据指定的数据名称
b. 使用步骤
- 创建 ServletContextServlet1 和 ServletContextServlet2
- ServletContextServlet1 调用存方法
- ServletContextServlet2 调用取方法
- ServletContextServlet2 调用删方法
- ServletContextServlet2 调用取方法
c. 演示代码
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletContextServlet1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
context.setAttribute("addr", "广州");
}
}
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletContextServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
String addr = (String) context.getAttribute("addr");
System.out.println("存入之后,获取数据:" + addr);
context.removeAttribute("addr");
String addr2 = (String) context.getAttribute("addr");
System.out.println("移除之后,获取数据:" + addr2);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>ServletContextServlet1</servlet-name>
<servlet-class>ServletContextServlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletContextServlet1</servlet-name>
<url-pattern>/context1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletContextServlet2</servlet-name>
<servlet-class>ServletContextServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletContextServlet2</servlet-name>
<url-pattern>/context2</url-pattern>
</servlet-mapping>
</web-app>
2. ServletContext 获取当前应用下任何路径下的任何资源
a. 其它方法
1. getRealPath(String path) 获取WEB项目的资源文件路径
2. getResourceAsStream(String path) 根据WEB项目的文件获取流
3. getInitParameter(String name) 获取初始化参数
b. 演示代码
- 修改 ServletContextServlet2:
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
public class ServletContextServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = getServletContext();
String path = servletContext.getRealPath("/文件名");
System.out.println(path);
InputStream is = servletContext.getResourceAsStream("/文件名");
System.out.println(is);
}
}
- getResourceAsStream 获取资源文件的输入流,这里没有资源文件,所以输出的是 null。
3. ServletContext 获取初始化参数
a. 项目初始化参数
- ServletContext 表示当前项目环境,从这个对象中可以获取 web.xml 中配置的当前项目初始化参数。
b. 使用步骤
- 在 web.xml 中配置项目环境参数值;
- 在任意一个 Servlet 中取出当前项目环境参数值。
c. 演示代码
- 在 web.xml 中配置项目环境参数值
<context-param>
<param-name>contentType</param-name>
<param-value>text/html;charset=UTF-8</param-value>
</context-param>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>ContextServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>context</servlet-name>
<url-pattern>/context</url-pattern>
</servlet-mapping>
- 在任意一个 Servlet 中取出当前项目环境参数值
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ContextServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String contentType = servletContext.getInitParameter("contentType");
System.out.println("contentType = " + contentType);
ServletConfig servletConfig = this.getServletConfig();
String myParam = servletConfig.getInitParameter("myParam");
System.out.println("ConfigServlet myParam = " + myParam);
}
}
4. ServletConfig 配置 Servlet 初始化参数
- ServletConfig 表示当前 Servlet 的配置,从这个对象中可以获取 web.xml 中当前 Servlet 自己配置的当前 Servlet 初始化参数
a. 使用步骤
- 给一个 Servlet 配置初始化参数值;
- 在该 Servlet 中获取参数值。
b. 演示代码
- 给一个 Servlet 配置初始化参数值
<servlet>
<servlet-name>config</servlet-name>
<servlet-class>ConfigServlet</servlet-class>
<init-param>
<param-name>myParam</param-name>
<param-value>text/plain;charset=UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>config</servlet-name>
<url-pattern>/config</url-pattern>
</servlet-mapping>
- 在该 Servlet 中获取参数值
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ConfigServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletConfig servletConfig = this.getServletConfig();
String myParam = servletConfig.getInitParameter("myParam");
System.out.println("ServletConfig myParam = " + myParam);
}
}
5. 案例: 统计访问次数
a. 主要需求
- 有一个 Servlet(CountServlet),每访问一次这个 Servlet,将访问的次数 +1,当访问另一个 Servlet(ShowServlet)时,展示访问 CountServlet 的次数。
b. 分析
c. 步骤(pseudocode)
- 创建 2 个 Servlet(CountServlet, ShowServlet)
- CountServlet 中:
- 获取 ServltContext
- 从 ServletContext 中先获取一次数据
- 无:count=1
- 有:count=count+1
- 将加完的数据重新存取覆盖进去
- ShowServlet 中:
- 获取 ServltContext
- 从 ServletContext 中获取访问次数
- 无:告诉浏览器没有访问量
- 有:把访问量显示在浏览器上(response)
d. 实现
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CountServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = getServletContext();
Integer count = (Integer) servletContext.getAttribute("count");
if (count == null) {
count = 1;
} else {
count = count + 1;
}
servletContext.setAttribute("count", count);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ShowServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
ServletContext servletContext = getServletContext();
Object count = servletContext.getAttribute("count");
if (count == null) {
response.getWriter().print("该网站的访问量为:0");
} else {
response.getWriter().print("该网站的访问量为:" + count);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>CountServlet</servlet-name>
<servlet-class>CountServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CountServlet</servlet-name>
<url-pattern>/count</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ShowServlet</servlet-name>
<servlet-class>ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
</web-app>
- Web 服务器收到客户端的 HTTP 请求,会针对每一次请求分别创建一个用于代表请求的 request 对象和代表响应的 response 对象。如下图:
原文链接:https://qwert.blog.csdn.net/article/details/105502335