JavaWeb——ServletConfig、ServletContext

本文详细介绍了ServletConfig和ServletContext在Web应用中的作用及使用方法,包括如何通过它们配置初始化参数来解决中文乱码等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.StringgetInitParameter(java.lang.String name)返回一个包含给定名字的初始化参数,若此参数不存在就返回一个空值。
java.util.EnumerationgetInitParameterNames()返回context的初始化参数的名字 ,用一个字符串对象枚举变量的形式。如果相应的context没有初始化参数,则就返回一个空的枚举变量。
java.lang.StringgetServletName()返回该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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值