Una descripción general del objeto ServletConfig y sus métodos comunes para obtener los parámetros de inicialización del objeto Servlet

ServletConfig配置Servlet信息

La interfaz ServletConfig está implementada por org.apache.catalina.core.StandardWrapperFacade proporcionado por el servidor Tomcat

  • El nombre del paquete y el nombre de la clase pueden ser diferentes cuando diferentes servidores generan objetos ServletConfig, pero todos implementan la especificación ServletConfig.

ServletConfig se traduce como el objeto de información de configuración del objeto Servlet es miembro de la especificación Servlet, el nombre completo de la clase es jakarta.servlet.ServletConfig

  • Cuando el servidor Tomcat analiza el archivo web.xml, encapsulará la información del parámetro de inicialización en la etiqueta init-param en un objeto ServletConfig.
  • Si su información de configuración es solo para un determinado servlet como referencia, configúrelo en la etiqueta init-param y use el objeto ServletConfig para obtener esta información de configuración
  • Un objeto Servlet corresponde a un objeto ServletConfig, y los objetos Servlet y ServletConfig están en correspondencia uno a uno
<servlet>
    <servlet-name>configTest</servlet-name>
    <servlet-class>com.bjpowernode.javaweb.servlet.ConfigTestServlet</servlet-class>
    <!--配置Servlet对象的初始化信息-->
    <init-param>
        <param-name>driver</param-name>
        <param-value>com.mysql.cj.jdbc.Driver</param-value>
    </init-param>
</servlet>

Cuándo crear y usar el objeto ServletConfig

  • De forma predeterminada, el servidor Tomcat creará un objeto Servlet y un objeto ServletConfig cuando el usuario envíe la primera solicitud.
  • Cuando el servidor Tomcat llama al método init parametrizado del objeto Servlet, pasa el objeto ServletConfig sobre

Servlet和ServletConfig一一对应

Configurar dos objetos Servlet en el archivo web.xml

<servlet>
    <servlet-name>configTest</servlet-name>
    <servlet-class>com.bjpowernode.javaweb.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>configTest</servlet-name>
    <url-pattern>/test</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>configTest2</servlet-name>
    <servlet-class>com.bjpowernode.javaweb.servlet.ConfigTestServlet2</servlet-class>
    <!--配置Servlet对象的初始化信息-->
    <init-param>
        <param-name>key</param-name>
        <param-value>value</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>configTest2</servlet-name>
    <url-pattern>/test2</url-pattern>
</servlet-mapping>

Los objetos Servlet y los objetos ServletConfig tienen una correspondencia uno a uno

  • El objeto ServletConfig correspondiente a ConfigTestServlet es org.apache.catalina.core.StandardWrapperFacade@287af686
  • El objeto ServletConfig correspondiente a ConfigTestServlet2 es org.apache.catalina.core.StandardWrapperFacade@287af686
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对象
        ServletConfig config = this.getServletConfig();
        // 输出ServletConfig对象: org.apache.catalina.core.StandardWrapperFacade@aea0d43
        out.print("ServletConfig对象是:" + config.toString());
        out.print("<br>");
       }
}

public class ConfigTestServlet2 extends GenericServlet {
    
    
    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
    
    
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        // 获取ServletConfig对象
        ServletConfig config = this.getServletConfig();
        // 输出ServletConfig对象: org.apache.catalina.core.StandardWrapperFacade@287af686
        out.print("ServletConfig对象是:" + config);
    }
}

ServletConfig接口中常用的方法

El servidor Tomcat encapsulará la información del parámetro de inicialización en la etiqueta init-param en un objeto ServletConfig Para obtener la información del parámetro, debe usar el método en la interfaz ServletConfig

  • GenericServlet implementa los métodos en la interfaz ServletConfig. El Servlet que escribimos puede usar esto para llamar a los métodos en GenericServlet, lo que nos ayuda a llamar a los métodos del objeto ServletConfig.
nombre del método papel del método
Cadena pública getInitParameter (nombre de la cadena) Obtenga el valor por el nombre de la etiqueta init-param
Enumeración pública< String > getInitParameterNames() Obtenga el nombre de todas las etiquetas init-param
ServletContext público getServletContext() Obtenga el objeto ServletContext (el objeto que encapsula la información del parámetro de inicialización del contexto)
cadena pública getServletName() Obtener el nombre del objeto Servlet

获取Servlet对象初始化参数方式

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <servlet>
        <servlet-name>configTest</servlet-name>
        <servlet-class>com.bjpowernode.javaweb.servlet.ConfigTestServlet</servlet-class>
        <!--配置Servlet对象的初始化信息-->
        <init-param>
            <param-name>driver</param-name>
            <param-value>com.mysql.cj.jdbc.Driver</param-value>
        </init-param>
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/bjpowernode</param-value>
        </init-param>
        <init-param>
            <param-name>user</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>root1234</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>configTest</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>  
</web-app>

El primer método: primero obtenga el objeto ServletConfig a través del método getServletConfig de la clase principal y luego llame al método del objeto Config para obtener los parámetros de inicialización del objeto Servlet

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对象
        ServletConfig config = this.getServletConfig();

        // 获取<servlet-name></servlet-name>标签中的name 
        String servletName = config.getServletName();
        out.print("<servlet-name>"+servletName+"</servlet-name>");//configTest
        out.print("<br>");

        // 获取所有初始化参数的name集合
        Enumeration<String> initParameterNames = config.getInitParameterNames();
        // 遍历集合
        while(initParameterNames.hasMoreElements()) {
    
     // 是否有更多name元素
            String parameterName = initParameterNames.nextElement(); // 取name元素
            // 通过初始化参数的name获取value
            String parameterVal = config.getInitParameter(parameterName); 
            out.print(parameterName + "=" + parameterVal);
            out.print("<br>");
        }

        // 通过初始化参数的name获取value
        String driver = config.getInitParameter("driver");
        out.print(driver);
    }
}

La segunda: utilice directamente esto para llamar al método de obtención de parámetros de inicialización proporcionados por la clase principal GenericServlet.La capa inferior es para permitir que la clase principal nos ayude a llamar al método de obtención de parámetros de inicialización del objeto ServletConfig.

// GenericServlet源码
public abstract class GenericServlet implements Servlet {
    
    
    // 成员变量
    private ServletConfig config;
    @Override
    public final void init(ServletConfig config) throws ServletException {
    
    
        this.config = config;
        this.init();
    }
    @Override
    public ServletConfig getServletConfig() {
    
    
        return config;
    }
    // GenericServlet提供的获取初始化参数的方法
    @Override
    public ServletConfig getInitParameter(String name) {
    
    
        return getServletConfig().getInitParameter(String name);
    }
    // GenericServlet提供的获取初始化参数的方法
    @Override
    public ServletConfig getInitParameterNames() {
    
    
        return getServletConfig().getInitParameterNames();
    }
}
// 测试程序
public class ConfigTestServlet extends GenericServlet {
    
    
    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
    
    
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        // 这里调用的是的GenericServlet提供的getInitParameterNames方法,底层还是调用ServletConfig对象的获取初始化参数的方法
        Enumeration<String> names = this.getInitParameterNames();
        while(names.hasMoreElements()){
    
    
            String name = names.nextElement();
            String value = this.getInitParameter(name);
            System.out.println(name + "=" + value);
        }  
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_57005976/article/details/131129357
Recomendado
Clasificación