Servlet-配置信息簡析

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實例!
現在我們再來總結下上述試驗發現:

  1. 根據配置的方式不同,創建ServletConfig實例時封裝的信息不同。
  2. 配置方式不同,容器會生成對應的Servlet實例,根據銷燬時的信息可以發現

此外,標註配置同web.xml配置的url不能相同,否則會引發異常。此外web內不可以配置不同的映射關係,否則容易引發異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章