1. 程式人生 > >servlet web.xml配置選項詳解

servlet web.xml配置選項詳解

一般的web工程中都會用到web.xml,web.xml主要包括一些配置標籤,例如Filter、Listener、Servlet等,可以用來預設容器的配置,可以方便的開發web工程。但是web.xml並不是必須的,一個web工程可以沒有web.xml檔案

<web-app>

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>

這是整個配置檔案的根標籤,web.xml的模式檔案是由Sun公司定義的,它必須標明web.xml使用的是哪個模式檔案。


<display-name>

<display-name>serTest</display-name>

它標註了該web專案的名字,提供GUI工具可能會用來標記這個特定的Web應用的一個名稱


<welcome-list-file>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file
>
default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list>

<welcome-file-list>定義了首頁檔案,也就是使用者直接輸入域名時跳轉的頁面(如http://localhost:8080/)


<servlet>

用來宣告一個servlet的資料,主要有以下子元素:

  • <servlet-name>
    指定servlet的名稱
  • <servlet-class>
    指定servlet的類名稱
  • <jsp-file>
    指定web站臺中的某個JSP網頁的完整路徑
  • <init-param>
    用來定義初始化引數,可有多個init-param。在servlet類中通過ServletConfig物件傳入init函式,通過- getInitParamenter(String name)方法訪問初始化引數
    例如使用<init-param>來初始化資料庫連線引數
public void init(ServletConfig config) throws SevletException{
	super(config);
	String driver = config.getInitParameter("driver");
	String url = config.getInitParameter("url");
	String username = config.getInitParameter("username");
	String passwd = config.getInitParameter("passwd");
	try{
		Class.forName(driver).newInstance();
		this.conn = DriverManager.getConnection(url, username, passwd);
		System.out.println("Connection successful...");
	} catch(SQLExceprion se){
		System.out.println("se");
	} catch(Exception e){
		e.printStackTrace():
	}
	
}

此時servlet配置為

<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>*.myservlet</servlet-class>
    <init-param>
        <param-name>driver</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </init-param>
    <init-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/myDatabase</param-value>
    </init-param>
    <init-param>
        <param-name>username</param-name>
        <param-value>tang</param-value>
    </init-param>
    <init-param>
        <param-name>passwd</param-name>
        <param-value>whu</param-value>
    </init-param>
</servlet>
  • <load-on-startup>
    指定當Web應用啟動時,裝載Servlet的次序。當值為正數或零時:Servlet容器先載入數值小的servlet,再依次載入其他數值大的servlet。當值為負或未定義:Servlet容器將在Web客戶首次訪問這個servlet時載入它。
  • <servlet-mapping>
    用來定義servlet所對應的URL,包含兩個子元素
  • <servlet-name>
    指定servlet的名稱
  • <url-pattern>
    指定servlet所對應的URL
<!-- 基本配置 -->
<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>*.myservlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/myServlet</url-pattern>
</servlet-mapping>


<!-- 高階配置 -->
<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>*.myservlet</servlet-class>
    <init-param>
        <param-name>foo</param-name>
        <param-value>bar</param-value>
    </init-param>
    <run-as>
        <description>Security role for anonymous access</description>
        <role-name>tomcat</role-name>
    </run-as>
</servlet>
<servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/myServlet</url-pattern>
</servlet-mapping>

需要特別注意的是</servlet-mapping>元素,這個元素規定了一個servlet-name和url-pattern,如果請求的url能夠匹配該url-pattern,則使用servlet-name指定的servlet處理該請求。

url-pattern匹配規則

按照優先順序從高到低排列:

  1. 精確匹配:類似於/myServlet的精確路徑
  2. 萬用字元匹配:/*
  3. 副檔名匹配:*.html,*.jpg ,.do ,.action之類的
  4. 預設匹配(/)——當之前匹配都不成功時

當servlet收到來自客戶端的url請求時,先把請求url減去當前專案上下文路徑,然後再與url-pattern進行匹配,匹配按照上面列出的優先順序順序進行,只要有一個匹配成功就停止,不再繼續匹配其他的。
(注:/*.action這種匹配式是錯誤的,容器無法識別同時擁有兩種匹配規則的pattern)

例子:

<!-- 配置-->
<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>*.myservlet</servlet-class>
</servlet>
myServlet
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/myServlet</url-pattern>
</servlet-mapping>

收到來自客戶端的請求http://localhost:8080/serTest/myServlet/index.html,首先將該請求url減去專案上下文得到/myServlet/index.html,之後與url-pattern進行匹配,發現/myServlet匹配成功,之後便把該請求交由servlet-name指定的myServlet處理。

另一方面,<servlet-mapping>並不是必須的,例如在如下專案中:
project目錄樹
src資料夾中是定義的兩個servlet類(Test和Img)和一個邏輯事務處理類(Output),如果我們都不設定<servlet-mapping>,則可以像如下方法進行請求
請求使用Test處理:http://localhost:8080/serTest/Test
請求使用Img處理:http://localhost:8080/serTest/Img
請求靜態圖片檔案:http://localhost:8080/serTest/img/img.jpg


<filter>

過濾器元素將一個名字與一個實現javax.servlet.Filter介面的類相關聯。


<listener>

Listener元素指出事件監聽程式類


<session-config>

配置會話超時,單位是分鐘

<session-config>
    <session-timeout>120</session-timeout>
</session-config>

<error-page>

在返回特定HTTP狀態程式碼時,或者特定型別的異常被丟擲時,能夠制定將要顯示的頁面。

更多元素參見 https://blog.csdn.net/xiuwu0423/article/details/54861184