ServletConfig和ServletContext接口-11

目录

一、ServletConfig接口详解

1、简介

2、ServletConfig 接口

3、获取 ServletConfig 对象

3.1、从带参的 init() 方法中获取

3.2、调用 GenericServlet 提供的 getServletConfig() 方法获取

4、配置 Servlet 初始化参数

4.1、在 web.xml 中配置初始化参数

4.2、在 @WebServlet 注解中配置初始化参数

5、示例

二、ServletContext接口详解

1、简介

2、获取 ServletContext 对象

2.1、通过 GenericServlet 提供的 getServletContext() 方法

2.2、通过 ServletConfig 提供的 getServletContext() 方法

2.3、通过 HttpSession 提供的 getServletContext() 方法

2.4、通过 HttpServletRequest 提供的 getServletContext() 方法

3、ServletContext 的应用

3.1、获取上下文初始化参数

3.2、实现数据通讯

3.3、读取 Web 应用下的资源文件


一、ServletConfig接口详解

1、简介

        Servlet 容器初始化 Servlet 时,会为这个 Servlet 创建一个 ServletConfig 对象,并将 ServletConfig 对象作为参数传递给 Servlet 。通过 ServletConfig 对象即可获得当前 Servlet 的初始化参数信息。一个 Web 应用中可以存在多个 ServletConfig 对象,但一个 Servlet 只能对应一个 ServletConfig 对象,即 Servlet 的初始化参数仅对当前 Servlet 有效。

2、ServletConfig 接口

        jakarta.servlet 包提供了一个 ServletConfig 接口,该接口中提供了以下方法:

返回值类型方法描述
StringgetServletName()返回 Servlet 的名字,即 web.xml 中 <servlet-name> 元素的值。
ServletContextgetServletContext()返回一个代表当前 Web 应用的 ServletContext 对象。
StringgetInitParameter(String name)根据初始化参数名 name,返回对应的初始化参数值。
Enumeration<String>getInitParameterNames()返回 Servlet 所有的初始化参数名的枚举集合。如果该 Servlet 没有初始化参数,则返回一个空的集合。

3、获取 ServletConfig 对象

        获取 ServletConfig 对象一般有 2 种方式:

3.1、从带参的 init() 方法中获取

public class ServletConfigDemo extends HttpServlet {

	private static final long serialVersionUID = 1562778022508275850L;

	private ServletConfig servletConfig;

	@Override
	public void init(ServletConfig config) throws ServletException {
		// 从带参的init()方法中,获取ServletConfig对象
		this.servletConfig = config;
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println(this.servletConfig.getServletName());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

3.2、调用 GenericServlet 提供的 getServletConfig() 方法获取

// 通过 GenericServlet 提供的 getServletConfig 方法获得 ServletConfig 对象
ServletConfig servletConfig = this.getServletConfig();

4、配置 Servlet 初始化参数

        配置 Servlet 的初始化参数有 2 种方式:

  • 在 web.xml 中配置初始化参数;
  • 在 @WebServlet 注解中配置初始化参数;

4.1、在 web.xml 中配置初始化参数

        在 web.xml 中可以使用一个或多个 <init-param> 元素为 Servlet 配置初始化参数,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="https://jakarta.ee/xml/ns/jakartaee"
	xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="5.0">
	<display-name>servletDemo</display-name>
	<servlet>
		<servlet-name>ServletConfigDemo</servlet-name>
		<servlet-class>com.hoperun.www.ServletConfigDemo</servlet-class>
		<!-- Servlet 初始化参数 -->
		<init-param>
			<param-name>name</param-name>
			<param-value>CSDN</param-value>
		</init-param>
		<init-param>
			<param-name>URL</param-name>
			<param-value>https://www.csdn.net</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>ServletConfigDemo</servlet-name>
		<url-pattern>/ServletConfigDemo</url-pattern>
	</servlet-mapping>
</web-app>

以上配置说明如下:

  • <init-param> 元素是 <servlet> 的子元素,需要在 <servlet> 元素内使用,表示只对当前 Servlet 有效;
  • <param-name> 子元素:表示参数的名称;
  • <param-value> 子元素:表示参数的值;

4.2、在 @WebServlet 注解中配置初始化参数

        通过 @WebServlet 注解的 initParams 属性也可以为 Servlet 设置初始化参数,代码如下:

@WebServlet(urlPatterns = { "/MyServlet" }, initParams = { @WebInitParam(name = "name", value = "CSDN"),
		@WebInitParam(name = "URL", value = "www.csdn.net") })
public class MyServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	}
}

5、示例

        下面我们通过一个示例演示如何通过 ServletConfig 对象读取 Servlet 的初始化参数。

package com.hoperun.www;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = "/ReadServletConfigParam", initParams = { @WebInitParam(name = "name", value = "CSDN"),
		@WebInitParam(name = "URL", value = "www.csdn.net") })
public class ReadServletConfigParam extends HttpServlet {

	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter writer = response.getWriter();
		// 获取ServletConfig对象
		ServletConfig config = getServletConfig();
		// 获取ServletName
		String servletName = config.getServletName();
		writer.write("ServletName: " + servletName + "<br/>");
		// 返回 Servlet 的初始化参数的名称的集合
		Enumeration<String> initParameterNames = config.getInitParameterNames();
		// 遍历集合获取初始化参数名称
		while (initParameterNames.hasMoreElements()) {
			// 获取初始化参数名称
			String initParamName = initParameterNames.nextElement();
			// 获取相应的初始参数的值
			String initParamValue = config.getInitParameter(initParamName);
			// 向页面输出
			writer.write(initParamName + "  :  " + initParamValue + "<br/>");
		}
		// 关闭流
		writer.close();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

启动 Tomcat 服务器,在地址栏输入 http://localhost:8080/servletDemo/ReadServletConfigParam,访问 ReadServletConfigParam,结果如下图:

二、ServletContext接口详解

1、简介

        Servlet 容器启动时,会为每个 Web 应用(webapps 下的每个目录都是一个 Web 应用)创建一个唯一的 ServletContext 对象,该对象被称为"Servlet 上下文"。ServletContext 对象的生命周期从 Servlet 容器启动时开始,到容器关闭或应用被卸载时结束。

        Web 应用中的所有 Servlet 共享同一个 ServletContext 对象,不同 Servlet 之间可以通过 ServletContext 对象实现数据通讯,因此 ServletContext 对象也被称为 Context 域对象。(域对象是服务器在内存上创建的存储空间,该空间用于不同动态资源(例如:Servlet、JSP)之间传递与共享数据。

2、获取 ServletContext 对象

        获取 ServletContext 对象有以下 4 种方式:

2.1、通过 GenericServlet 提供的 getServletContext() 方法

// 通过 GenericServlet 的 getServletContext 方法获取 ServletContext 对象
ServletContext servletContext = this.getServletContext();

2.2、通过 ServletConfig 提供的 getServletContext() 方法

// 通过 ServletConfig 的 getServletContext 方法获取 ServletContext 对象
ServletContext servletContext = this.getServletConfig().getServletContext();

2.3、通过 HttpSession 提供的 getServletContext() 方法

// 通过 HttpSession 的 getServletContext 方法获取 ServletContext 对象
ServletContext servletContext = req.getSession().getServletContext();

2.4、通过 HttpServletRequest 提供的 getServletContext() 方法

// 通过 HttpServletRequest 的 getServletContext 方法获取 ServletContext 对象
ServletContext servletContext = req.getServletContext();

3、ServletContext 的应用

        jakarta.servlet 包提供了一个 ServletContext 接口,该接口定义了一组方法,Servlet 可以使用这些方法与容器进行通信。ServletContext 的应用主要有以下 3 个方面:

  • 获取上下文初始化参数;
  • 实现 Servlet 之间的数据通讯;
  • 读取 Web 应用下的资源文件;

3.1、获取上下文初始化参数

        使用 ServletContext 对象获取 Web 应用的上下文初始化参数,分为 2 步:

  • 设置上下文初始化参数;
  • 调用接口中方法获取初始化参数;

1)设置上下文初始化参数

        通过 web.xml 中的 <context-param> 元素可以为 Web 应用设置一些全局的初始化参数,这些参数被称为上下文初始化参数。与 Servlet 的初始化参数不同,应用中的所有 Servlet 都共享同一个上下文初始化参数。在 Web 应用的整个生命周期内,上下文初始化参数会一直存在,并且可以随时被任意一个 Servlet 访问。在 web.xml 文件中配置上下文初始化参数,代码如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="https://jakarta.ee/xml/ns/jakartaee"
	xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="5.0">
	
	<!-- 配置应用(全局)初始化参数 -->
	<context-param>
		<param-name>servletContextInfo</param-name>
		<param-value>This is application scope</param-value>
	</context-param>
	
	<context-param>
		<param-name>globalEncoding</param-name>
		<param-value>UTF-8</param-value>
	</context-param>
</web-app>

对以上标签说明如下:

  • <context-param> 标签用来声明上下文初始化参数,必须在根元素 <web-app> 内使用;
  • <param-name> 子元素表示参数名,参数名在整个 Web 应用中必须是唯一的;
  • <param-value> 子元素表示参数值;

2)调用接口中方法获取初始化参数

        Servlet 容器启动时,会为容器内每个 Web 应用创建一个 ServletContext 对象,并将 <context-param> 元素中的上下文初始化参数以键值对的形式存入该对象中,因此我们可以通过 ServletContext 的相关方法获取到这些初始化参数。下表列举了 ServletContext 接口中用于获取上下文初始化参数的相关方法。

返回值类型方法描述
StringgetInitParameter(String name)根据初始化参数名 name,返回对应的初始化参数值。
Enumeration<String>getInitParameterNames()返回 Web 应用所有上下文初始化参数名的枚举集合,如果该 Web 应用没有上下文初始化参数,则返回一个空的枚举集合。

3)示例

        以 servletDemo 为例,在 com.xxx.www 包下创建一个名称为 ReadServletContextParam 类,代码如下:

package com.hoperun.www;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/ReadServletContextParam")
public class ReadServletContextParam extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;chartset=UTF-8");
		PrintWriter writer = response.getWriter();
		// 调用 HttpServlet 父类 GenericServlet 的 getServletContext 方法获取 ServletContext 对象
		ServletContext context = super.getServletContext();
		// 返回 context 上下文初始化参数的名称
		Enumeration<String> initParameterNames = context.getInitParameterNames();
		while (initParameterNames.hasMoreElements()) {
			// 获取初始化参数名称
			String initParamName = initParameterNames.nextElement();
			// 获取相应的初始化参数的值
			String initParamValue = context.getInitParameter(initParamName);
			// 输出到页面
			writer.write(initParamName + " : " + initParamValue + "<br/>");
		}
		// 关闭流
		writer.close();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

启动 Tomcat 服务器,输入 http://localhost:8080/servletDemo/ReadServletContextParam,访问 ReadServletContextParam,结果如下图:

3.2、实现数据通讯

        在 Servlet 中,调用 ServletContext 接口的 setAttribute() 方法可以创建一些属性,这些属性被存放在 ServletContext 对象中。应用中所有 Servlet 都可以对这些属性进行访问和操作,通过它们可以实现应用内不同 Servlet 之间的数据通讯。 

1)数据通讯的相关方法

        下表列举了 ServletContext 接口实现数据通讯的相关方法:

返回值类型方法描述
voidsetAttribute(String name, Object object)把一个 Java 对象与一个属性名绑定,并将它作为一个属性存放到 ServletContext 中。
参数 name 为属性名,参数 object 为属性值。
ObjectgetAttribute(String name)根据指定的属性名 name,返回 ServletContext 中对应的属性值。
voidremoveAttribute(String name)

从 ServletContext 中移除属性名为 name 的属性。

2)ServletContext 属性与上下文初始化参数对比

不同点ServletContext 的属性上下文初始化参数
创建方式ServletContext 的属性是通过调用 ServletContext 接口的 setAttribute() 方法创建。上下文初始化参数是在 web.xml 中通过使用 <context-param> 元素配置。
可进行的操作ServletContext 的属性可以通过 ServletContext 接口的方法进行读取、新增、修改、移除等操作。上下文初始化参数在容器启动后只能被读取,不能进行新增、修改和移除操作。
生命周期ServletContext 中属性的生命周期从创建开始,到该属性被移除或者容器关闭结束。上下文初始化参数的生命周期,从容器启动开始,到 Web 应用被卸载或容器关闭结束
作用使用 ServletContext 中的属性可以实现 Servlet 之间的数据通讯。使用上下文初始化参数无法实现数据通讯。

3)示例

        我们通过编写一个统计页面访问量的示例,来演示如何通过 ServletContext 对象实现数据通讯。

        先创建一个使用ServletContext 统计访问次数的类,代码如下:

package com.hoperun.www;

import java.io.IOException;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

/**
 * 使用ServletContext 统计访问次数
 * 
 * @author Administrator
 *
 */
@WebServlet("/CountAccessSiteServlet")
public class CountAccessSiteServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void init() throws ServletException {
		// 获取ServletContext对象
		ServletContext context = getServletContext();
		// 初始化时,向ServletContext中设置count属性,初始值为0
		context.setAttribute("count", 0);
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 调用httpServlet父类GenericServlet的getServletContext方法获取ServletContext对象
		ServletContext context = super.getServletContext();
		// 获取count的值,自增
		Integer count = (Integer) context.getAttribute("count");
		// 存入到域对象中
		context.setAttribute("count", ++count);
		// 向页面输出内容
		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().write("<h3>欢迎访问本站点!</h3>");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

再创建一个展示网站的访问次数的类,代码如下:

package com.hoperun.www;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

/**
 * 使用ServletContext展示网站的访问次数
 * 
 * @author Administrator
 *
 */
@WebServlet("/ShowCountServlet")
public class ShowCountServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取ServletContext中存放的count属性(即页面的访问次数)
		Integer count = (Integer) getServletContext().getAttribute("count");
		// 向页面输出
		response.setContentType("text/html;charset=UTF-8");
		// 若 CountAccessSiteServlet 已被访问
		if (count != null) {
			response.getWriter().write("<h3>该网站一共被访问了" + count + "次.</h3>");
		} else {
			// 若 CountAccessSiteServlet 未被访问,提示先访问 CountAccessSiteServlet
			response.getWriter().write("<h3>请先访问 CountAccessSiteServlet </h3>");
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

重启 Tomcat 浏览器,在地址栏输入http://localhost:8080/servletDemo/CountAccessSiteServlet,多次访问 CountAccessSiteServlet ,结果如下图:

 然后再输入http://localhost:8080/servletDemo/ShowCountServlet,访问 ShowCountServlet,结果如下图:

3.3、读取 Web 应用下的资源文件

        在实际开发中,有时会需要读取 Web 应用中的一些资源文件,如:配置文件和日志文件等。为此,ServletContext 接口定义了一些用于读取 Web 资源的方法,如下表:

返回值类型方法描述
Set<String>getResourcePaths(String path)返回一个 Set 集合,该集合中包含资源目录中的子目录和文件的名称。
StringgetRealPath(String path)返回资源文件的真实路径(文件的绝对路径)。
URLgetResource(String path)返回映射到资源文件的 URL 对象。
InputStreamgetResourceAsStream(String path)返回映射到资源文件的 InputStream 输入流对象。

注:上表中参数 path 代表资源文件的虚拟路径,它以正斜线 / 开始( / 表示当前 Web 应用的根目录)。

1)示例

        下面我们通过一个例子演示如何使用 ServletContext 对象读取资源文件。

在 servletDemo 的 src/main/resources 目录中,创建一个名称为 db.properties 的文件,文件中输入如下所示的配置信息:

name=CSDN
url=www.csdn.net
desc=CSDN,欢迎您!

在 com.hoperun.www 包中,创建一个名称为 ReadResourceFileWithServletContext 的 Servlet 类,代码如下所示:

package com.hoperun.www;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Properties;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/ReadResourceFileWithServletContext")
public class ReadResourceFileWithServletContext extends HttpServlet {

	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter writer = response.getWriter();
		// 获取相对路径中的输入流对象
		// 关于这块路径的配置简要说明一下:
		// / :这个斜杠代表的是应用的根目录,也就是servletDemo
		// 为什么这个资源文件在WEB-INF/classes目录下呢?
		// 原因是:Java Web项目以war或jar包部署到服务器之后,服务器会自动创建一个WEB-INF目录.
		// 代码编译后会将src/main/resources下的文件复制到classes根目录下.
		InputStream is = getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
		// 解决中文乱码的问题
		InputStreamReader inputStreamReader = new InputStreamReader(is, "UTF-8");
		// 获取输入流
		Properties pro = new Properties();
		// 加载
		pro.load(inputStreamReader);
		// 获取文件中的内容
		String name = pro.getProperty("name");
		String url = pro.getProperty("url");
		String desc = pro.getProperty("desc");
		writer.write("用户名:" + name + "<br/>" + "地址:" + url + "<br/>" + "描述:" + desc + "<br/>");
		writer.close();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

启动 Tomcat 服务器,在地址栏中输入http://localhost:8080/servletDemo/ReadResourceFileWithServletContext,访问该 Servlet,结果如下图:

写在最后:

        这里尤其要注意通过 ServletContext 读取资源文件的时候虚拟路径的设置,如果我们不知道怎么设置的时候可以将项目先打成 war 包放置到 Tomcat 的 webapps 目录下,启动 Tomcat ,在该目录下将会看到解压之后的目录情况,根据解压之后的目录结构我们就知道如何设置资源文件的虚拟路径了。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值