ServletConfig和ServletContext
1.ServletConfig
javax.servlet.ServletConfig的一个接口。
ServletConfig是servlet配置对象,该对象在初始化时将信息传递给servlet,一个servlet对象对应一个servletconfig对象,100个servlet对象对应100个servletconfig对象。
在doGet或者doPost方法中可以直接获取ServletConfig对象:
ServletConfig config = getServletConfig();
其主要有四个方法:以下例子会涉及到
先准备两个servlet类并且配置好web.xml
web.xml:在servlet标签中配置config的信息
<!-- Servlet03-->
<servlet>
<servlet-name>servlet03</servlet-name>
<servlet-class>com.dh.servlet.Servlet03</servlet-class>
<!-- 在servlet标签中配置config的信息-->
<init-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</init-param>
<!-- 可配置多个-->
<init-param>
<param-name>age</param-name>
<param-value>18</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servlet03</servlet-name>
<url-pattern>/servlet03</url-pattern>
</servlet-mapping>
<!-- Servlet04-->
<servlet>
<servlet-name>servlet04</servlet-name>
<servlet-class>com.dh.servlet.Servlet03</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>lisi</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>20</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servlet04</servlet-name>
<url-pattern>/servlet04</url-pattern>
</servlet-mapping>
servlet类:
Servlet03:(Servlet04所有的代码都一致,所以不在此粘贴代码)
package com.dh.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;
import java.util.Enumeration;
public class Servlet03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取servletConfig
ServletConfig config = getServletConfig();
System.out.println("servlet03:"+config);
//获取servlet的名字
System.out.println(config.getServletName());
//获取web.xml中配置的指定参数的值
String value = config.getInitParameter("name");
System.out.println(value);
//获取web.xml中配置的参数的所有name
Enumeration<String> names = config.getInitParameterNames();
while (names.hasMoreElements()){
System.out.println(names.nextElement());
}
}
}
测试:
启动服务器先请求http://localhost:8080/servlet_01_javaweb/servlet03,再请求http://localhost:8080/servlet_01_javaweb/servlet04
servlet03:org.apache.catalina.core.StandardWrapperFacade@14f8b464
servlet03
zhangsan
name
age
----------------------------------------------------------------(手动加的分隔符)
servlet04:org.apache.catalina.core.StandardWrapperFacade@2ab0b564
servlet04
lisi
name
age
可以验证结果,每个servlet对象都有一个对应的servletconfig对象。
2.ServletContext
是一个接口。
ServletContext是上下文对象,对应的是web.xml文件,一个webapp只有一个ServletContext对象。所以同一个webapp中的servlet对象共享一个ServletContext对象,所以servletcontext对象也可以看作是所有servlet对象的四周环境的代表。
服务器启动时实例化ServletContext对象,关闭服务器时销毁ServletContext对象。
所以,ServletContext可以在同一个webapp中跨用户存取数据,即想要每个用户都能访问的数据就放在servletcontext对象中。
(一般放在servletcontext中的数据不建议多线程共享,因为修改就会有线程安全问题)
ServletContext接口中有很多的方法,常用的为以下六个:
web.xml:
<!-- 配置context属性,可配置多个-->
<context-param>
<param-name>name</param-name>
<param-value>Jerry</param-value>
</context-param>
<!-- Servlet05-->
<servlet>
<servlet-name>servlet05</servlet-name>
<servlet-class>com.dh.servlet.Servlet05</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet05</servlet-name>
<url-pattern>/servlet05</url-pattern>
</servlet-mapping>
<!-- Servlet06-->
<servlet>
<servlet-name>servlet06</servlet-name>
<servlet-class>com.dh.servlet.Servlet06</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet06</servlet-name>
<url-pattern>/servlet06</url-pattern>
</servlet-mapping>
Servlet05:存数据及移除数据
package com.dh.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;
import java.util.Enumeration;
public class Servlet05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//两种获取ServletConfig对象的方法
//1.ServletConfig中包含ServletConfig对象,通过ServletConfig获取
ServletConfig config = getServletConfig();
ServletContext servletContext = config.getServletContext();
//2.直接获取ServletConfig对象
ServletContext context = getServletContext();
//输出
System.out.println(context);
//获取web.xml的配置信息中指定属性的值
String value = context.getInitParameter("name");
System.out.println(value);
//获取web.xml配置信息中的所有属性名
Enumeration<String> names = context.getInitParameterNames();
while (names.hasMoreElements()){
System.out.println(names.nextElement());
}
//往域对象中存数据
context.setAttribute("class1","1");
context.setAttribute("class2","2");
//取域对象中的数据
System.out.println(context.getAttribute("class1"));
//移除域对象中的数据
context.removeAttribute("class2");
}
}
servlet06:取数据
package com.dh.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;
import java.util.Enumeration;
public class Servlet06 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletConfig对象
ServletContext context = getServletContext();
System.out.println("-------------------------------------");
//输出
System.out.println(context);
//获取web.xml的配置信息中指定属性的值
String value = context.getInitParameter("name");
System.out.println(value);
//获取web.xml配置信息中的所有属性名
Enumeration<String> names = context.getInitParameterNames();
while (names.hasMoreElements()){
System.out.println(names.nextElement());
}
//取域对象中的数据
System.out.println(context.getAttribute("class1"));
System.out.println(context.getAttribute("class2"));
}
}
先执行http://localhost:8080/servlet_01_javaweb/servlet05,再执行http://localhost:8080/servlet_01_javaweb/servlet06
测试结果:
org.apache.catalina.core.ApplicationContextFacade@4b1e4a38
Jerry
name
1
-------------------------------------
org.apache.catalina.core.ApplicationContextFacade@4b1e4a38
Jerry
name
1
null
可以看到,不同的servlet对象共享一个ServletContext对象,也都能取到web.xml中配置的全局属性,存在ServletContext域对象中的数据也是共享的。
ServletContext还有两个常用的方法,一个通过相对路径获取文件的绝对路径,一个获取当前的项目名:
//获取项目的绝对路径
System.out.println(context.getRealPath(""));
System.out.println(context.getRealPath("/"));
//C:\Users\DH\Desktop\java\Tomcat服务器\Tomcat服务器\windows x64\apache-tomcat-8.5.16-windows-x64\apache-tomcat-8.5.16\webapps\servlet_01_javaweb\
System.out.println(context.getRealPath("/WEB-INF/web.xml"));
//C:\Users\DH\Desktop\java\Tomcat服务器\Tomcat服务器\windows x64\apache-tomcat-8.5.16-windows-x64\apache-tomcat-8.5.16\webapps\servlet_01_javaweb\WEB-INF\web.xml
System.out.println(context.getRealPath("index.jsp"));
//C:\Users\DH\Desktop\java\Tomcat服务器\Tomcat服务器\windows x64\apache-tomcat-8.5.16-windows-x64\apache-tomcat-8.5.16\webapps\servlet_01_javaweb\index.jsp
//获取当前的项目名
System.out.println(context.getContextPath());
//结果:/servlet_01_javaweb