Servlet-ServletConfig

Servlet-ServletConfig

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

Tomcat在初始化Servlet时,将ServletConfig也转换成其对象

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    private transient ServletConfig config;
    //此方法将Servlet配置文件赋值给了类型ServletConfig的对象,以便在Servlet类中获取配置文件里的内容
	public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }
}

配置初始参数

在web.xml文件中可使用init-param标签配置一些初始参数

<?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_6_0.xsd"
         version="6.0">
    <servlet>
        <servlet-name>ServletConfig</servlet-name>
        <servlet-class>com.xiaobai.servlet.ServletConfig</servlet-class>
        <init-param>	
            <param-name>keyA</param-name>
            <param-value>valueA</param-value>·2
        </init-param>
        <init-param>
            <param-name>keyB</param-name>
            <param-value>valueB</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletConfig</servlet-name>
        <url-pattern>/ServletConfig</url-pattern>
    </servlet-mapping>
</web-app>

配置初始参数-注解配置

同样的,我们也可以使用注解的方式来配置初始参数,但这里我们使用了一种类似与注解嵌套的方式来配置多个键值对

public @interface WebServlet {
    WebInitParam[] initParams() default {};
}

public @interface WebInitParam {
    String name();

    String value();

    String description() default "";
}
@WebServlet(
        value = "/ServletConfig",
        initParams = {
                @WebInitParam(name="keyA",value = "ValueA"),
                @WebInitParam(name="keyB",value = "ValueB")
        }
)
public class ServletConfigTest extends HttpServlet {
	//…………
}

获取初始参数

ServletConfig的方法

  • getInitParameter("keyA"):根据key获取value
  • getInitParameterNames():返回Enumeration<>类型的对象,此对象中有所有的初始参数的key

Enumeration<>的方法

  • hasMoreElements():判断有没有下一个参数,如果有返回true,没有则返回false、
  • nextElement():取出当前元素,向下移动游标

所以,我们可以在Servlet中获取初始参数

public class ServletConfigTest extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletConfig servletconfig = getServletConfig();
        //根据参数名获取参数值(单个获取)
        String keyA = servletconfig.getInitParameter("keyA");
        System.out.println("KeyA: " + keyA);

        //获取所有初始参数
        //hasMoreElements方法判断有没有下一个参数,如果有返回true,没有则返回false
        //nextElement方法取出下一个元素,向下移动游标
        Enumeration<String> initParameterNames = servletconfig.getInitParameterNames();
        while (initParameterNames.hasMoreElements()) {
            System.out.println(initParameterNames.nextElement() + " :" + servletconfig.getInitParameter(initParameterNames.nextElement()));
        }
    }
}