初识ServletConfig

正文开始

可以先通过这个思维导图来大致了解一下关于ServletConfig

ServletConfig 是一个接口(jakarta.Servlet的一个接口)

ServletConfig 是Servlet规范的一员

全称:jakarta.servlet.ServletConfig

Servlet对象的配置信息对象。

ServletConfig对象中封装了标签中的配置信息。(web.xml文件中servlet的配置信息)

每个serlvet类的实例都有且只有一个对应的servletConfig对象

谁去实现ServletConfig这个接口

public class org.apache.catalina.core.StandardWrapperFacade

结论:Tomcat服务器实现了ServletConfig这个接口-----WEB服务器实现了这个接口

不同服务器有不同的实现

思考:如果把Tomcat服务器换成jetty服务器,输出ServletConfig对象的时候,还是这个结果吗?

不一定一样,包名类名可能和Tomcat服务器不一样,但是他们都实现了ServletConfig这个规范

一个Servlet对象有一个ServletConfig对象,他们之间是一对一

ServletConfig对象是谁创建?在什么时候创建?

  • Tomcat服务器调用Servlet对象的init方法的时候需要传一个ServletConfig对象的参数给init方法。

    • Tomcat服务器(WEB服务器)创建了ServletConfig对象
      在创建Servlet对象的时候,同时创建了ServletConfig对象
    • Servlet对象是Tomcat服务器创建,并且ServletConfig对象也是Tomcat服务器创建。并且默认情况下,他们都是在用户发送第一次请求的时候创建。
  • Tomcat服务器调用Servlet对象的init方法的时候需要传一个ServletConfig对象的参数给init方法。

    ServletConfig接口的作用

Config是Configuration单词的缩写

ServletConfig对象翻译为:Servlet对象的配置信息对象

一个Servlet对象就有一个配置信息对象

ServletConfig对象中包装的信息

web.xml文件中标签中的配置信息

常用方法

java 复制代码
public String getInitParameter(String name); // 通过初始化参数的name获取value
1
 <servlet>
        <servlet-name>configTestServlet</servlet-name>
        <servlet-class>commanman.servlet.ConfigTestServlet</servlet-class>
        <!--这里可以配置servlet对象的初始化信息 -->
        <init-param>
            <param-name>driver</param-name>
            <param-value>com.mysql.cj.jdbc.Driver</param-value>
        </init-param>
       
    </servlet>
    <servlet-mapping>
        <servlet-name>configTestServlet</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>

String value=config.getInitParameter("driver);

通过这个方法,传入name,可以获取初始化配置信息的value

java 复制代码
public Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的name
public ServletContext getServletContext(); // 获取ServletContext对象
public String getServletName(); // 获取当前Servlet的name
123
package com.bjpowernode.servlet;

import jakarta.servlet.*;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
 /
 * @author gaoziman
 * @create 2022--08--19 20:39
 */
public class ConfigTestServlet extends GenericServlet {
    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out=response.getWriter();

        ServletConfig config = this.getServletConfig();
        //org.apache.catalina.core.StandardWrapperFacade@778f4ce
        out.println("ServletConfig对象:"+config);
        out.println("<br>");

        String configServletName = config.getServletName();
        out.println("<servlet-name>"+configServletName+"</servlet-name>");
//通过ServletConfig对象中的方法可以获取web.xml文件中的初始化参数配置信息
        //java.util.Enumeration<java.lang.String> getInitParameterNames()  获取所有初始化参数name
//java.lang.String   getInitParameter(java.lang.String name)   通过初始化参数的name,来获取value
        Enumeration<String> initParameterNames = config.getInitParameterNames();//获取对应name的value
        //遍历集合
        out.println("<br>");
        while (initParameterNames.hasMoreElements()){
            String s = initParameterNames.nextElement();
            String value = config.getInitParameter(s);

            out.println(s+"----->"+value);
            out.println("<br>");
        }
        //实际上获取一个Servlet对象的初始化参数,可以不用获取ServletConfig对象
        //因为适配器有相关方法
        Enumeration<String> names = this.getInitParameterNames();
        while (names.hasMoreElements()){
            String s = names.nextElement();
            System.out.println(s+"---->"+this.getInitParameter(s));
            //out.println("<br>");
        }

        //怎么获取ServletContext对象

        //第一种方式通过ServletConfig对象来获取ServletContext对象
        ServletContext application=config.getServletContext();
        //输出
        //org.apache.catalina.core.ApplicationContextFacade@bb8cbf0
        out.print("<br>"+application);
        //第二种:通过this来获取ServletContext对象,注意:this必须是继承GenericServlet
        ServletContext application2 = this.getServletContext();
        //org.apache.catalina.core.ApplicationContextFacade@bb8cbf0
        out.print("<br>"+application2);


    }
}
相关推荐
雨白11 分钟前
Java 线程通信基础:interrupt、wait 和 notifyAll 详解
android·java
架构师沉默4 小时前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
Java中文社群6 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
每天进步一点_JL7 小时前
JVM 类加载:双亲委派机制
java·后端
用户298698530147 小时前
Java HTML 转 Word 完整指南
java·后端
渣哥7 小时前
原来公平锁和非公平锁差别这么大
java
渣哥8 小时前
99% 的人没搞懂:Semaphore 到底是干啥的?
java
J2K8 小时前
JDK都25了,你还没用过ZGC?那真得补补课了
java·jvm·后端
kfyty7258 小时前
不依赖第三方,不销毁重建,loveqq 框架如何原生实现动态线程池?
java·架构
isysc19 小时前
面了一个校招生,竟然说我是老古董
java·后端·面试