之前在学习SpringMVC、SpringSecurity时,会用到Filter,需要对Filter进行参数配置,而Filter本质上也是一个Servlet,然后对Servlet设置初始化参数已经忘记了,所以打算重新回顾并整理Servlet这一部分的内容(虽然在目前的开发中已经不会用原生的Servlet进行开发了,但还是想了解一下)

回顾Servlet的生命周期

当Servelt第一次被访问时,此时有web容器负责创建Servlet实例,然后调用init()方法来对Servelt进行初始化配置,然后调用service()方法来处理请求,当web容器关闭时,会调用destroy()方法来销毁Servlet实例。

还有一个比较重要的接口是ServletConfig,这是一个Servlet的配置对象,封装了Servelt实例的一些配置信息,例如初始化参数,Servlet的名称等。

当调用Servlet的init()方法进行初始化时,会将ServletConfig对象传递给init()方法,进行Servlet实例的配置。

在Servlet中是如何设置初始化参数?如何获取初始化参数的呢?

设置Servlet的初始化参数

注册Servlet的方式有两种,一种是基于XML的方式,另一种是基于注解的方式。

参数是自定义的,设置初始化参数到指定Servlet身上,只有指定的Servelt才能访问到。

在初始化Servlet实例前,这些初始化参数会封装到ServletConfig对象中,然后再将ServletConfig对象传递给Servlet的init()方法进行实例化

这是一个普通的Servlet

public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().print("Hello !!!");
    }
}

基于web.xml的方式

<servlet>标签中,通过嵌套<init-param>来设置初始化参数

<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.liumingkai.web.IndexServlet</servlet-class>
    <init-param>
        <param-name>MyLocation</param-name>
        <param-value>ShanDong-WeiHai</param-value>
    </init-param>
    <init-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

基于注解

利用@WebServlet注解的initParams属性

注意:每个参数都要使用@WebInitParam来标注

@WebServlet(value = "/", initParams = {
        @WebInitParam(name = "password", value = "123456"),
        @WebInitParam(name = "where", value = "ShanDong-WeiHai")
})
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String password = this.getInitParameter("password");
        resp.getWriter().print("Hello !!!Your password is " + password);

    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9JexJvcC-1681570187676)(https://kkbank.oss-cn-qingdao.aliyuncs.com/note-img/image-20230415223828759.png)]

获取Servlet初始化参数

因为这些初始化参数会先被封装到ServletConfig对象身上,然后将ServeltConfig对象作为参数传递给Servlet的init()方法。

所以我们可以在ServeltConfig和Servlet本身中获取这些初始化参数。

ServletConfig中获取参数的方法

在Servlet自身中可以通过this.getServletConfig()方法来获取对应的ServletConfig对象

// 根据参数名称获取参数值
String getInitParameter(String var1);
// 获取所有参数的名称
Enumeration<String> getInitParameterNames();

HttpServlet中的中获取参数的方法:

// 根据参数名称获取参数值
public String getInitParameter(String name) ;

// 获取所有的参数名称
public Enumeration<String> getInitParameterNames() ;

Servlet自身的这两个方法是通过调用ServletConfig对应方法来实现的。

全局初始化参数

每个Web应用都有唯一的一个ServletContext对象,用来代指整个Web应用的上下文,我们可以设置初始化参数到Context域,这样所有的Servlet都可以访问到,可以实现多个Serlvet之间共享数据。我们称ServletContext的参数是全局参数

在web.xml中通过<context-param>来设置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="false"
>

    <context-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
    </context-param>
    <context-param>
        <param-name>where</param-name>
        <param-value>ShanDong-WeiHai</param-value>
    </context-param>
</web-app>

想要获取全局初始化参数,首先要获取ServletContext对象

ServletContext接口中用来获取全局初始化参数的方法

// 根据参数名称获取初始化参数
String getInitParameter(String var1);

// 获取所有的参数名称
Enumeration<String> getInitParameterNames();

这样,即使一个Servlet没有设置初始化参数,还是可以读取到ServletContext身上的数据

@WebServlet(value = "/")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String password = servletContext.getInitParameter("password");
        String where = servletContext.getInitParameter("where");
        resp.getWriter().print("Hello !!!Your password is " + password + " , you are " + where);
    }
}

Servlet初始化参数设置\获取,全局初始化参数的设置、获取-LMLPHP

04-16 10:13