springmvc.xml 中 節點詳解


1.  先來上段常見的代碼

 1     <!-- MVC Servlet -->
 2     <servlet>
 3         <servlet-name>springServlet</servlet-name>
 4         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 5         <init-param>
 6             <param-name>contextConfigLocation</param-name>
 7             <param-value>classpath*:/spring-mvc*.xml</param-value>
 8         </init-param>
 9         <load-on-startup>1</load-on-startup>
10     </servlet>
11     <servlet-mapping>
12         <servlet-name>springServlet</servlet-name>
13         <url-pattern>/</url-pattern>
14     </servlet-mapping>
15     
16     <filter>
17         <filter-name>encodingFilter</filter-name>
18         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
19         <init-param>
20             <param-name>encoding</param-name>
21             <param-value>UTF-8</param-value>
22         </init-param>
23         <init-param>
24             <param-name>forceEncoding</param-name>
25             <param-value>true</param-value>
26         </init-param>
27     </filter>
28     <filter-mapping>
29         <filter-name>encodingFilter</filter-name>
30         <url-pattern>/*</url-pattern>
31     </filter-mapping>

正所謂mvc配置千篇一律,不過這個<url-pattern>/</url-pattern> 跟 <url-pattern>/*</url-pattern> 概念還是有點模糊。

 

2.  兩者的解釋

2.1  <url-pattern>/</url-pattern>

會匹配到/login這樣的路徑型的url,不會匹配到模式為*.jsp這樣的后綴型url,言外之意就是不攔截jsp文件。

故經過視圖解析器后返回jsp視圖時不會再進入DispatcherServlet。

說到為什么JSP頁面的請求並不會命中這個Servlet,那是因為servlet容器內建的JSP Servlet將會被調用,而這個容器內建的JSP Servlet已經默認地映射在了*.jsp上。但還是能攔截到靜態資源,如*.js,*.css。

 

2.2  <url-pattern>/*</url-pattern>

會匹配所有的url:路徑型的和后綴型的url(包括/login,*.jsp,*.js和*.html等)。

故經過視圖解析器后返回jsp視圖時會再進入DispatcherServlet,導致找不到對應的controller所以報404錯。

No mapping found for HTTP request with URI [/Shiro-Spring/WEB-INF/jsp/login.jsp] in DispatcherServlet with name ‘springmvc’

 

3.  /和/*的區別總結

先說一種問題,假設你方法請求后想返回index.jsp界面:return "index";

如果配置成< url-pattern > /* </ url-pattern >這樣,即使你配置了如下這些同樣會報錯。

<!-- 配置視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     <!-- 前綴 -->
     <property name="prefix" value="/WEB-INF/jsp/" />
     <!-- 后綴 -->
     <property name="suffix" value=".jsp" />
</bean>

錯誤提示:

org.springframework.web.servlet.DispatcherServlet noHandlerFound
警告: No mapping found for HTTP request with URI [/myspring/WEB-INF/jsp/index.jsp] in DispatcherServlet with name ‘spring’ 錯誤,
也就是找不到 index.jsp

通過這種錯誤配置再來看一下兩者區別吧:

< url-pattern > / </ url-pattern > 不會匹配到*.jsp,即:*.jsp不會進入spring的 DispatcherServlet類 。

< url-pattern > /* </ url-pattern > 會匹配*.jsp,會出現返回jsp視圖時再次進入spring的DispatcherServlet 類,重復的去分配到方法里面,最終導致找不到對應的controller所以報404錯。

 

總之,關於web.xml的url映射的小知識:
< url-pattern>/</url-pattern> 會匹配到/login這樣的路徑型url,不會匹配到模式為*.jsp這樣的后綴型url
< url-pattern>/*</url-pattern> 會匹配所有url:路徑型的和后綴型的url(包括/login,*.jsp,*.js和*.html等)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM