1. 程式人生 > >Springmvc框架靜態資源訪問404問題解決

Springmvc框架靜態資源訪問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。