@WebServlet(
urlPatterns = "servlet1",
initParams = {@WebInitParam(name = "keya", value = "valueA")}
)
public class Servlet1 extends HttpServlet {
@Override
protected 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 initParameterNames = servletConfig.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
String pname = initParameterNames.nextElement();
System.out.println(pname + "=" + getInitParameter(pname));
}
}
}
Servlet 初始化参数有 XML 配置(web.xml) 和 注解配置(@WebServlet) 两种主流方式,本质都是给 ServletConfig
传参。
在 WEB-INF/web.xml 里,给 Servlet 加
标签:
servlet1
com.servlet.Servlet1
keya
valueA
keyb
valueb
servlet1
/servlet1
用 @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")
}
)
不管用 XML 还是注解配置参数,ServletConfig
的用法完全一致。以下是代码拆解:
通过 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);
}
用 getInitParameterNames()
获取参数名枚举(Enumeration
),结合 hasMoreElements()
和 nextElement()
遍历:
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletConfig config = getServletConfig();
// 1. 获取所有参数名的枚举
Enumeration 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: 写在 web.xml- 注解: @WebServlet + @WebInitParam |
常用方法 | - getInitParameter("name") :读单个参数- getInitParameterNames() :遍历所有参数名 |
枚举遍历逻辑 |
|
0.ServletContext是什么?
ServletContext对象又称呼为 上下文对象,或者叫 应用域对象
核心是 “全局共享”
容器会为每个app创建一个独立的唯一的ServletContext对象
ServletContext对象为所有的Servlet所共享
ServletContext可以为所有的Servlet提供初始配置参数
通过它可以:
在 Servlet 类(如 Servlet1
、Servlet2
)的 service
方法里
// 获取所有的初始参数的名字
// hasMoreElements 判断有没有下一个参数 如果有返回true 如果没有返回false
// nextElement 1.取出下一个元素 2.向下移动游标
Enumeration initParameterNames = servletConfig.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
String pname = initParameterNames.nextElement();
System.out.println(pname + "=" + getInitParameter(pname));
}
ServletConfig
获取当前 Servlet 的初始化参数名枚举,遍历枚举拿到参数名,再用 getInitParameter(pname)
(底层依赖 ServletConfig
)获取对应参数值,实现 “逐个读取 Servlet 专属初始化参数” 的逻辑。hasMoreElements
是枚举的 “是否还有元素” 判断,nextElement
既取当前元素,又移动枚举游标,保证循环能依次拿到所有参数名。有多种获取 ServletContext
的方式:
// 获取ServletContext
ServletContext servletContext1 = servletConfig.getServletContext();
ServletContext servletContext2 = req.getServletContext();
ServletContext servletContext3 = getServletContext();
结合 GenericServlet
类的源码
public ServletContext getServletContext() {
return this.getServletConfig().getServletContext();
}
ServletConfig
、HttpServletRequest
,还是直接调用 getServletContext()
,最终都是从 ServletConfig
里拿 ServletContext
,保证一个 Web 应用里所有 Servlet 拿到的是同一个全局上下文对象(可通过 servletContext1 == servletContext2
这类代码验证是否为同一对象 )。ServletContext
用于获取整个 Web 应用全局参数(比如 web.xml
里
配置的参数 ),示例: String encoding = servletContext1.getInitParameter("encoding");
System.out.println("encoding:" + encoding);
Enumeration parameterNames = servletContext1.getInitParameterNames();
while (parameterNames.hasMoreElements()){
String pname = parameterNames.nextElement();
System.out.println(pname + "=" + servletContext1.getInitParameter(pname));
}
ServletContext
读取全局参数,和 Servlet 自身初始化参数区分开,实现 “全局配置 + 局部配置” 的组合使用。web.xml
里的
:属于 Web 应用全局参数,通过 ServletContext
读取,作用范围是整个应用(所有 Servlet 都能拿到)。@WebServlet
或 web.xml
里的
:属于单个 Servlet 的初始化参数,通过 ServletConfig
读取,作用范围仅限当前 Servlet 实例比如 Servlet1
的注解配置:
@WebServlet(
urlPatterns = "servlet1",
initParams = {@WebInitParam(name = "keya", value = "valuea")}
)