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匹配規則
按照優先順序從高到低排列:
- 精確匹配:類似於/myServlet的精確路徑
- 萬用字元匹配:/*
- 副檔名匹配:*.html,*.jpg ,.do ,.action之類的
- 預設匹配(/)——當之前匹配都不成功時
當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>並不是必須的,例如在如下專案中:
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