Servlet-04ServletConfig和ServletContext

一.ServletConfig

1.概述

ServletConfig 是 Java Servlet 规范中的一个接口,它为 Servlet 提供了初始化信息 。当 Servlet 容器(如 Tomcat)创建一个 Servlet 实例时,它会传递一个 ServletConfig 对象给 Servlet 的 init 方法ServletConfig 对象包含了 Servlet 配置信息,这些信息主要来自于 Web 应用的部署描述符(web.xml 文件)。

java 复制代码
public interface ServletConfig {
    String getServletName();
    ServletContext getServletContext();
    String getInitParameter(String var1);
    Enumeration<String> getInitParameterNames();
}

总结:

  • 为Servlet提供初始配置参数的一种对象,每个Servlet都有自己独立唯一的ServletConfig对象
  • 容器会为每个Servlet实例化一个ServletConfig对象,并通过Servlet生命周期的init方法传入给Servlet作为属性

2.配置文件

我们可以在web.xml 文件为Servlet配置相关信息,如初始化参数(执行init会使用),映射路径等信息。

xml 复制代码
<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.example.MyServlet</servlet-class>
    <init-param>
        <param-name>dbUrl</param-name>
        <param-value>jdbc:mysql://localhost:3306/mydb</param-value>
    </init-param>
    <init-param>
        <param-name>dbUser</param-name>
        <param-value>root</param-value>
    </init-param>
    <init-param>
        <param-name>dbPassword</param-name>
        <param-value>password</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/myServlet</url-pattern>
</servlet-mapping>

当然也可以用注解@WebServlet来进行配置

java 复制代码
@WebServlet(value="/myServlet",initParams = {@WebInitParam(name="dbUser",value = "root"),@WebInitParam(name="dbPassword",value = "password")})

根据@WebServlet注解中的WebInitParam[] initParams() default {}可知,我们需要传递一个WebInitParam类型,而WebInitParam实际上是一个注解,如下

java 复制代码
public @interface WebInitParam {
    String name();

    String value();

    String description() default "";
}

3.具体使用

ServletConfig接口中有如下几个方法

方法名 作用
getServletName() 获取在标签中定义的Servlet名称
getServletContext() 获取ServletContext对象
getInitParameter() 获取配置Servlet时设置的『初始化参数』,根据名字获取值
getInitParameterNames() 获取所有初始化参数名组成的Enumeration对象

例子

java 复制代码
@WebServlet(value = "/s1",initParams = {@WebInitParam(name="key",value = "value1")})
public class UserServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取ServletConfig对象,这个方法在父类HttpServlet中定义
        ServletConfig servletConfig = getServletConfig();
        //获取所有的参数名,放到Enumeration对象中(相当于一个迭代器,可以依次遍历其中的值)
        Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
        //这个方法是判断是否有下一个,相当于游标
        while (initParameterNames.hasMoreElements()) {
            //取出下一个的值
            String s = initParameterNames.nextElement();
            System.out.println(servletConfig.getInitParameter(s));
        }

    }
}

二.ServletContext

1.概述

ServletContext 是 Java Servlet 规范中的一个重要接口,它代表了整个 Web 应用的上下文环境。每个 Web 应用在启动时都会有一个唯一ServletContext 实例,该实例在整个应用的生命周期内都是有效的。

ServletContext代表应用,所以ServletContext域也叫作应用域,是webapp中最大的域,可以在本应用内实现数据的共享和传递

ServletContext 提供了多种功能,使得 Servlet 和 JSP 页面能够访问 Web 应用的全局信息、配置参数以及共享数据。如:

  • 获取初始化参数
  • 获取资源
  • 属性管理
  • 访问 Web 应用的信息
  • 日志记录

2.相关配置

我们可以在web.xml文件中进行配置

xml 复制代码
<context-param>
        <param-name>username</param-name>
        <param-value>zhangsan</param-value>
    </context-param>
    <context-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
</context-param>

所有的Servlet对象都可以通过ServletContext对象访问该数据,且整个web应用只有一个ServletContext的实例

3.常用API介绍

  • 获取资源的真实路径

    java 复制代码
     String realPath = servletContext.getRealPath("资源在web目录中的路径");
  • 获取项目的上下文路径

    java 复制代码
     String contextPath = servletContext.getContextPath();
  • 通过域进行数据共享

    java 复制代码
    void setAttribute(String key,Object value); //向域中存储/修改数据 
    Object getAttribute(String key); //获得域中的数据 
    void removeAttribute(String key); //移除域中的数据 

三.注意事项

每个Servlet对象都有一个专有的ServletConfig对象,而所有Servlet对象共用一个ServletContext对象。

相关推荐
DEARM LINER14 分钟前
mysql 巧妙的索引
数据库·spring boot·后端·mysql
liuyang-neu1 小时前
力扣 简单 70.爬楼梯
java·算法·leetcode
喵手1 小时前
Java 与 Oracle 数据泵实操:数据导入导出的全方位指南
java·开发语言·oracle
开心工作室_kaic3 小时前
ssm010基于ssm的新能源汽车在线租赁管理系统(论文+源码)_kaic
java·前端·spring boot·后端·汽车
代码吐槽菌3 小时前
基于SSM的汽车客运站管理系统【附源码】
java·开发语言·数据库·spring boot·后端·汽车
zdkdchao3 小时前
jdk,openjdk,oraclejdk
java·开发语言
精致先生4 小时前
问题记录01
java·数据库·mybatis
小魏冬琅4 小时前
探索面向对象的高级特性与设计模式(2/5)
java·开发语言
TT哇4 小时前
【Java】数组的定义与使用
java·开发语言·笔记
look_outs5 小时前
JavaSE笔记2】面向对象
java·开发语言