研究:javax.servlet.ServletContext接口
就说说以下这几个问题
1. ServletContext到底是什么?什么时候被创建?什么时候被销毁?一个web项目创建几个?
- ServletContext被翻译为:Servlet上下文【context一般都被翻译为上下文的意思】
- 一个webapp只有一个web.xml文件,web.xml文件在服务器启动阶段被解析
- 一个webapp只有一个ServletContext对象,ServletContext在服务器启动阶段被实例化
- ServletContext在服务器被关闭的时候被销毁
- 一个ServletContext对应的是web.xml文件,是web.xml文件的代表
- ServletContext是所有Servlet对象四周环境的代表【在同一个webapp中,所有Servlet对象共享一个“四周环境对象,这个对象就是ServletContext”】
- 所有用户若想共同一个数据,可以将这个数据放在ServletContext对象中
- 一般放到ServletContext对象的数据是不建议涉及到修改操作的,因为ServletContext是多线程共享的一个对象,修改的时候会存在线程安全问题。
2. ServletContext接口中有哪些常用的方法?
- void setAttribute(String name,Object object) :向servletContext范围中添加数据,类似map.set(key,value)
- Object getAttribute(String name) :从servletContext中获取数据 类似Object value = map.get(key)
- void removeAttribute(String name) :移除ServletContext范围中的数据
类似 map.remove(key)
上边的方法仔细一看是不是就是map集合?
String getInitParameter(String name)
Enumeration getInitparameterNames()
String getRealPath(String path)
3. servlet、ServletConfig、ServletContext之间的联系?
- 一个servlet对应一个ServletConfig,100个servlet对应一百个ServletConfig
- 所有的Servlet共享一个ServletConfig对象(关于这个你可以做一个实验,创建两个类Aservlet和Bservlet都实现Servlet接口,然后都调用getServletContext()方法,你会发现,得到的内存地址是一样的)
web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<!-- 定义初始化参数 (整个应用都可以共享的初始化参数)-->
<!-- web.xml文件中配置上下文参数,这些信息被自动封装到ServletContext中-->
<context-param>
<param-name>name</param-name>
<param-value>admin</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123</param-value>
</context-param>
<!-- 注册Servlet -->
<servlet>
<servlet-name>a</servlet-name>
<servlet-class>com.javaweb.servlet.Aservlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>a</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
<!-- 注册Servlet -->
<servlet>
<servlet-name>b</servlet-name>
<servlet-class>com.javaweb.servlet.Bservlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>b</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
</web-app>
常用方法1 String getInitParameter(String name)
就还是通过name获取value的形式
public void service(ServletResquest request,ServletResponse response)throws ServletException, IOException{
//获取servletConfig
ServletConfig config = getServletConfig();
//获取ServletContext
ServletContext application = config.getServletContext();
//out.print(application.toString());
//获取所有上下文初始化参数的name
application.getInitParameterNames
}
常用方法2 Enumeration getInitparameterNames()
跟ServletConfig下的 Enumeration getInitparameterNames()一样,具体使用方法不在这里赘述,使用方法点击 这里
常用方法3、4、5
void setAttribute(String name,Object object)
Object getAttribute(String name)
void removeAttribute(String name)
HTML文件
就俩超链接
点击BServlet的时候存储数据
点击AServlet的时候打印数据
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试ServletContext</title>
</head>
<body>
<a href = "/03-servletContext/some">AServlet</a>
<br><br>
<a href = "/03-servletContext/other">BServlet</a>
</body>
</html>
创建一个实体类User,生成set、get和toString方法即可
public class User {
private String usercode;
private String username;
public String getUsercode() {
return usercode;
}
public void setUsercode(String usercode) {
this.usercode = usercode;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User [usercode=" + usercode + ", username=" + username + "]";
}
AServlet类存储数据
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
// 获取ServletConfig
ServletConfig config = getServletConfig();
// 获取ServletContext
ServletContext application = config.getServletContext();
//创建User
User user = new User();
user.setUsercode("123");
user.setUsername("mayun");
//向ServletContext中存储数据
application.setAttribute("userObj", user);
}
BServlet类打印到浏览器
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
// 获取ServletContext
ServletContext application = config.getServletContext();
//从ServletContext范围中读取数据
Object obj = application.getAttribute("userObj");
//将ServletContext范围中获取的数据打印到浏览器
response.getWriter().print(obj);
}
结果就是如果你先点BServlet你就会得到一个null,因为你还没存储呢,要是先点AServlet再点BServlet就会得到你存储的数据了。