【JavaWeb】ServletConfig和ServletContext

一、概念

Servlet:服务端小程序、Config(Configuration):配置信息,那也就是说ServletConfig的作用就是为我们的Servlet提供初始配置信息的一种对象。

官方一点的概念就是:

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

二、分析

当我们写好配置文件后,Tomcat是可以读取到 web.xml 配置信息的,通过 <servlet-class> Tomcat知道你这个是一个Servlet后,会对这个Servlet进行初始化,在Servlet初始化之前,它会先读取 <init-param> ,然后放到一个 ServletConfig对象 上, ServletConfig对象 是由Tomcat给我们产生的,紧接着Servlet在进行构造初始化的时候,就会将 ServletConfig对象 进行传入,这个 init(ServletConfig config) 在GenericServlet中已经重写好了,并且赋值给了其成员变量,此时我们就可以从GenericServlet中获取到config对象。

image-20240728161001033

PS:每个Servlet独享一个 ServletConfig对象

1682302307081

三、使用

ServletConfig是一个接口,定义了如下API

package jakarta.servlet;
import java.util.Enumeration;
public interface ServletConfig {
    String getServletName();
    ServletContext getServletContext();
    String getInitParameter(String var1);
    Enumeration<String> getInitParameterNames();
}
抽象方法名作用
getServletName()获取 <servlet-name>HelloServlet</servlet-name> 定义的Servlet名称
getServletContext()获取ServletContext对象,在GenericServlet抽象类中进行了实现
getInitParameter()获取配置Servlet时设置的『初始化参数』,根据名字获取值
getInitParameterNames()获取所有初始化参数名组成的Enumeration对象

四、代码示例

1)定义Servlet

public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
        // 根据参数名获取单个参数
        String value = servletConfig.getInitParameter("param1");
        System.out.println("param1:"+value);
        // 获取所有参数名,早期的Iterator用的就是Enumeration
        Enumeration<String> parameterNames = servletConfig.getInitParameterNames();
        // hasMoreElements():判断有没有下一个参数,如果有返回True,如果没有返回False
        while (parameterNames.hasMoreElements()) {
            // nextElement():1、取出元素;2、向下移动游标
            String paramaterName = parameterNames.nextElement();
            System.out.println(paramaterName+":"+servletConfig.getInitParameter(paramaterName));
        }
    }
}

public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletConfig servletConfig = this.getServletConfig();
        // 根据参数名获取单个参数
        String value = servletConfig.getInitParameter("param1");
        System.out.println("param1:"+value);
        // 获取所有参数名
        Enumeration<String> parameterNames = servletConfig.getInitParameterNames();
        // 迭代并获取参数名
        while (parameterNames.hasMoreElements()) {
            String paramaterName = parameterNames.nextElement();
            System.out.println(paramaterName+":"+servletConfig.getInitParameter(paramaterName));
        }
    }
}

2)web.xml 方式配置Servlet

  <servlet>
       <servlet-name>ServletA</servlet-name>
       <servlet-class>com.atguigu.servlet.ServletA</servlet-class>
       <!--配置ServletA的初始参数,可以写多个键值对,这多个键值对都可以被Tomcat所读取到,然后以ServletConfig对象的形式进行一个转换-->
       <init-param>
           <param-name>param1</param-name>
           <param-value>value1</param-value>
       </init-param>
       <init-param>
           <param-name>param2</param-name>
           <param-value>value2</param-value>
       </init-param>
   </servlet>

    <servlet>
        <servlet-name>ServletB</servlet-name>
        <servlet-class>com.atguigu.servlet.ServletB</servlet-class>
        <!--配置ServletB的初始参数-->
        <init-param>
            <param-name>param3</param-name>
            <param-value>value3</param-value>
        </init-param>
        <init-param>
            <param-name>param4</param-name>
            <param-value>value4</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>ServletA</servlet-name>
        <url-pattern>/servletA</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>ServletB</servlet-name>
        <url-pattern>/servletB</url-pattern>
    </servlet-mapping>

3)注解方式配置Servlet

@WebServlet(
    urlPatterns = "/userServlet1",
    // @WebInitParam又是一个注解,initParams的值通过查看源码可知,接收的是一个WebInitParam注解数组
    initParams = {@WebInitParam(name = "param1",value = "value1"), @WebInitParam(name = "param2",value = "value2")}
)
public class UserServlet  extends HttpServlet {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值