spring mvc 靜態資源 404問題 javascript
在web.xml配置servlet-mapping的時候,若是url-pattern設置爲「/」 (以下),不少人都會遇到導入js,css,圖片等靜態資源出現Firefox調試窗口會報出的404錯誤,而你的確也不能訪問那些資源 css
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> java
百度了好久,大體有3種方法:可是我仍然沒有解決404問題,後來又google了一下,發現少了一個關鍵的地方(在百度搜索中都沒提到的一個地方,因此認爲比較關鍵 :)),就是在jsp頁面中導入靜態資源的時候須要用<c:url>標籤。 jquery
例如: web
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> spring
<script type="text/javascript" src='<c:url value="/js/jquery.js"></c:url>'></script> mvc
這裏的c:url中 value的值也是須要特別注意到地方,見下面3種方法詳細說明: app
方法1. 修改web.xml文件,增長對靜態資源的url映射 webapp
如: jsp
<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。