关于解决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处理。


猜你喜欢

转载自blog.csdn.net/pengjwhx/article/details/82794338