1. 程式人生 > >web.xml配置檔案中的servlet和servlet-mapping

web.xml配置檔案中的servlet和servlet-mapping

寫了好多小專案後也沒弄明白<url-pattern>的真正意義,寫跳轉的時候也是跳的三心二意的,今天查了一下web.xml的詳細配置,看了看servlet-mapping的講解,豁然開朗,做了做小實驗,原來是這樣,捂臉。下面把看到的文章的servlet片段摘抄過來,先附上鍊接(http://blog.csdn.net/believejava/article/details/43229361)(作者如有意見,私信刪文);

容器的Context物件對請求路徑(URL)做出處理,去掉請求URL的上下文路徑後,按路徑對映規則和Servlet對映路徑(<url- pattern>)做匹配,如果匹配成功,則呼叫這個
Servlet處理請求。

servlet容器對url的匹配過程: 

當一個請求傳送到servlet容器的時候,容器先會將請求的url減去當前應用上下文的路徑作為servlet的對映url,比如我訪問的是http://localhost/test/aaa.html,我的應用上下文是test,容器會將http://localhost/test去掉,剩下的/aaa.html部分拿來做servlet的對映匹配。這個對映匹配過程是有順序的,而且當有一個servlet匹配成功以後,就不會去理會剩下的servlet了(filter不同,後文會提到)。其匹配規則和順序如下: 

1.     精確路徑匹配。例子:比如servletA 的url-pattern為 /test,servletB的url-pattern為 /* ,這個時候,如果我訪問的url為http://localhost/test ,這個時候容器就會先進行精確路徑匹配,發現/test正好被servletA精確匹配,那麼就去呼叫servletA,也不會去理會其他的servlet了。 

2.     最長路徑匹配

。例子:servletA的url-pattern為/test/*,而servletB的url-pattern為/test/a/*,此時訪問http://localhost/test/a時,容器會選擇路徑最長的servlet來匹配,也就是這裡的servletB。 

3.     擴充套件匹配,如果url最後一段包含擴充套件,容器將會根據擴充套件選擇合適的servlet。例子:servletA的url-pattern:*.action 

4.     如果前面三條規則都沒有找到一個servlet,容器會根據url選擇對應的請求資源。如果應用定義了一個default servlet,則容器會將請求丟給default servlet(什麼是default servlet?後面會講)。 

     根據這個規則表,就能很清楚的知道servlet的匹配過程,所以定義servlet的時候也要考慮url-pattern的寫法,以免出錯。 

      對於filter,不會像servlet那樣只匹配一個servlet,因為filter的集合是一個鏈,所以只會有處理的順序不同,而不會出現只選擇一個filter。Filter的處理順序和filter-mapping在web.xml中定義的順序相同。

<servlet></servlet>

  1. <!--****************************servlet配置******************************-->
  2. <!-- Spring view分發器  對所有的請求都由business對應的類來控制轉發 -->
  3. <servlet>
  4.     <servlet-name>business</servlet-name>
  5.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  6.     <init-param>
  7.       <param-name>publishContext</param-name>
  8.       <param-value>false</param-value>
  9.     </init-param>
  10.     <load-on-startup>1</load-on-startup>
  11. </servlet>
  12. <!-- 使用者登出 -->
  13. <servlet>
  14.     <servlet-name>LogOutServlet</servlet-name>
  15.     <servlet-class>com.yonyou.mcloud.cas.web.servlet.LogOutServlet</servlet-class>
  16.     <init-param>
  17.       <param-name>serverLogoutUrl</param-name>
  18.       <param-value>https://dev.yonyou.com:443/sso-server/logout</param-value>
  19.     </init-param>
  20.     <init-param>
  21.       <param-name>serverName</param-name>
  22.       <param-value>http://10.1.215.40:80/business/</param-value>
  23.     </init-param>
  24. </servlet>
  25. <!--****************************servlet對映關係配置*************************-->
  26. <servlet-mapping>
  27.     <servlet-name>LogOutServlet</servlet-name>
  28.     <url-pattern>/logout</url-pattern>
  29. </servlet-mapping>
  30. <servlet-mapping>
  31.     <servlet-name>business</servlet-name>
  32.     <url-pattern>/</url-pattern>
  33. </servlet-mapping>

Servlet通常稱為伺服器端小程式,是執行在伺服器端的程式,用於處理及響應客戶的請求。Servlet是個特殊的java類,繼承於HttpServlet。客戶端通常只有GETPOST兩種請求方式,Servlet為了響應則兩種請求,必須重寫doGet()doPost()方法。大部分時候,Servlet對於所有的請求響應都是完全一樣的,此時只需要重寫service()方法即可響應客戶端的所有請求

另外HttpServlet有兩個方法

  • init(ServletConfig config):建立Servlet例項時,呼叫該方法的初始化Servlet資源
  • destroy():銷燬Servlet例項時,自動呼叫該方法的回收資源。

通常無需重寫init()destroy()兩個方法,除非需要在初始化Servlet時,完成某些資源初始化的方法,才考慮重寫init()方法,如果重寫了init()方法,應在重寫該方法的第一行呼叫super.init(config),該方法將呼叫HttpServletinit()方法。如果需要在銷燬Servlet之前,先完成某些資源的回收,比如關閉資料庫連線,才需要重寫destory方法()

Servlet的生命週期:

建立Servlet例項有兩個時機:

  • 客戶端第一次請求某個Servlet時,系統建立該Servlet的例項,大部分Servlet都是這種Servlet
  • Web應用啟動時立即建立Servlet例項,即load-on-start Servlet

每個Servlet的執行都遵循如下生命週期:

  1. 建立Servlet例項
  2. Web容器呼叫Servletinit()方法,對Servlet進行初始化。
  3. Servlet初始化後,將一直存在於容器中,用於響應客戶端請求,如果客戶端傳送GET請求,容器呼叫ServletdoGet()方法處理並響應請求;如果客戶端傳送POST請求,容器呼叫ServletdoPost()方法處理並響應請求。或者統一使用service()方法處理來響應使用者請求。
  4. Web容器決定銷燬Servlet時,先呼叫Servletdestory()方法,通常在關閉Web應用時銷燬Servlet例項

為了讓Servlet能響應使用者請求,還必須將Servlet配置在web應用中,配置Servlet需要修改web.xml檔案

Servlet3.0開始,配置Servlet有兩種方式:

  • Servlet類中使用@WebServlet Annotation進行配置。
  • web.xml檔案中進行配置。

我們用web.xml檔案來配置Servlet,需要配置<servlet><servlet-mapping>

<servlet>用來宣告一個Servlet<icon><display-name><description>元素的用法和<filter>的用法相同。<init-param>元素與<context-param>元素具有相同的元素描述符,可以使用<init-param>子元素將初始化引數名和引數值傳遞給Servlet,訪問Servlet配置引數通過ServletConfig物件來完成,ServletConfig提供如下方法:

java.lang.String.getInitParameter(java.lang.String name):用於獲取初始化引數

ServletConfig獲取配置引數的方法和ServletContext獲取配置引數的方法完全一樣,只是ServletConfig是取得當前Servlet的配置引數,而ServletContext是獲取整個Web應用的配置引數。

  1. <description><display-name><icon>
  • <description>:為Servlet指定一個文字描述。
  • <display-name>:為Servlet提供一個簡短的名字被某些工具顯示。
  • <icon>:為Servlet指定一個圖示,在圖形管理工具中表示該Servlet
  1. <servlet-name><servlet-class><jsp-file>元素

<servlet>必須含有<servlet-name><servlet-class>,或者<servlet-name><jsp-file>描述如下:

  • <servlet-name>用來定義servlet的名稱,該名稱在整個應用中必須是惟一的
  • <servlet-class>用來指定servlet的完全限定的名稱。
  • <jsp-file>用來指定應用中JSP檔案的完整路徑。這個完整路徑必須由/開始。

如果load-on-startup元素存在,而且也指定了jsp-file元素,則JSP檔案會被重新編譯成Servlet,同時產生的Servlet也被載入記憶體。<load-on-startup>的內容可以為空,或者是一個整數。這個值表示由Web容器載入記憶體的順序。

舉個例子:如果有兩個Servlet元素都含有<load-on-startup>子元素,則<load-on-startup>子元素值較小的Servlet將先被載入。如果<load-on-startup>子元素值為空或負值,則由Web容器決定什麼時候載入Servlet。如果兩個Servlet<load-on-startup>子元素值相同,則由Web容器決定先載入哪一個Servlet

<load-on-startup>1</load-on-startup>表示啟動容器時,初始化Servlet

  1. <servlet-mapping>

<servlet-mapping>含有<servlet-name><url-pattern>

  • <servlet-name>Servlet的名字,唯一性和一致性,與<servlet>元素中宣告的名字一致。
  • <url-pattern>:指定相對於ServletURL的路徑。該路徑相對於web應用程式上下文的根路徑。<servlet-mapping>URL模式對映到某個Servlet,即該Servlet處理的URL
  1. 載入Servlet的過程

容器的Context物件對請求路徑(URL)做出處理,去掉請求URL的上下文路徑後,按路徑對映規則和Servlet對映路徑(<url- pattern>)做匹配,如果匹配成功,則呼叫這個Servlet處理請求。

  1. DispatcherServletweb.xml中的配置:
  1. <!-- Spring view分發器  對所有的請求都由business對應的類來控制轉發 -->
  2. <servlet>
  3.     <servlet-name>business</servlet-name>
  4.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5.     <init-param>
  6.       <param-name>publishContext</param-name>
  7.       <param-value>false</param-value>
  8.     </init-param>
  9.     <load-on-startup>1</load-on-startup>
  10. </servlet>
配置Spring MVC,指定處理請求的Servlet,有兩種方式:
l預設查詢MVC配置檔案的地址是:/WEB-INF/${servletName}-servlet.xml
l可以通過配置修改MVC配置檔案的位置,需要在配置DispatcherServlet時指定MVC配置檔案的位置。
我們在平臺專案兩個工程中分別使用了不同的配置方式,介紹如下:
我們在business-client工程中按照預設方式查詢MVC的配置檔案,配置檔案目錄為: /WEB-INF/business-servlet.xml。工程目錄結構如下所示:
我們在public-base-server工程中,通過第2種方式進行配置,把spring-servlet.xml放到src/main/resources/config/spring-servlet.xml,則需要在配置DispatcherServlet時指定<init-param>標籤。具體程式碼如下:
  1. <servlet>
  2.     <servlet-name>spring</servlet-name>
  3.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4.       <init-param>
  5.               <param-name>publishContext</param-name>
  6.               <param-value>false</param-value>
  7. </init-param>
  8.  <init-param>
  9.                      <param-name>contextConfigLocation</param-name>
  10.                     <param-value>classpath:config/spring-servlet.xml</param-value>
  11.            </init-param>
  12.      <load-on-startup>1</load-on-startup>
  13. </servlet>
工程目錄結構如下:
其中,classpathweb專案的類路徑,可以理解為classes下面。因為無論這些配置檔案放在哪,編譯之後如果沒有特殊情況的話都直接在classes下面。jar包的話雖然放在lib資料夾裡,但實際上那些類可以直接引用,比如:com.test.ABC,彷彿也在classes下面一樣。
在我們的工程裡,經過驗證,maven工程這兩個
路徑經過編譯後生成的檔案都位於classes目錄下,即這兩個路徑相當於類路徑,在下面建立config資料夾(folder),然後建立自定義的xml配置檔案即可。
classpathclasspath*區別:
同名資源存在時,classpath只從第一個符合條件的classpath中載入資源,而classpath*會從所有的classpath中載入符合條件的資源。classpath*,需要遍歷所有的classpath,效率肯定比不上classpath,因此在專案設計的初期就儘量規劃好資原始檔所在的路徑,避免使用classpath*來載入。
  1. ContextLoaderListenerDispatcherServlet初始化上下文關係和區別:


從上圖可以看出,ContextLoaderListener初始化的上下文載入的Bean是對於整個應用程式共享的,一般如:DAO層、ServiceBeanDispatcherServlet初始化的上下文載入的Bean是隻對Spring MVC有效的Bean,如:ControllerHandlerMappingHandlerAdapter等,該初始化上下文只加載Web相關元件。
注意:使用者可以配置多個DispatcherServlet來分別處理不同的url請求,每個DispatcherServlet上下文都對應一個自己的子Spring容器,他們都擁有相同的父Spring容器(業務層,持久(daobean所在的容器)。

相關推薦

web.xml配置檔案servletservlet-mapping

寫了好多小專案後也沒弄明白<url-pattern>的真正意義,寫跳轉的時候也是跳的三心二意的,今天查了一下web.xml的詳細配置,看了看servlet-mapping的講解,豁然開朗,做了做小實驗,原來是這樣,捂臉。下面把看到的文章的servlet片段摘抄過

web.xml配置檔案ContextLoaderListener的作用

在搭建ssm框架的時候,在web.xml配置檔案中配置監聽器listener,它的作用是在啟動web容器時,自動裝配Spring的applicationContext.xml的配置資訊。ContextLoaderListener繼承ContextLoader類,

web專案註解訪問servletweb.xml配置檔案訪問servlet的利弊

(一)web.xml配置檔案訪問servlet1.找到對應目錄下的web.xml檔案2.(1)開啟並配置servlet的對映路徑,注意servlet-mapping和servlet標籤中的servlet-name的值要相同(2)因為從瀏覽器傳送請求時,是用當前“專案(web_

servlet web.xml配置檔案

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi

讓Eclipsespring的xml配置檔案出現屬性類提示

在spring配置檔案中可以讓配置bean的時候出現提示,這裡需要做一些設定。設定包括安裝springide外掛,spring-beans-version.xsd檔案引入,增加xml編輯提示的字元,預設只有=>:。最後是讓配置檔案可以通過Spring Config Editor的方式開

web.xml配置檔案監聽器

1. web.xml 配置檔案 WEB-INF |- lib 放第三方jar包 |- classes 自己寫的servlet等java類 |- web.xml web應用程式的配置檔案 寫一個servlet 要在類上加一個 @WebServlet(urlPatterns="") 寫一

ssm框架,Java web專案的啟動流程及web.xml配置檔案

一、web.xml配置檔案 專案啟動與web.xml配置檔案密不可分,web.xml配置檔案用於初始化配置資訊,包括welcome、context-param、listener、filter、filter-mapping、servlet、servlet-mapping、其他。如下

如何獲取web專案hibernate.cfg.xml配置檔案的資料

有時候想要獲取hibernate.cfg.xml配置檔案中的資料,網路上有很多方法,有的很複雜,這裡我介紹一種很簡單的獲取方法。 hibernate.cfg.xml配置檔案中有連線資料庫所需的各種資訊,比如這裡要獲取connection.url欄位對應的url資料,如下所示

struts2web.xml配置檔案詳解

  web.xml 在Web應用程式描述符檔案表示Java Web應用程式的核心,它也是Struts框架的核心的一部分。在web.xml檔案中,Struts的定義其FilterDispatcher,在Servlet過濾器類初始化Struts框架和處理所有的請求。

javaweb web.xml 配置檔案簡述

一.  Servlet介紹: Servlet通常稱為伺服器端小程式,是執行在伺服器端的程式,用於處理及響應客戶的請求。Servlet是個特殊的java類,繼承於HttpServlet。客戶端通常只有GET和POST兩種請求方式,Servlet為了響應則兩種請求,必須

關於專案web.xml配置檔案裡面的spring的配置contextConfigLocation

如果沒有接觸過公司專案的小白或者剛入職不久的菜鳥,可能一直認為在web.xml中配置spring肯定是如下圖這樣的,/WEB-INF/classes/applicationContext.xml 

Spring MVC web.xml配置檔案

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-a

web.xml配置檔案

1.web.xml配置的介紹 配置一個Servlet,或者是Filter,一般都是用一個註解來完成(這種配置的方式在Servlet3.0的版本中可以實現),在舊版本中,配置檔案中還有另一種的配置的方式:web.xml檔案的配置,在配置的地位上與註解的方式是沒有區

部署struts2專案到Tomcat伺服器中報錯:Dispatcher initialization failed 以及 Tomcat 始終載入同一個專案的web.xml配置檔案資訊

嚴重: Dispatcher initialization failed Unable to load configuration. - action - file:/E:/apache-tomcat-7.0.85/webapps/StrutsDemo/WEB-INF/classes/struts

spring xml配置檔案標籤的含義

例如在spring-config.xml檔案頭看到如下的配置: <beans xmlns="http://www.springframework.org/schema/beans"          xmlns:xsi="http://www.w3.o

XML配置檔案使用properties檔案的鍵值作為變數化引數

背景XML檔案中的引數如果寫成固定值,每當有更新的時候需要一個一個的去修改,很麻煩。利用resources下的property檔案可以很方便的在部署執行階段改變一些特定配置屬性,比如資料庫連線等。然後在程式中根據鍵名使用property檔案中的特定屬性。在Spring中也可以

Tomcat學習—Tomcat的web.xml配置檔案

今天開始學習Tomcat的配置檔案,自己學習和上網檢視整理web.xml 的筆記! 1:web.xml配置簡介: (1)、預設(歡迎)檔案的設定  在\conf\web.xml中,<welcom

Eclipse JEE 3.6 以上版本新建web專案後,WEB-INF下沒有web.xml配置檔案

原因是: 新建面板上的  “Dynamic web module version” 選項,預設是 servlet 3.0的版本,該版本,預設是沒有web.xml檔案的,如果你習慣老版本規範,當在你新建工程的時候,不要單擊 finish按鈕直接完成建立,單擊 next 按鈕,在最後一步,選中: “Genera

log4j.xml配置檔案引入變數

Boss最初建議,修改Tomcat的啟動指令碼,在裡面增加變數配置,比如“-Dlog4jOutputPath=c:/log4j”。    我一聽,就不太贊成這種做法了。對於開發與運維都是一撥人,經常需要和其它開發人員交流的情況,修改Tomcat自身的配置比較麻煩。為什麼這麼

史上最全web.xml配置檔案元素詳解

一、web.xml配置檔案常用元素及其意義預覽 1 <web-app> 2 3 <!--定義了WEB應用的名字--> 4 <display-name></display-name>