1. 程式人生 > >Spring框架的WEB專案訪問不到靜態資原始檔

Spring框架的WEB專案訪問不到靜態資原始檔

 最近遇見一個很白痴的問題,但還是犯了,就是在jsp頁面中訪問不到jquery檔案了,找了很多辦法,改了很多次路徑,還是不對,最後發現是SpringMVC的配置出錯了;
    <servlet>  
        <servlet-name>dispatcher</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <init-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>classpath*:/spring-mvc.xml</param-value>  
        </init-param>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>dispatcher</servlet-name>  
        <url-pattern>/</url-pattern>  
    </servlet-mapping>  

這是我的配置,在 url-pattern 中配置的是  “/” , 這樣DispatcherServlet就會攔截所有的請求,同時  *.js,*.css 這些靜態資源就會全部被攔截,如果你的DispatcherServlet攔截 *.do這樣的URL,就不存在訪問不到靜態資源的問題。

解決方案一:啟用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.

最後再說明一下,如何你的DispatcherServlet攔截 *.do這樣的URL,就不存上述問題了。