springmvc的DispatcherServlet攔截以及訪問靜態資源html、js、css 404問題


之前一直使用*.do來做的,但是絕的*.do很丑,於是就改用“/”來配置:

1
2
3
4
5
6
7
8
9
10
< servlet >
      < servlet-name >dispatcherServlet</ servlet-name >
      < servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class >
      < load-on-startup >1</ load-on-startup >
  </ servlet >
 
  < servlet-mapping >
      < servlet-name >dispatcherServlet</ servlet-name >
      < url-pattern >/</ url-pattern >
  </ servlet-mapping >

但是帶來的問題是如何訪問到靜態的文件,如jpg,js,css?

如果你的DispatcherServlet攔截"*.do"這樣的有后綴的URL,就不存在訪問不到靜態資源的問題。

如果你的DispatcherServlet攔截"/",為了實現REST風格,攔截了所有的請求,那么同時對*.js,*.jpg等靜態文件的訪問也就被攔截了。

我們要解決這個問題。

 

目的:可以正常訪問靜態文件,不可以找不到靜態文件報404。

方案一:激活Tomcat的defaultServlet來處理靜態文件

1
2
3
4
5
6
7
8
9
10
11
12
< 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 >

  

要寫在DispatcherServlet的前面, 讓 defaultServlet先攔截請求,這樣請求就不會進入Spring了,我想性能是最好的吧。

 

Tomcat, Jetty, JBoss, and GlassFish 自帶的默認Servlet的名字 -- "default"
Google App Engine 自帶的 默認Servlet的名字 -- "_ah_default"
Resin 自帶的 默認Servlet的名字 -- "resin-file"
WebLogic 自帶的 默認Servlet的名字  -- "FileServlet"
WebSphere  自帶的 默認Servlet的名字 -- "SimpleFileServlet" 

 另外還有其余兩種解決方法,大家可以參看:http://blog.csdn.net/this_super/article/details/7884383

 

###################################################################################

 

spring mvc 靜態資源 404問題

在web.xml配置servlet-mapping的時候,如果url-pattern設置為“/” (如下),很多人都會遇到導入js,css,圖片等靜態資源出現Firefox調試窗口會報出的404錯誤,而你的確也不能訪問那些資源

<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

百度了很久,大致有3種方法:但是我仍然沒有解決404問題,后來又google了一下,發現少了一個關鍵的地方(在百度搜索中都沒提到的一個地方,所以認為比較關鍵 :)),就是在jsp頁面中導入靜態資源的時候需要用<c:url>標簽。

例如:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<script type="text/javascript" src='<c:url value="/js/jquery.js"></c:url>'></script>

這里的c:url中 value的值也是需要特別注意到地方,見下面3種方法詳細說明:

 

方法1. 修改web.xml文件,增加對靜態資源的url映射

如:

<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>

在web.xml中添加好配置后,在jsp頁面就可以引用這些靜態資源了,但需要用<c:url value="">,

如:

 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<script type="text/javascript" src='<c:url value="/js/jquery.js"></c:url>'></script>

這里還需要說明的是:這種方法不能訪問WEB-INF目錄下的靜態資源,也就是js目錄必須是web根(可能是webapp,webContent等)目錄下,否則是不能引用的;

如果放在WEB-INF目錄下,即使你使用<c:url value=“/WEB-INF/js/jquery.js”>也是會出現404錯誤的。

 

百度時發現:以下各容器的default servlet名字,而且還提到靜態資源servlet映射需要寫在dispatcherServlet的前面;我在Jboss-eap-5.1中測試過,前后沒有關系;所以可能是容器或者版本的關系吧。

Tomcat, Jetty, JBoss, and GlassFish  默認 Servlet的名字 -- "default"
Google App Engine 默認 Servlet的名字 -- "_ah_default"
Resin 默認 Servlet的名字 -- "resin-file"
WebLogic 默認 Servlet的名字  -- "FileServlet"
WebSphere  默認 Servlet的名字 -- "SimpleFileServlet" 

 

 

方法2.在相應的 -servlet.xml中添加spring配置<mvc:default-serlvet-handler>

如:

<mvc:default-servlet-handler/>

這種方法只需要添加一行代碼,在jsp頁面中引用時和方法1一樣,同樣也不能引用WEB-INF下的資源。

 

方法3.使用spring 3.0.4的新特性,在相應的 -servlet.xml中添加配置<mvc:resource>

如:

3.1 <mvc:resources location="/js/" mapping="/js/**" />

3.2 <mvc:resources location="/WEB-INF/js/" mapping="/js/**" />

這種方法我寫了兩個配置,不同的地方只是location的值,一個是“/js/”,一個是“/WEB-INF/js/”;兩種都可以,根據你自己的目錄結構來引用。這就說明使用這種方式可以引用WEB-INF目錄下的靜態資源;這里的mapping屬性的值用了ant的通配符方式,"/js/**"(兩個"*")指location的值所表示的目錄以及所有子目錄;但是在jsp頁面中引用時需要注意:

<c:url value="/js/jquery.js"> value的值必須類似於mapping屬性的值,如果是3.1方式的配置,則引用的是web根目錄下js/jquery.js,如果是3.2方式的配置,則引用的是web根目錄下WEB-INF/js/jquery.js;

<c:url value="/js/ui/jquery-ui.js"> 則引用location目錄下子目錄ui下的jquery-ui.js。


免責聲明!

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



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