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对象。

相关推荐
ruokkk5 分钟前
重启Eureka集群中的节点,对已经注册的服务有什么影响
后端
刘白Live9 分钟前
【Java】谈一谈浅克隆和深克隆
java
一线大码11 分钟前
项目中怎么确定线程池的大小
java·后端
要加油哦~13 分钟前
vue · 插槽 | $slots:访问所有命名插槽内容 | 插槽的使用:子组件和父组件如何书写?
java·前端·javascript
LNin15 分钟前
Spring AI 自定义数据库持久化的ChatMemory
后端
crud16 分钟前
Spring Boot 3 整合 Swagger:打造现代化 API 文档系统(附完整代码 + 高级配置 + 最佳实践)
java·spring boot·swagger
天天摸鱼的java工程师22 分钟前
从被测试小姐姐追着怼到运维小哥点赞:我在项目管理系统的 MySQL 优化实战
java·后端·mysql
专注VB编程开发20年30 分钟前
asp.net mvc如何简化控制器逻辑
后端·asp.net·mvc
周某某~33 分钟前
四.抽象工厂模式
java·设计模式·抽象工厂模式