ServletContext和ServletConfig
Servlet系列ServletContext和ServletConfig:
不同用户数据共享怎么办?
ServletContext:
运行在JVM上的每一个web应用程序都有一个与之对应的Servlet上下文(Servlet运行环境)
Servlet API提供ServletContext接口用来表示Servlet上下文,ServletContext对象可以被web应用程序中的所有servlet访问
ServletContext对象是web服务器中的一个已知路径的根
原理:
ServletContext对象由服务器进行创建,一个项目只有一个对象。不管在项目的任意位置进行获取得到的都是同一个对象,那么不同用户发起的请求获取到的也就是同一个对象了,该对象由用户共同拥有。
api:
代码:
package com.wp.controller;/*
*@author wupeng
*@time 2021/6/22-21:44
ServletContext:用来解决不同用户的数据共享问题
特点:
1.由服务器创建,
2.所有用户共享同一个ServletContext中的属性
3.所有的servlet都可以访问到用一个ServletContext中的属性
4.每一个wen项目对应的是一个ServletContext
用法:
获取ServletContext对象三种方式
向ServletContext中设置属性值
其他用途:
1.获取web.xml中配置的公共属性
在web中添加公共属性,
如果有多组公共属性,使用多个Context-param
2.获取项目的虚拟目录路径
3.获取某个资源的绝对路径
*/
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/context")
public class ServletContextServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("gbk");
//获取ServletContext对象 三种获取方式
//1
ServletContext context = this.getServletContext();
//2
ServletContext context1 = this.getServletConfig().getServletContext();
//3
ServletContext context2 = req.getSession().getServletContext();
System.out.println(context==context1);
System.out.println(context==context2); //结果显示三者获取的是同一个对象
// 设置属性值
context.setAttribute("111","张三");
// 1.获取web.xml中配置的公共属性
String beijing = context.getInitParameter("beijing");
System.out.println(beijing);
//获取某个文件的绝对路径
String realPath = context.getRealPath("web.xml");
System.out.println(realPath);
// 获取web程序的上下文路径
String contextPath = context.getContextPath();
System.out.println(contextPath);
}
}
案例:网站计数器
package com.wp.controller;/*
*@author wupeng
*@time 2021/6/22-22:07
*/
import javax.servlet.HttpConstraintElement;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/num")
public class NumServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("utf-8");
//获取ServletContext对象
ServletContext context = this.getServletContext();
//获取属性值
Integer num = (Integer) context.getAttribute("num");
if(num == null) {
context.setAttribute("num",1);
} else {
num++;
//实现每次访问+1
//将num设置servletcontext中
context.setAttribute("num",num);
}
//获取输出对象
resp.getWriter().write("用户访问的次数是:"+context.getAttribute("num"));
}
}
ServletConfig:
作用:ServletConfig对象是Servlet的专属配置对象,每个Servlet都单独拥有一个ServletConfig对象,用来获取web.xml中的配置信息
使用:
获取ServletConfig对象
获取web.xml中的servlet配置信息
package com.wp.controller;/*
*@author wupeng
*@time 2021/6/22-22:17
ServletConfig:
作用:方便每一个Servlet获取自己的单独的属性配置
特点:每一个Servlet单独用有一个ServletConfig对象
使用:
获取值
获取所有的key值
*/
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
public class ServletConfigServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("gbk");
//获取对象
ServletConfig config = this.getServletConfig();
String china = config.getInitParameter("china");
System.out.println(china);
//获取所有的key
Enumeration<String> names = config.getInitParameterNames();
while(names.hasMoreElements()) {
String s = names.nextElement();
String initParameter = config.getInitParameter(s);
System.out.println(initParameter);
}
}
}
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">
<context-param>
<param-name>beijing</param-name>
<param-value>butiful</param-value>
</context-param>
<servlet>
<servlet-name>ServletConfig</servlet-name>
<servlet-class>com.wp.controller.ServletConfigServlet</servlet-class>
<init-param>
<param-name>china</param-name>
<param-value>beijing</param-value>
</init-param>
<init-param>
<param-name>hebei</param-name>
<param-value>shijiazhaung</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletConfig</servlet-name>
<url-pattern>/config</url-pattern>
</servlet-mapping>
</web-app>