1. 程式人生 > >配置servlet時/和/*的區別

配置servlet時/和/*的區別

我們都知道在基於Spring的Application中,需要在web.xml中增加下面類似的配置資訊:
  <listener>
  <listener-class>
  org.springframework.web.context.ContextLoaderListener
  </listener-class>
  </listener>

  <!--   Spring MVC Servlet -->

  <servlet>
  <servlet-name>servletName</servlet-name>
  <servlet-class>
  org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
  <servlet-name>servletName</servlet-name>
  <url-pattern>/</url-pattern>
  </servlet-mapping>
  此處需要特別強調的是 <url-pattern>/</url-pattern>使用的是/,而不是/*,如果使用/*,那麼請求時可以通過DispatcherServlet轉發到相應的Action或者Controller中的,但是返回的內容,如返回的jsp還會再次被攔截,這樣導致
404錯誤
,即訪問不到jsp。所以如果以後發現總是有404錯誤的時候,別忘了check一下 <url-pattern>/</url-pattern>的配置是否是/*.
  二、其實Spring 的Servlet攔截器匹配規則(即 <url-pattern>...</url-pattern> )都可以自己定義,例:當對映為@RequestMapping("/user/add")時
  1、攔截*.do、*.htm, 例如:/user/add.do
  這是最傳統的方式,最簡單也最實用。不會導致靜態檔案(jpg,js,css)被攔截。
  2、攔截/,例如:/user/add
  可以實現現在很流行的REST風格。很多網際網路型別的應用很喜歡這種風格的URL。
  弊端:會導致靜態檔案(jpg,js,css)被攔截後不能正常顯示。想實現REST風格,事情就是麻煩一些。後面有解決辦法還算簡單。
  3、攔截/*,這是一個錯誤的方式,請求可以走到Action中,但轉到jsp時再次被攔截,不能訪問到jsp。
  三、如何訪問到靜態的檔案,如jpg,js,css?
  如果你的DispatcherServlet攔截"*.do"這樣的有後綴的URL,就不存在訪問不到靜態資源的問題。
  如果你的DispatcherServlet攔截"/",為了實現REST風格,攔截了所有的請求,那麼同時對*.js,*.jpg等靜態檔案的訪問也就被攔截了。
  我們要解決這個問題。
  目的:可以正常訪問靜態檔案,不可以找不到靜態檔案報404。
  方案一:啟用Tomcat的defaultServlet來處理靜態檔案
  <servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.jpg</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.js</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.css</url-pattern>
  </servlet-mapping>
  特點:1.  要配置多個,每種檔案配置一個。
  2.  要寫在DispatcherServlet的前面, 讓 defaultServlet先攔截請求,這樣請求就不會進入Spring了。
  3. 高效能。
  備註:
  Tomcat, Jetty, JBoss, and GlassFish 自帶的預設Servlet的名字 -- "default"
  Google App Engine 自帶的 預設Servlet的名字 -- "_ah_default"
  Resin 自帶的 預設Servlet的名字 -- "resin-file"
  WebLogic 自帶的 預設Servlet的名字  -- "FileServlet"
  WebSphere  自帶的 預設Servlet的名字 -- "SimpleFileServlet"

  方案二: 在spring3.0.4以後版本提供了mvc:resources ,  使用方法:

  <!-- 對靜態資原始檔的訪問 -->
  <mvc:resources mapping="/images/**" location="/images/" />
  images/**對映到 ResourceHttpRequestHandler進行處理,location指定靜態資源的位置.可以是web application根目錄下、jar包裡面,這樣可以把靜態資源壓縮到jar包中。cache-period 可以使得靜態資源進行web cache
  如果出現下面的錯誤,可能是沒有配置<mvc:annotation-driven />的原因。
  報錯WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'
  使用<mvc:resources/>元素,把mapping的URI註冊到SimpleUrlHandlerMapping的urlMap中,
  key為mapping的URI pattern值,而value為ResourceHttpRequestHandler,
  這樣就巧妙的把對靜態資源的訪問由HandlerMapping轉到ResourceHttpRequestHandler處理並返回,所以就支援classpath目錄,jar包內靜態資源的訪問.
  另外需要注意的一點是,不要對SimpleUrlHandlerMapping設定defaultHandler.因為對static uri的defaultHandler就是ResourceHttpRequestHandler,
  否則無法處理static resources request.
  方案三 ,使用<mvc:default-servlet-handler/>
  <mvc:default-servlet-handler/>
  會把"/**" url,註冊到SimpleUrlHandlerMapping的urlMap中,把對靜態資源的訪問由HandlerMapping轉到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 處理並返回.
  DefaultServletHttpRequestHandler使用就是各個Servlet容器自己的預設Servlet.
  補充說明:多個HandlerMapping的執行順序問題:
  DefaultAnnotationHandlerMapping的order屬性值是:0
  < mvc:resources/ > 自動註冊的 SimpleUrlHandlerMapping 的order屬性值是: 2147483646
  <mvc:default-servlet-handler/>自動註冊 的SimpleUrlHandlerMapping 的order屬性值是:
2147483647

  spring會先執行order值比較小的。當訪問一個a.jpg圖片檔案時,先通過 DefaultAnnotationHandlerMapping 來找處理器,一定是找不到的,因為我們沒有叫a.jpg的Action。然後再按order值升序找,由於最後一個 SimpleUrlHandlerMapping 是匹配 "/**"的,所以一定會匹配上,就可以響應圖片。 訪問一個圖片,還要走層層匹配。不知效能如何?
  最後再說明一下,方案二、方案三 在訪問靜態資源時,如果有匹配的(近似)總攔截器,就會走攔截器。如果你在攔截中實現許可權檢查,要注意過濾這些對靜態檔案的請求。
  如何你的DispatcherServlet攔截 *.do這樣的URL字尾,就不存上述問題了。還是有後綴方便。

相關推薦

配置servlet//*的區別

我們都知道在基於Spring的Application中,需要在web.xml中增加下面類似的配置資訊:   <listener>   <listener-class>   org.springframework.web.context.ContextLoaderListener   &

web.xml中配置servleturl-pattern標籤到底是幹什麼的

以前配置web.xml都是自動生成的,昨天寫一個關於使用servlet生成驗證碼的過程中,碰到了一個問題。 就是在 <servlet> <description>&l

spring mvc 配置servlet url-pattern 為什麼配置 /* 不可以 而配置 / 則沒問題呢

我幫忙解答下吧  1、在tomcat\conf\web.xml中定義了  Java程式碼   <servlet>       <servlet-name>default</servlet-name>       <serv

mybatis mapper xml文件配置resultmap,id行result行有什麽區別

什麽 column invoice 配置 app nbsp ava customer entity mybatis mapper xml文件配置resultmap時,id行和result行有什麽區別? <resultMap id = "CashInvoiceMap"

c89c99中/運算符%運算符為負數區別

區別 str tro c99 根據 負數 cpu strong 除法 運算式 -8 / 5 = -1.6,在C89中取值為 -1 或 -2,C99的出現,CPU對除法的結果向零取整,上述運算式結果為 -1。 在C89和C99中都要確保 (a / b) * b + a % b

Spring MVC的default-servlet-handlerannotation-driven配置

spring mvc serlvet 使用spring通常配置url-pattern為/時,會代替web服務器的servlet成為default servlet,靜態資源無法訪問,添加<mvc:default-servlet-handler/>指定web服務器的servlet為defa

javax.servlet-api-xx.jarservlet-api.jar區別

tom 查詢 識別 兩個 servle src com 版本 .com 一、簡介支持servlet的jar包。應該叫servlet-api.jar如果編寫過servlet就知道要用到HttpServletRequest和HttpServletResponse等對象,這些對象

nginx的location配置root、alias用法區別

必須 del 實例 解釋 一個 clas 指定 不同的 否則 root & alias區別root與alias主要區別在於nginx如何解釋location後面的uri,這會使兩者分別以不同的方式將請求映射到服務器文件上root的處理結果是:root路徑+loca

applicationContext-XXX.xmlXXX-servlet.xml的區別

IT xxx bottom pat 官網 轉發 ota sca AC 1.ApplicationContext.xml 是spring 全局配置文件,用來控制spring 特性的 2.dispatcher-servlet.xml 是spring mvc裏面的,控制器、攔

ftp的主動模式被動模式的配置區別

ive line ip 地址 也會 邊界 操作模式 技術分享 上進 text   原文鏈接: https://blog.csdn.net/zhangyuan12805/article/details/71425385    ftp模式分為主動模式(active mode)和

關於iphone設置顯示模式為標準模式放大模式區別

設置 sca style cal ins main pan 我不 spa 參考來自:https://www.jianshu.com/p/5f61d914114b CGFloat scale = [[UIScreen mainScreen] scale]; CGFloat

nginx代理配置 配置中的靜態資源配置,root alias的區別。啟動註意事項

一閃而過 靜態資源 分享圖片 ali 後臺 nginx代理 消失 pac font 這篇主要內容是:nginx代理配置 配置中的靜態資源配置,root 和 alias的區別。啟動註意事項!   為什麽會在window上配置了nginx呢?最近我們的項目是靜態資源單獨放在一個

配置MySQL,遇到的一些問題解決方法

Q1.配置好路徑和環境變數以後,準備安裝mysql,但是顯示MySQL服務無法啟動 A:網上查了好多解決辦法,最後解決辦法是需要初始化,操作步驟為: mysql -remove mysql -install mysql -initialize Q2.正常啟動mysql後,輸入

第5章:作為Web應用:屬性監聽者/5.3 Servlet屬性引數的區別

Servlet屬性和引數的區別 型別: 屬性: 上下文屬性 請求屬性 會話屬性 引數: 上下文引數 Sevlet初始化引數 請求引

AndroidStudio2.2 Preview3中NDK開發之CMake傳統 JNI在目錄結構配置檔案上的區別

 自從AndroidStudio更新到2.2,就有了CMake和傳統JNI兩種開發NDK的方法,主要就是在目錄結構和build.gradle上的區別,下面我們將分別介紹目錄區別和build.gradle種配置的區別(提示:在第一次用CMake時,最好在新建專案時勾選Include C++

web.xml 中spring-servlet.xml application.xml 配置位置及含義

在我們進行 Spring-servlet 進行開發的時候,經常會遇到配置檔案配置的問題,要徹底的解決這個問題,我們需要了解 springMVC 設計的基本架構 1.SpringMVC 的配置分為兩部分 application.xml 和 spring-servl

被動埠配置實驗               ---ripospf協議下的區別

被動介面是為了防止其他路由器動態學習到本路由器上的路由資訊,設定本路由器的介面為Passive-interface,不允許路由更新報文從該路由器介面傳送出去。 Rip協議下的被動介面測試驗證,RIP中設定被動介面後,該介面不傳送更新報文,但是可以接受更新報文。 Osp

related、relativerelevant表示相關意思區別

相同點:均有相關的意思。 不同點: 單詞 英英 解釋 related 1.connected by kinship, common origin, or marriage 2.being connected either

related、relativerelevant表示相關意思區別例題答案

Peter asked his assistant to bring all relevant documents to tomorrow’s court hearing. The po

Gradle配置中subprojects allprojects 的區別

subprojects 和 allprojects 的區別,先給出結論,然後通過一個例子來佐證結論。 結論:allprojects是對所有project的配置,包括Root Project。而subprojects是對所有Child Project的配置 舉個例子: 新建