本文轉自:http://www.iigrowing.cn/springmvc_fang_wen_jing_tai_zi_yuan_de_san_zhong_fang_shi.html
如何你的DispatcherServlet攔截 *.do這樣的URL,就不存在訪問不到靜態資源的問題。
如果你的DispatcherServlet攔截“/”,攔截了所有的請求,同時對*.js,*.jpg的訪問也就被攔截了。
<!-- Processes application requests --> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
為了可以正常訪問靜態文件,不要找不到靜態文件報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>
要配置多個,每種文件配置一個
要寫在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”
方案二: 在spring3.0.4以后版本提供了mvc:resources
<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/>
本文原始鏈接:http://unmi.cc/spring-mvc-access-static-resources-jpgjscss, 來自:隔葉黃鶯 Unmi Blog
<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 是匹配 “/**” 的,所以一定會匹配上,再響應圖片。
訪問一個圖片,還要走層層匹配。真不知性能如何?改天做一下壓力測試,與Apache比一比。
最后再說明一下,如何你的 DispatcherServlet 攔截 *.do 這樣的 URL,就不存上述問題了。
————–
在SpringMVC中常用的就是Controller與View。但是我們常常會需要訪問靜態資源,如html,js,css,image等。
默認的訪問的URL都會被DispatcherServlet所攔截,但是我們希望靜態資源可以直接訪問。該腫么辦呢?
在配置文件:web.xml可以看到:
<!-- Processes application requests --> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
靜態資源訪問,其實方法有多種,如:通過開放tomcat的defaultServlet,修改默認的url-parttern。
但是SpringMVC提供了更為便捷的方式處理靜態資源。
解決方案:
直接在servlet-context.xml中添加資源映射。
我的開發環境:
1、Eclipse Luna SP1
2、Springsource-tool-suite 3.6.4
修改servlet-context.xml,添加resource映射即可。
servlet-context.xml的路徑如下:
配置文件內容:
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> <!-- Enables the Spring MVC @Controller programming model --> <annotation-driven /> <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> <resources mapping="/resources/**" location="/resources/" /> <resources mapping="/images/**" location="/images/" /> <resources mapping="/js/**" location="/js/" /> <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <beans:property name="prefix" value="/WEB-INF/views/" /> <beans:property name="suffix" value=".jsp" /> </beans:bean> <context:component-scan base-package="com.yank.firstapp" /> </beans:beans>
資源映射
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> <resources mapping="/resources/**" location="/resources/" /> <resources mapping="/images/**" location="/images/" /> <resources mapping="/js/**" location="/js/" />
mapping:映射
location:本地資源路徑,注意必須是webapp根目錄下的路徑。
兩個*,它表示映射resources/下所有的URL,包括子路徑(即接多個/)
這樣我們就可以直接訪問該文件夾下的靜態內容了。
如:
http://localhost:8090/firstapp/images/cookie.png
http://localhost:8090/firstapp/js/jquery-1.11.2.js
效果:
陷阱:
配置的location一定要是webapp根目錄下才行,如果你將資源目錄,放置到webapp/WEB-INF下面的話,則就會訪問失敗。這個問題常常會犯。
錯誤方式:
WEB-INF目錄作用
<resources mapping="/js/**" location="/WEB-INF/js/" />
推薦方式:本文的目錄結構為如下圖所示。
———–
Spring3中js/css/jpg/gif等靜態資源無法找到(No mapping found for HTTP request with URI)問題解決
最近項目中使用到Spring3,在感嘆Spring3注解配置清爽的同時竟然出現了這個不和諧的事情,實在無法忍受
問題:部署項目后程序加載或用瀏覽器訪問時出現類似的警告,2011-01-19 10:52:51,646 WARN [org.springframework.web.servlet.PageNotFound] -<No mapping found for HTTP request with URI [/sandDemo001/images/1.jpg] in DispatcherServlet with name ‘spring’>,主要看尖括號內部分。
問題原因:罪魁禍首是web.xml下對spring的DispatcherServlet請求url映射的配置,原配置如下:
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
分析原因:<servlet-mapping>的<url-pattern>/</url-pattern>把所有的請求都交給spring去處理了,而所有available的請求url都是在Constroller里使用類似@RequestMapping(value = “/login/{user}”, method = RequestMethod.GET)這樣的注解配置的,這樣的話對js/css/jpg/gif等靜態資源的訪問就會得不到。
解決方法:在web.xml里添加如下的配置
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<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>
解決方法2:在spring的配置文件中添加如下一行:
<mvc:default-servlet-handler/>
注意,需要是spring3.0.5以上版本
解決方法3
<!– Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory –>
<mvc:resources mapping=”/resources/**” location=”/resources/” />
這個配置告訴spring 靜態資源的處理方式