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容器對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. 最長路徑匹配
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>
- <!--****************************servlet配置******************************-->
- <!-- Spring view分發器 對所有的請求都由business對應的類來控制轉發 -->
- <servlet>
- <servlet-name>business</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>publishContext</param-name>
- <param-value>false</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <!-- 使用者登出 -->
- <servlet>
- <servlet-name>LogOutServlet</servlet-name>
- <servlet-class>com.yonyou.mcloud.cas.web.servlet.LogOutServlet</servlet-class>
- <init-param>
- <param-name>serverLogoutUrl</param-name>
- <param-value>https://dev.yonyou.com:443/sso-server/logout</param-value>
- </init-param>
- <init-param>
- <param-name>serverName</param-name>
- <param-value>http://10.1.215.40:80/business/</param-value>
- </init-param>
- </servlet>
- <!--****************************servlet對映關係配置*************************-->
- <servlet-mapping>
- <servlet-name>LogOutServlet</servlet-name>
- <url-pattern>/logout</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>business</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
Servlet通常稱為伺服器端小程式,是執行在伺服器端的程式,用於處理及響應客戶的請求。Servlet是個特殊的java類,繼承於HttpServlet。客戶端通常只有GET和POST兩種請求方式,Servlet為了響應則兩種請求,必須重寫doGet()和doPost()方法。大部分時候,Servlet對於所有的請求響應都是完全一樣的,此時只需要重寫service()方法即可響應客戶端的所有請求。
另外HttpServlet有兩個方法
- init(ServletConfig config):建立Servlet例項時,呼叫該方法的初始化Servlet資源。
- destroy():銷燬Servlet例項時,自動呼叫該方法的回收資源。
通常無需重寫init()和destroy()兩個方法,除非需要在初始化Servlet時,完成某些資源初始化的方法,才考慮重寫init()方法,如果重寫了init()方法,應在重寫該方法的第一行呼叫super.init(config),該方法將呼叫HttpServlet的init()方法。如果需要在銷燬Servlet之前,先完成某些資源的回收,比如關閉資料庫連線,才需要重寫destory方法()。
Servlet的生命週期:
建立Servlet例項有兩個時機:
- 客戶端第一次請求某個Servlet時,系統建立該Servlet的例項,大部分Servlet都是這種Servlet。
- Web應用啟動時立即建立Servlet例項,即load-on-start Servlet。
每個Servlet的執行都遵循如下生命週期:
- 建立Servlet例項。
- Web容器呼叫Servlet的init()方法,對Servlet進行初始化。
- Servlet初始化後,將一直存在於容器中,用於響應客戶端請求,如果客戶端傳送GET請求,容器呼叫Servlet的doGet()方法處理並響應請求;如果客戶端傳送POST請求,容器呼叫Servlet的doPost()方法處理並響應請求。或者統一使用service()方法處理來響應使用者請求。
- Web容器決定銷燬Servlet時,先呼叫Servlet的destory()方法,通常在關閉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應用的配置引數。
- <description>、<display-name>和<icon>
- <description>:為Servlet指定一個文字描述。
- <display-name>:為Servlet提供一個簡短的名字被某些工具顯示。
- <icon>:為Servlet指定一個圖示,在圖形管理工具中表示該Servlet。
- <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。
- <servlet-mapping>
<servlet-mapping>含有<servlet-name>和<url-pattern>
- <servlet-name>:Servlet的名字,唯一性和一致性,與<servlet>元素中宣告的名字一致。
- <url-pattern>:指定相對於Servlet的URL的路徑。該路徑相對於web應用程式上下文的根路徑。<servlet-mapping>將URL模式對映到某個Servlet,即該Servlet處理的URL。
- 載入Servlet的過程
容器的Context物件對請求路徑(URL)做出處理,去掉請求URL的上下文路徑後,按路徑對映規則和Servlet對映路徑(<url- pattern>)做匹配,如果匹配成功,則呼叫這個Servlet處理請求。
- DispatcherServlet在web.xml中的配置:
- <!-- Spring view分發器 對所有的請求都由business對應的類來控制轉發 -->
- <servlet>
- <servlet-name>business</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>publishContext</param-name>
- <param-value>false</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </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>標籤。具體程式碼如下:
- <servlet>
- <servlet-name>spring</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>publishContext</param-name>
- <param-value>false</param-value>
- </init-param>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:config/spring-servlet.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
工程目錄結構如下:
其中,classpath是web專案的類路徑,可以理解為classes下面。因為無論這些配置檔案放在哪,編譯之後如果沒有特殊情況的話都直接在classes下面。jar包的話雖然放在lib資料夾裡,但實際上那些類可以直接引用,比如:com.test.ABC,彷彿也在classes下面一樣。
在我們的工程裡,經過驗證,maven工程這兩個
路徑經過編譯後生成的檔案都位於classes目錄下,即這兩個路徑相當於類路徑,在下面建立config資料夾(folder),然後建立自定義的xml配置檔案即可。
classpath和classpath*區別:
同名資源存在時,classpath只從第一個符合條件的classpath中載入資源,而classpath*會從所有的classpath中載入符合條件的資源。classpath*,需要遍歷所有的classpath,效率肯定比不上classpath,因此在專案設計的初期就儘量規劃好資原始檔所在的路徑,避免使用classpath*來載入。
- ContextLoaderListener和DispatcherServlet初始化上下文關係和區別:
從上圖可以看出,ContextLoaderListener初始化的上下文載入的Bean是對於整個應用程式共享的,一般如:DAO層、Service層Bean;DispatcherServlet初始化的上下文載入的Bean是隻對Spring MVC有效的Bean,如:Controller、HandlerMapping、HandlerAdapter等,該初始化上下文只加載Web相關元件。
注意:使用者可以配置多個DispatcherServlet來分別處理不同的url請求,每個DispatcherServlet上下文都對應一個自己的子Spring容器,他們都擁有相同的父Spring容器(業務層,持久(dao)bean所在的容器)。
相關推薦
web.xml配置檔案中的servlet和servlet-mapping
寫了好多小專案後也沒弄明白<url-pattern>的真正意義,寫跳轉的時候也是跳的三心二意的,今天查了一下web.xml的詳細配置,看了看servlet-mapping的講解,豁然開朗,做了做小實驗,原來是這樣,捂臉。下面把看到的文章的servlet片段摘抄過
web.xml配置檔案中ContextLoaderListener的作用
在搭建ssm框架的時候,在web.xml配置檔案中配置監聽器listener,它的作用是在啟動web容器時,自動裝配Spring的applicationContext.xml的配置資訊。ContextLoaderListener繼承ContextLoader類,
web專案中註解訪問servlet和web.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
讓Eclipse中spring的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資料,如下所示
struts2中的web.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>