1. 程式人生 > >關於解決WEB-INF的JSP檔案引webRoot下的Js、css和圖片的問題

關於解決WEB-INF的JSP檔案引webRoot下的Js、css和圖片的問題

出現原因

優雅REST風格的資源URL不希望帶 .html 或 .do 等字尾.由於早期的Spring MVC不能很好地處理靜態資源,所以在web.xml中配置DispatcherServlet的請求對映,往往使用 *.do 、 .xhtml、.hml等字尾方式進行區分。這就決定了請求URL必須是一個帶字尾的URL,而無法採用真正的REST風格的URL。通俗說RESTf風格就是在Spring MVC 3.0新增的,它通過不帶副檔名的URL來訪問系統資源。

配置如下:
<servlet>    
    <servlet-name>springMVC</servlet-name>     
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
     <load-on-startup>1</load-on-startup>   
</servlet>    
<servlet-mapping>      
     <servlet-name>springMVC</servlet-name>    
     <url-pattern>/</url-pattern> 
 </servlet-mapping>


解決辦法

  1. 引用絕對路徑,在公共jsp設定路徑其他jsp頁面引用即可。
 <%  
 String path = request.getContextPath();     
 request.setAttribute("base", path);    
  %>
<img   src="{base}/static/img/500error.png">   
  1. 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>
  1. spring mvc對靜態資源配置(spring3.0.5)

xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvch
ttp://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

<mvc:annotation-driven />
<mvc:default-servlet-handler />

在  springMVC-servlet.xml 中配置 <mvc:default-servlet-handler /> 後,會在Spring MVC上下文中定一個org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,
它會像安檢人員,對進入DispatcherServlet的URL進行過濾,如果發現是靜態資源的URL請求,
就將該請求轉由Web應用伺服器預設的Servlet處理,如果不是靜態資源的請求
,才DispatcherServlet繼續處理

 <mvc:annotation-driven />
 <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
 <mvc:resources mapping="/static/**" location="/static/" />
 <mvc:resources mapping="/resources/**" location="/resources/" />
 <mvc:resources mapping="/images/**" location="/images/" />
 <mvc:resources mapping="/js/**" location="/js/" />
 配置檔案如果沒有<mvc:annotation-driven/>,那麼所有的Controller可能就沒有解析,
 所有當有請求時候都沒有匹配的處理請求類,就都去<mvc:default-servlet-handler/>
 即default servlet處理了。新增上<mvc:annotation-driven/>後,相應的url請求被Controller處理,
 而靜態資源因為沒有相應的Controller就會被default servlet處理;即沒有相應的Controller就會
 被default servlet處理。