web.xml檔案詳解
# 前言:一般的web工程都會用到web.xml,web .xml主要用來配置,可以方便的開發web工程。 web.xml主要用來設定Filter、Listener、Servlet等。但是要說明的是web.xml並不是必須的,一個web工程可以沒有web.xml檔。
1、WEB工程載入web.xml流程
經過個人測試,WEB工程載入順序與元素節點在檔案中的配置順序無關。即不會因為 filter 寫在 listener 的前面而會先載入 filter。 WEB容器的載入順序是:ServletContext -> context-param -> listener -> filter -> servlet。並且這些元素可以配置在文件中的任意位置。
載入過程順序如下:
#啟動一個WEB專案的時候,WEB容器會去讀取它的設定檔web.xml,讀取
緊急著,容創建一個ServletContext(servlet上下文),這個web專案的所有部分都將共享這個上下文。
容器將
容器建立
2、web.xml檔案元素詳解
1、schema
web.xml的模式檔案是由Sun公司定義的,每個web.xml檔案的根元素
<?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>
2、
指出IDE與GUI工具用來表示Web應用的大圖標和小圖標。
<icon> <small-icon>/images/app_small.gif</small-icon> <large-icon>/images/app_large.gif</large-icon></icon>
3、
提供GUI工具可能會用來標記這個特定的Web應用的一個名稱
<display-name>Tomcat Example</display-name>
4、
給於此相關的說明性文字
<disciption>Tomcat Example servlets and JSP pages.</disciption>
5、
聲明應用範圍內的初始化參數。它用於向 ServletContext提供鍵值對,即應用程式上下文資訊。我們的listener, filter等初始化時會用到這些上下文中的信息。在servlet裡面可以透過getServletContext().getInitParameter("context/param")得到。
<context-param> <param-name>ContextParameter</para-name> <param-value>test</param-value> <description>It is a test parameter.</description></context-param>
6、
## 將一個名字與一個實現一個實作xs.servlet.Filter介面的類別相關聯。
<filter> <filter-name>setCharacterEncoding</filter-name> <filter-class>com.myTest.setCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param></filter><filter-mapping> <filter-name>setCharacterEncoding</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
7、
<listener> <listerner-class>com.listener.SessionListener</listener-class> </listener>
8、
#
#
<!-- 基本配置 --><servlet> <servlet-name>snoop</servlet-name> <servlet-class>SnoopServlet</servlet-class></servlet><servlet-mapping> <servlet-name>snoop</servlet-name> <url-pattern>/snoop</url-pattern></servlet-mapping><!-- 高级配置 --><servlet> <servlet-name>snoop</servlet-name> <servlet-class>SnoopServlet</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>snoop</servlet-name> <url-pattern>/snoop</url-pattern></servlet-mapping>
9、
单位为分钟。
<session-config> <session-timeout>120</session-timeout></session-config>
10、
<mime-mapping> <extension>htm</extension> <mime-type>text/html</mime-type></mime-mapping>
11、
<welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file></welcome-file-list>
12、
<!-- 1、通过错误码来配置error-page。当系统发生×××错误时,跳转到错误处理页面。 --><error-page> <error-code>404</error-code> <location>/NotFound.jsp</location></error-page><!-- 2、通过异常的类型配置error-page。当系统发生java.lang.NullException(即空指针异常)时,跳转到错误处理页面。 --><error-page> <exception-type>java.lang.NullException</exception-type> <location>/error.jsp</location></error-page>
13、
<jsp-config> <taglib> <taglib-uri>Taglib</taglib-uri> <taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location> </taglib> <jsp-property-group> <description>Special property group for JSP Configuration JSP example.</description> <display-name>JSPConfiguration</display-name> <url-pattern>/jsp/* </url-pattern> <el-ignored>true</el-ignored> <page-encoding>GB2312</page-encoding> <scripting-invalid>true</scripting-invalid> <include-prelude>/include/prelude.jspf</include-prelude> <include-coda>/include/coda.jspf</include-coda> </jsp-property-group></jsp-config>
对于Web 应用程式来说,Scriptlet 是个不乐意被见到的东西,因为它会使得HTML 与Java 程式码交相混杂,对于程式的维护来说相当的麻烦,必要的时候,可以在web.xml 中加上
3、Mapping规则
当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了。
其匹配规则和顺序如下:
精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先 进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。
最長路徑匹配。範例:servletA的url-pattern為/test/*,而servletB的url-pattern為/test/a/*,此時造訪http://localhost/test/a時,容器會選擇路徑最長的servlet來匹配,也就是這裡的servletB。
擴展匹配,如果url最後一段包含擴展,容器將會根據擴展選擇合適的servlet。範例:servletA的url-pattern:*.action
# 以」/'開頭和以」/*」結尾的是用來做路徑映射的。以前綴”*.”開頭的是用來做擴展映射的。 所以,為什麼定義”/*.action”這樣一個看起來很正常的匹配會錯?導致容器無法判斷。
以上是web.xml文件內容詳細分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!