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

相关推荐
李慕婉学姐33 分钟前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
m0_7400437341 分钟前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
编织幻境的妖43 分钟前
SQL查询连续登录用户方法详解
java·数据库·sql
未若君雅裁1 小时前
JVM面试篇总结
java·jvm·面试
kk哥88992 小时前
C++ 对象 核心介绍
java·jvm·c++
招风的黑耳2 小时前
我用SpringBoot撸了一个智慧水务监控平台
java·spring boot·后端
xunyan62342 小时前
面向对象(下)-接口的理解
java·开发语言
Miss_Chenzr2 小时前
Springboot优卖电商系统s7zmj(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
程序员游老板2 小时前
基于SpringBoot3+vue3的爱心陪诊平台
java·spring boot·毕业设计·软件工程·课程设计·信息与通信
期待のcode2 小时前
Springboot核心构建插件
java·spring boot·后端