ServletConfig:
ServletConfig是Java的一個接口,其對應一個Servlet的配置信息。具體如下圖所示:
簡單測試:
測試之前需要先簡單瞭解下如何配置初始參數。
Java提供了兩種配置方式:a.通過web.xml,b.通過@WebServlet標註。具體如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<servlet>
<servlet-name>Random</servlet-name>
<servlet-class>ServletConfigTest</servlet-class>
<init-param>
<param-name>p3</param-name>
<param-value>v3</param-value>
</init-param>
<init-param>
<param-name>p4</param-name>
<param-value>v4</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Random</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
@WebServlet(name = "Config", urlPatterns = {"/web"},
initParams= {
@WebInitParam(name = "p1", value = "v1"),
@WebInitParam(name = "p2", value = "v2")
}
)
接下來再讓我們瞭解下SerletConfig接口的相關信息:
通過ServletConfig提供的方法獲取Servlet的name屬性以及初始配置參數信息,並且在控制檯打印相關信息:
@WebServlet(name = "Config", urlPatterns = {"/web"},
initParams= {
@WebInitParam(name = "p1", value = "v1"),
@WebInitParam(name = "p2", value = "v2")
}
)
public class ServletConfigTest implements Servlet {
private ServletConfig config;
@Override
public void destroy() {
System.out.println("destory()...");
}
@Override
public ServletConfig getServletConfig() {
return this.config;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
}
@Override
public void service(ServletRequest resq, ServletResponse resp) throws ServletException, IOException {
System.out.println(this.config.getInitParameter("p1"));
System.out.println(this.config.getInitParameter("p2"));
System.out.println(this.config.getInitParameter("p3"));
System.out.println(this.config.getInitParameter("p4"));
System.out.println(this.config.getServletName());
}
}
通過上圖可以看出,兩次的初始請求參數信息並不相同。因此我們可以推斷兩次生成的ServletConfig實例並不相同。用的不是同一個Servlet嗎?爲什麼生成的配置實例卻不相同?
仔細分析不難發現其中原因:兩次配置的url並不相同,雖然指向同一個Servlet。當請求到達服務器,容器根據映射關係查找到對應的Servlet,並且生成其對應實例(生成了兩個實例,所以也生成了兩個ServletConfig實例),ServletConfig是對配置信息文件的封裝,但是根據試驗結果可以推出,容器會根據配置信息方式的不同加載不同的配置信息,生成不同的配置對象。通過下述試驗也可驗證我們的猜想:
destory()方法被調用了兩次!說明容器確實生成了兩個Servlet實例!
現在我們再來總結下上述試驗發現:
- 根據配置的方式不同,創建ServletConfig實例時封裝的信息不同。
- 配置方式不同,容器會生成對應的Servlet實例,根據銷燬時的信息可以發現
此外,標註配置同web.xml配置的url不能相同,否則會引發異常。此外web內不可以配置不同的映射關係,否則容易引發異常。