ServletConfig
ServletConfig:代表当前Servlet在web.xml中的配置信息(不常用到,了解即可)。
ServletConfig是servlet配置文件在内存中的表现。
比如我们使用Dynamic Web project 2.5版本新建一个项目,就可以在文章目录下找到web.xml文件,一个项目只有一份。在web.xml配置文件中我们可以使用一个或者多个< init-param >标签为servlet配置一些初始化参数。当服务器(tomcat)实例化Servlet时,会根据servlet配置信息调用init方法创建ServletConfig对象,并将之传递给servlet。那么我们就可以通过ServletConfig对象拿到当前servlet的初始化参数信息。
常用方法
返回值类型 | 方法名 | 解释 |
---|---|---|
java.lang.String | getInitParameter(java.lang.String name) | 返回一个包含给定名字的初始化参数,若此参数不存在就返回一个空值。 |
java.util.Enumeration | getInitParameterNames() | 返回context的初始化参数的名字 ,用一个字符串对象枚举变量的形式。如果相应的context没有初始化参数,则就返回一个空的枚举变量。 |
java.lang.String | getServletName() | 返回该servlet实例的名称。 |
方法演示
新建一个ConfigTestServlet,在web.xml文件中的< serblet >标签下,通过使用<init-param>
标签来处理中文乱码,同时加上用户名和密码初始化属性:
<servlet>
<description></description>
<display-name>ConfigTestServlet</display-name>
<servlet-name>ConfigTestServlet</servlet-name>
<servlet-class>com.xx.configtest.ConfigTestServlet</servlet-class>
<!--处理中文乱码-->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<!-- 配置用户名和密码 -->
<init-param>
<param-name>name</param-name>
<param-value>Lucy</param-value>
</init-param>
<init-param>
<param-name>pwd</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ConfigTestServlet</servlet-name>
<url-pattern>/ConfigTestServlet</url-pattern>
</servlet-mapping>
然后我们就可以在代码中获取上面的来个参数:
package com.xx.configtest;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ConfigTestServlet
*/
public class ConfigTestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ConfigTestServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 拿到init方法中的config对象 <关键>
ServletConfig config = this.getServletConfig();
// 获取当前Servlet中配置的初始化参数(只能获取一个)
String encodingValue = config.getInitParameter("encoding");
// 处理响应中文乱码
response.setContentType("text/html;charset=" + encodingValue);
// 打印一句中文试试:
response.getWriter().println("处理了响应乱码<br/>");
// 获取当前Servlet的名称
String serveltName = config.getServletName();
response.getWriter().println("当前servlet的名称是" + serveltName);
// 获取当前Servlet中配置的初始化参数(可以获取多个)
Enumeration<String> enumeration = config.getInitParameterNames();
// 遍历
while (enumeration.hasMoreElements()) {
String name = (String) enumeration.nextElement();
String value = config.getInitParameter(name);
response.getWriter().println("<br/>name=" + name + " value=" + value);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
// 程序运行结果
处理了响应乱码
当前servlet的名称是ConfigTestServlet
name=name value=Lucy
name=encoding value=utf-8
name=pwd value=123456
不难发现,我们在Servlet的配置文件中,使用一个或者多个< init-param >标签为servlet配置一些初始化参数,这样做的好处是:我们可以将一些敏感信息或者后续需要修改的信息放在这里,可以通过更改配置文件来达到我们的需要,而不用去修改源代码。
但是,这个方式相当麻烦,这也就意味着你需要在每个servelt的配置信息中添加初始化参数,如果我想要配置一些全局初始化参数怎么办呢?
ServletContext
ServletContext表示一个WEB应用。
ServletContext是web.xml文件在内存中的表示。
ServletContext和web.xml一一对应。
WEB容器启动时,它会为每一个web应用程序创建一个对应的ServletContext对象,它就代表当前的web应用。由于一个WEB应用中所有的Servlet共享一个ServletContext对象,可以用它来设置一些全局初始化参数。ServletContext对象通常也被称为context域对象。
- 域对象:在一个可以被看见的范围内共享数据用到的对象。
- 作用范围:整个web应用范围内
- 声命周期:当服务器启动web应用加载后创建出ServletContext对象后,域产生。当web婴童被移除出容器或者服务器关闭,随着web应用的销毁,域销毁。
案例演示
现在我们来尝试通过在web.xml文件中配置全局初始化参数来结局中文乱码问题:
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。你也可以直接this.getServletContext可以起到同样的作用。
<context-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</context-param>
测试:
package com.xx.contexttext;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ContextTestServlet
*/
public class ContextTestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ContextTestServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取Context对象
ServletContext context = this.getServletContext();
// 获取初始化参数
String encoding = context.getInitParameter("encoding");
// 处理中文乱码
response.setContentType("text/html;charset=" + encoding);
// 测试
response.getWriter().println("通过context处理中文乱码");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
这种用法与在servlet标签中设置配置初始化参数类似,不同的是通过context设置的初始化参数可以在所有的servlet里面拿到,当然,你也可以设置多个全局初始化参数,然后通过getInitParameterNames()拿到所有初始化参数遍历。
下面我们来看看context作为域对象的用法,可以像map集合一样,以键值对的形式存储数据。
// ServletContext作为域对象存储键和值
context.setAttribute("name", "Bob");
context.setAttribute("password", "123456");
// 获取单个
String name = (String) context.getAttribute("name");
response.getWriter().println("name=" + name);
String password = (String) context.getAttribute("password");
response.getWriter().println("password=" + password);
// 移除
context.removeAttribute("name");
String remove_name = (String) context.getAttribute("name");
response.getWriter().println("remove_name=" + remove_name);