ServletContext
- ServletContext 是一个容器(域对象),可以存储键值对数据
(String key, Object value)
,保存在 ServletContext 中的数据不仅可以提供给所有的 Servlet 使用,而且可以在整个项目范围内使用(后期的过滤器、监听器也可以使用 ServletContext)。 - ServletContext 的主要作用有 3 个:
- 作为域对象;
- 可以获取当前应用下任何路径下的任何资源;
- 获取初始化参数。
1. ServletContext 作为域对象
- ServletContext 是一个域对象, 域存储数据都是
setAttribute(key, value)
,也是键值对的形式存在,所以说和 map 很像。 - ServletContext 中定义了很多方法,在 JavaWeb 中最常用的就是将 ServletContext 作为容器(域对象)使用。下面将介绍这个容器(域对象)的API。
a. API 介绍
- GenericServlet:
ServletContext getServletContext() 获取ServletContext对象
- 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. 演示代码
- ServletContextServlet1:
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", "广州");
}
}
- 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;
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);
}
}
- web.xml:
<?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>
- 先访问 http://localhost:8080/webappPractice/context1,再访问 http://localhost:8080/webappPractice/context2 可得到以下输出结果:
- 由此可知,保存在 ServletContext 中的数据是项目全局共享的数据。
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 {
//1.先获取全局管理者--ServletContext对象
ServletContext servletContext = getServletContext();
//2.获取WEB项目的资源文件路径
String path = servletContext.getRealPath("/文件名");
System.out.println(path);
//3.根据WEB项目的文件获取流
InputStream is = servletContext.getResourceAsStream("/文件名");
System.out.println(is);
}
}
- 依次访问 http://localhost:8080/webappPractice/context1 和 http://localhost:8080/webappPractice/context2,得到以下输出结果:
- 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;
/*** 获取当前项目环境中配置的参数值 * http://localhost:8080/webappPractice/context */
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");
//取出项目环境对象中的参数contentType的值
System.out.println("contentType = " + contentType);
ServletConfig servletConfig = this.getServletConfig();//获取当前Servlet配置对象
String myParam = servletConfig.getInitParameter("myParam");
//取出当前Servlet配置对象中的参数值
System.out.println("ConfigServlet myParam = " + myParam);//null
}
}
- 访问 http://localhost:8080/webappPractice/context,Console 输出:
4. ServletConfig 配置 Servlet 初始化参数
- ServletConfig 表示当前 Servlet 的配置,从这个对象中可以获取 web.xml 中当前 Servlet 自己配置的当前 Servlet 初始化参数
a. 使用步骤
- 给一个 Servlet 配置初始化参数值;
- 在该 Servlet 中获取参数值。
b. 演示代码
- 给一个 Servlet 配置初始化参数值
<!-- 演示当前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;
/*** 获取当前Servlet中配置的参数值 * http://localhost:8080/webappPractice/config */
public class ConfigServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletConfig servletConfig = this.getServletConfig();
//获取当前Servlet配置对象
String myParam = servletConfig.getInitParameter("myParam");
//取出当前Servlet配置对象中的参数值
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. 实现
- CountServlet:
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 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);
}
}
- ShowServlet:
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 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);
}
}
- 配置 web.xml:
<?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
转载:https://blog.csdn.net/Regino/article/details/105502335
查看评论