之前在学习SpringMVC、SpringSecurity时,会用到Filter,需要对Filter进行参数配置,而Filter本质上也是一个Servlet,然后对Servlet设置初始化参数已经忘记了,所以打算重新回顾并整理Servlet这一部分的内容(虽然在目前的开发中已经不会用原生的Servlet进行开发了,但还是想了解一下)
当Servelt第一次被访问时,此时有web容器负责创建Servlet实例,然后调用init()方法来对Servelt进行初始化配置,然后调用service()方法来处理请求,当web容器关闭时,会调用destroy()方法来销毁Servlet实例。
还有一个比较重要的接口是ServletConfig,这是一个Servlet的配置对象,封装了Servelt实例的一些配置信息,例如初始化参数,Servlet的名称等。
当调用Servlet的init()方法进行初始化时,会将ServletConfig对象传递给init()方法,进行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 !!!");
}
}
在
标签中,通过嵌套
来设置初始化参数
<servlet>
<servlet-name>helloservlet-name>
<servlet-class>com.liumingkai.web.IndexServletservlet-class>
<init-param>
<param-name>MyLocationparam-name>
<param-value>ShanDong-WeiHaiparam-value>
init-param>
<init-param>
<param-name>passwordparam-name>
<param-value>123456param-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>helloservlet-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)]
因为这些初始化参数会先被封装到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中通过
来设置
<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>passwordparam-name>
<param-value>123456param-value>
context-param>
<context-param>
<param-name>whereparam-name>
<param-value>ShanDong-WeiHaiparam-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);
}
}