当前位置: 首页 > news >正文

ServletConfig ServletContext

一 . ServletConfig 

1. Servlet1代码

@WebServlet(urlPatterns = "servlet1",initParams = {@WebInitParam(name = "keya", value = "valueA")}
)public class Servlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletConfig servletConfig = getServletConfig(); // 获取初始配置信息// 根据参数名获取参数值String keya = servletConfig.getInitParameter("keya");System.out.println("keya:" + keya);// 获取所有的初始参数的名字// hasMoreElements 判断有没有下一个参数 如果有返回true 如果没有返回false// nextElement 1.取出下一个元素 2.向下移动游标Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();while (initParameterNames.hasMoreElements()) {String pname = initParameterNames.nextElement();System.out.println(pname + "=" + getInitParameter(pname));}}
}

2、配置初始化参数的两种方式

Servlet 初始化参数有 XML 配置(web.xml) 和 注解配置(@WebServlet) 两种主流方式,本质都是给 ServletConfig 传参。

方式 1:XML 配置(web.xml)

在 WEB-INF/web.xml 里,给 Servlet 加 <init-param> 标签:

<servlet><servlet-name>servlet1</servlet-name><servlet-class>com.servlet.Servlet1</servlet-class><!--配置 servlet 的初始参数--><init-param><param-name>keya</param-name><param-value>valueA</param-value></init-param><init-param><param-name>keyb</param-name><param-value>valueb</param-value></init-param></servlet><servlet-mapping><servlet-name>servlet1</servlet-name><url-pattern>/servlet1</url-pattern>
</servlet-mapping>
方式 2:注解配置(@WebServlet)

用 @WebServlet 注解直接在 Servlet 类上配置,替代 web.xml:

import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.annotation.WebServlet;@WebServlet(// 访问路径urlPatterns = "/servlet1",  // 初始化参数:@WebInitParam 可配多个initParams = {@WebInitParam(name = "keya", value = "valueA"),@WebInitParam(name = "keyb", value = "valueB") }
)

 

3、Servlet 读取参数的核心代码逻辑

不管用 XML 还是注解配置参数,ServletConfig 的用法完全一致。以下是代码拆解:

1. 基础用法:获取单个参数

通过 getServletConfig() 拿到 ServletConfig 对象,再用 getInitParameter("参数名") 取值:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1. 获取 ServletConfig 对象ServletConfig config = getServletConfig();// 2. 根据参数名取单个值(如 "keya")String keyaValue = config.getInitParameter("keya");System.out.println("keya: " + keyaValue); 
}
2. 进阶用法:遍历所有参数

用 getInitParameterNames() 获取参数名枚举(Enumeration),结合 hasMoreElements() 和 nextElement() 遍历:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletConfig config = getServletConfig();// 1. 获取所有参数名的枚举Enumeration<String> paramNames = config.getInitParameterNames();// 2. 遍历枚举:hasMoreElements() 判断是否有下一个参数while (paramNames.hasMoreElements()) {// 3. nextElement() 取出参数名,再用 getInitParameter() 取值String paramName = paramNames.nextElement();String paramValue = config.getInitParameter(paramName);System.out.println(paramName + " = " + paramValue);}
}

枚举遍历逻辑

  •     hasMoreElements():类似于迭代器 Iterator 的 hasNext() 方法,判断是否还有未遍历的参数名。
  •                nextElement()类似 next(),取出当前参数名,并 “移动游标” 到下一个。

 

核心知识点关键内容
ServletConfig 作用管理 Servlet 初始化参数,实现 “配置与代码解耦”
配置参数的两种方式- XML:<init-param> 写在 web.xml
- 注解:@WebServlet + @WebInitParam
常用方法getInitParameter("name"):读单个参数
getInitParameterNames():遍历所有参数名
枚举遍历逻辑

Enumeration 用 hasMoreElements() 判断、nextElement() 取值,类似迭代器

二 . ServletContext

0.ServletContext是什么?

  • ServletContext对象又称呼为    上下文对象,或者叫   应用域对象

核心是 “全局共享” 

  • 容器会为每个app创建一个独立的唯一的ServletContext对象

  •         ServletContext对象为所有的Servlet所共享

  •         ServletContext可以为所有的Servlet提供初始配置参数

通过它可以:

  • 让不同组件(Servlet、Filter 等)互通数据;
  • 管理应用级资源和配置;
  • 监听应用生命周期事件。

1. Servlet 初始化参数获取

在 Servlet 类(如 Servlet1Servlet2)的 service 方法里

// 获取所有的初始参数的名字
// hasMoreElements  判断有没有下一个参数 如果有返回true  如果没有返回false 
// nextElement     1.取出下一个元素  2.向下移动游标 
Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {String pname = initParameterNames.nextElement();System.out.println(pname + "=" + getInitParameter(pname));
}

  • 作用:通过 ServletConfig 获取当前 Servlet 的初始化参数名枚举,遍历枚举拿到参数名,再用 getInitParameter(pname)(底层依赖 ServletConfig)获取对应参数值,实现 “逐个读取 Servlet 专属初始化参数” 的逻辑。
  • 细节hasMoreElements 是枚举的 “是否还有元素” 判断,nextElement 既取当前元素,又移动枚举游标,保证循环能依次拿到所有参数名。

2. ServletContext 获取与作用

有多种获取 ServletContext 的方式:

// 获取ServletContext
ServletContext servletContext1 = servletConfig.getServletContext();
ServletContext servletContext2 = req.getServletContext(); 
ServletContext servletContext3 = getServletContext(); 

结合 GenericServlet 类的源码

public ServletContext getServletContext() {return this.getServletConfig().getServletContext(); 
}

  • 核心逻辑:不管是通过 ServletConfigHttpServletRequest,还是直接调用 getServletContext()最终都是从 ServletConfig 里拿 ServletContext,保证一个 Web 应用里所有 Servlet 拿到的是同一个全局上下文对象(可通过 servletContext1 == servletContext2 这类代码验证是否为同一对象 )。
  • 作用ServletContext 用于获取整个 Web 应用全局参数(比如 web.xml 里 <context-param> 配置的参数 ),示例:

    String encoding = servletContext1.getInitParameter("encoding"); 
    System.out.println("encoding:" + encoding); Enumeration<String> parameterNames = servletContext1.getInitParameterNames(); 
    while (parameterNames.hasMoreElements()){String pname = parameterNames.nextElement();System.out.println(pname + "=" + servletContext1.getInitParameter(pname)); 
    }
    

    这里就是用 ServletContext 读取全局参数,和 Servlet 自身初始化参数区分开,实现 “全局配置 + 局部配置” 的组合使用。

3. 代码结构与配置关联

  • web.xml 里的 <context-param>:属于 Web 应用全局参数,通过 ServletContext 读取,作用范围是整个应用(所有 Servlet 都能拿到)。
  • @WebServlet 或 web.xml 里的 <init-param>:属于单个 Servlet 的初始化参数,通过 ServletConfig 读取,作用范围仅限当前 Servlet 实例

比如 Servlet1 的注解配置:

@WebServlet(urlPatterns = "servlet1",initParams = {@WebInitParam(name = "keya", value = "valuea")} 
)

相关文章:

  • 如何使用免费软件写论文?六个免费论文生成软件使用指南
  • html配置rem实现页面自适应
  • 三大能力升级!飞算 JavaAI 攻克老项目重构难题
  • 河北对口计算机高考C#笔记(2026高考适用)---完结版~~~~
  • MongoDB 和 Redis的区别
  • 【V2.0】TPS-61088升压板-3.7V升压到9V电源板
  • Guava Cache 本地项目缓存
  • 什么是故障注入测试
  • vue入门学习时,按照官方的教程生成的vue3项目后,命令行运行npm install出现一堆warn,然后运行npm run dev报错,项目启动失败
  • 三、java项目自动部署流水线搭建
  • 《二分枚举答案(配合数据结构)》题集
  • 每日算法刷题Day39 6.26:leetcode前缀和2道题,用时1h20min
  • 009 【入门】单双链表及其反转-堆栈诠释
  • 记一次生产Redis集群宕机恢复过程
  • JDeli:Java 图像处理领域中的 Aspose 替代方案
  • ubuntu18.04安装 gcc 9以及2019版本tbb
  • 基于ubuntu 22.04环境安装NEURON仿真器
  • AcWing--数据结构(二)
  • Redis 单线程的“天花板”与集群的必要性
  • 学习记录:DAY34