一.ServletConfig
1.概述
ServletConfig
是 Java Servlet 规范中的一个接口,它为 Servlet 提供了初始化信息 。当 Servlet 容器(如 Tomcat)创建一个 Servlet 实例时,它会传递一个 ServletConfig
对象给 Servlet 的 init
方法 。ServletConfig
对象包含了 Servlet 配置信息,这些信息主要来自于 Web 应用的部署描述符(web.xml
文件)。
java
public interface ServletConfig {
String getServletName();
ServletContext getServletContext();
String getInitParameter(String var1);
Enumeration<String> getInitParameterNames();
}
总结:
- 为Servlet提供初始配置参数的一种对象,每个Servlet都有自己独立唯一的ServletConfig对象
- 容器会为每个Servlet实例化一个ServletConfig对象,并通过Servlet生命周期的init方法传入给Servlet作为属性
2.配置文件
我们可以在web.xml
文件为Servlet配置相关信息,如初始化参数(执行init
会使用),映射路径等信息。
xml
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
<init-param>
<param-name>dbUrl</param-name>
<param-value>jdbc:mysql://localhost:3306/mydb</param-value>
</init-param>
<init-param>
<param-name>dbUser</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>dbPassword</param-name>
<param-value>password</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
当然也可以用注解@WebServlet
来进行配置
java
@WebServlet(value="/myServlet",initParams = {@WebInitParam(name="dbUser",value = "root"),@WebInitParam(name="dbPassword",value = "password")})
根据@WebServlet注解中的WebInitParam[] initParams() default {}
可知,我们需要传递一个WebInitParam
类型,而WebInitParam
实际上是一个注解,如下
java
public @interface WebInitParam {
String name();
String value();
String description() default "";
}
3.具体使用
ServletConfig接口中有如下几个方法
方法名 | 作用 |
---|---|
getServletName() | 获取在标签中定义的Servlet名称 |
getServletContext() | 获取ServletContext对象 |
getInitParameter() | 获取配置Servlet时设置的『初始化参数』,根据名字获取值 |
getInitParameterNames() | 获取所有初始化参数名组成的Enumeration对象 |
例子
java
@WebServlet(value = "/s1",initParams = {@WebInitParam(name="key",value = "value1")})
public class UserServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取ServletConfig对象,这个方法在父类HttpServlet中定义
ServletConfig servletConfig = getServletConfig();
//获取所有的参数名,放到Enumeration对象中(相当于一个迭代器,可以依次遍历其中的值)
Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
//这个方法是判断是否有下一个,相当于游标
while (initParameterNames.hasMoreElements()) {
//取出下一个的值
String s = initParameterNames.nextElement();
System.out.println(servletConfig.getInitParameter(s));
}
}
}
二.ServletContext
1.概述
ServletContext
是 Java Servlet 规范中的一个重要接口,它代表了整个 Web 应用的上下文环境。每个 Web 应用在启动时都会有一个唯一 的 ServletContext
实例,该实例在整个应用的生命周期内都是有效的。
ServletContext代表应用,所以ServletContext域也叫作应用域,是webapp中最大的域,可以在本应用内实现数据的共享和传递
ServletContext
提供了多种功能,使得 Servlet 和 JSP 页面能够访问 Web 应用的全局信息、配置参数以及共享数据。如:
- 获取初始化参数
- 获取资源
- 属性管理
- 访问 Web 应用的信息
- 日志记录
2.相关配置
我们可以在web.xml
文件中进行配置
xml
<context-param>
<param-name>username</param-name>
<param-value>zhangsan</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</context-param>
所有的Servlet对象都可以通过ServletContext
对象访问该数据,且整个web应用只有一个ServletContext
的实例。
3.常用API介绍
-
获取资源的真实路径
javaString realPath = servletContext.getRealPath("资源在web目录中的路径");
-
获取项目的上下文路径
javaString contextPath = servletContext.getContextPath();
-
通过域进行数据共享
javavoid setAttribute(String key,Object value); //向域中存储/修改数据 Object getAttribute(String key); //获得域中的数据 void removeAttribute(String key); //移除域中的数据
三.注意事项
每个Servlet
对象都有一个专有的ServletConfig
对象,而所有Servlet
对象共用一个ServletContext
对象。