前言:
每個javaEE工程中都有web.xml文件,那么它的作用是什么呢?它是每個web.xml工程都必須的嗎?
一個web中可以沒有web.xml文件,也就是說,web.xml文件並不是web工程必須的。
web.xml文件是用來初始化配置信息:比如Welcome頁面、servlet、servlet-mapping、filter、listener、啟動加載級別等。
當你的web工程沒用到這些時,你可以不用web.xml文件來配置你的Application。
每個xml文件都有定義它書寫規則的Schema文件,也就是說javaEE的定義web.xml所對應的xml Schema文件中定義了多少種標簽元素,web.xml中就可以出現它所定義的標簽元素,也就具備哪些特定的功能。web.xml的模式文件是由Sun 公司定義的,每個web.xml文件的根元素為<web-app>中,必須標明這個web.xml使用的是哪個模式文件。如:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> </web-app>
web.xml的模式文件中定義的標簽並不是定死的,模式文件也是可以改變的,一般來說,隨着web.mxl模式文件的版本升級,里面定義的功能會越來越復雜,標簽元素的種類肯定也會越來越多,但有些不是很常用的,我們只需記住一些常用的並知道怎么配置就可以了。
下面列出web.xml我們常用的一些標簽元素及其功能:
1.指定歡迎頁面:
<welcome-file-list> <welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index1.jsp</welcome-file> </welcome-file-list> PS:指定了2個歡迎頁面,顯示時按順序從第一個找起,如果第一個存在,就顯示第一個,后面的不起作用。如果第一個不存在,就找第二個,以此類推。
2、命名與定制URL。我們可以為Servlet和JSP文件命名並定制URL,其中定制URL是依賴命名的,命名必須在定制URL前。下面拿serlet來舉例:
(1)、為Servlet命名: <servlet> <servlet-name>servlet1</servlet-name> <servlet-class>org.whatisjava.TestServlet</servlet-class> </servlet> (2)、為Servlet定制URL、 <servlet-mapping> <servlet-name>servlet1</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
3、定制初始化參數:可以定制servlet、JSP、Context的初始化參數,然后可以再servlet、JSP、Context中獲取這些參數值。
<servlet> <servlet-name>servlet1</servlet-name> <servlet-class>org.whatisjava.TestServlet</servlet-class> <init-param> <param-name>userName</param-name> <param-value>Daniel</param-value> </init-param> <init-param> <param-name>E-mail</param-name> <param-value>125485762@qq.com</param-value> </init-param> </servlet> 經過上面的配置,在servlet中能夠調用getServletConfig().getInitParameter("param1")獲得參數名對應的值。
4、指定錯誤處理頁面,可以通過“異常類型”或“錯誤碼”來指定錯誤處理頁面。
<error-page> <error-code>404</error-code> <location>/error404.jsp</location> </error-page> ----------------------------- <error-page> <exception-type>java.lang.Exception<exception-type> <location>/exception.jsp<location> </error-page>
5、設置過濾器:比如設置一個編碼過濾器,過濾所有資源
<filter> <filter-name>XXXCharaSetFilter</filter-name> <filter-class>net.test.CharSetFilter</filter-class> </filter> <filter-mapping> <filter-name>XXXCharaSetFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
6、設置監聽器:
<listener> <listener-class>net.test.XXXLisenet</listener-class> </listener>
7、設置會話(Session)過期時間,其中時間以分鍾為單位,假如設置60分鍾超時:
<session-config> <session-timeout>60</session-timeout> </session-config>
Servlet配置及含義:
這里其實最想說的是配置中各個節點含義:
<!-- 配置一個servlet --> <!-- servlet的配置 --> <servlet> <!-- servlet的內部名稱,自定義。盡量有意義 --> <servlet-name>ServletDemo</servlet-name> <!-- servlet的類全名: 包名+簡單類名 --> <servlet-class>lm.practice.ServletDemo</servlet-class> </servlet> <!-- servlet的映射配置 --> <servlet-mapping> <!-- servlet的內部名稱,一定要和上面的內部名稱保持一致!! --> <servlet-name>ServletDemo</servlet-name> <!-- servlet的映射路徑(訪問servlet的名稱) --> <url-pattern>/servlet</url-pattern> </servlet-mapping>
可以看到,在配置Servlet時,有兩個地方需要配置,一個是<servlet>,另一個是<servlet-Mapping>,這兩個一個是配置Servlet,一個是配置其映射信息,其中<servlet>中的<servlet-name>可以隨意指定,但要有一定的意義,一般取為類的名稱,例如我的類名為ServletDemo,這里取名為ServletDemo,下面的<servlet-class>是類的全路徑,package+calssname,一定要是全路徑!
<servlet-Mapping>是映射信息,它也有一個<servlet-name>,里面的名字是對應的Servlet名,也就是我們上面配置的Servlet名字,這里是ServletDemo,下面的是映射路徑,也就是訪問Servlet的名稱,這里也是以方便和有意義為前提的,是我們在訪問Servlet在瀏覽器地址欄后面輸入的那個信息,例如我的映射路徑命名為/servlet,在地址欄中輸入http://localhost/20170323/servlet
注意:這里的映射路徑一定不是丟掉/,否則就會出錯了,一定要寫成/servlet,不能是servlet
這里說一下在配置映射路徑的時候,有以下兩種:
url-pattern | 瀏覽器輸入
|
|
精確匹配 | /servlet | http://localhost:8080/day10/servlet |
模糊匹配 | /* | http://localhost:8080/20170323/任意路徑 |
/lm/* | http://localhost:8080/20170323/lm/任意路徑 | |
*.后綴名 *.do *.action *.html(偽靜態) |
http://localhost:8080/20170323/任意路徑.do |
下面是項目中web.xml文件中springmvc的Servlet配置信息:
<!-- Spring MVC servlet --> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!-- 此處可以可以配置成*.do,對應struts的后綴習慣 --> <url-pattern>/</url-pattern> </servlet-mapping>
<servlet> <servlet-name>jobDispatcherServlet</servlet-name> <servlet-class>com.suning.framework.uts.client.core.JobDispatcherServlet</servlet-class> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jobDispatcherServlet</servlet-name> <url-pattern>/jobDispatcher</url-pattern> </servlet-mapping>
<session-config> <session-timeout>30</session-timeout> </session-config>
【注意】:
1)url-pattern要么以 / 開頭,要么以*開頭。 絕對不能漏掉斜杠!!!!!!!!!
2)不能同時使用兩種模糊匹配,例如 /lm/*.do是非法路徑
3)當有輸入的URL有多個servlet同時被匹配的情況下:
3.1 精確匹配優先。(長的最像優先被匹配)
3.2 以后綴名結尾的模糊匹配先級最低!!!
參考文章
1、web.xml文件的作用:https://www.cnblogs.com/yqskj/articles/2233061.html
2、web.xml中servlet配置及其含義:https://blog.csdn.net/m0_37630602/article/details/65443660