刚开始使用springmvc,出现了各种意想不到的问题。今天遇到了一个:在springmvc下静态资源无法被前端访问到,出现这种问题的原因如下:
在web.xml中配置springmvc的DispatcherServlet一般如下:
<servlet>
<servlet-name>SpringMVC</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>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
如果将DispatcherServlet请求映射配置为"/",则Spring MVC将捕获Web容器所有的请求,包括在这里讨论的静态资源的请求,Spring MVC会将它们当成一个普通请求处理,因此找不到对应处理器将导致错误。
解决的办法有两个:
1.在web.xml 中配置默认的servlet,具体方法如下:
<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 >
<servlet-mapping >
<servlet-name >default </servlet-name >
<url-pattern >*.png</url-pattern>
</servlet-mapping >
<servlet-mapping >
<servlet-name >default </servlet-name >
<url-pattern >*.woff</url-pattern>
</servlet-mapping >
<servlet-mapping >
<servlet-name >default </servlet-name >
<url-pattern >*.ttf</url-pattern>
</servlet-mapping >
<servlet-mapping >
<servlet-name >default </servlet-name >
<url-pattern >*.jpg</url-pattern>
</servlet-mapping >
根据请求文件的不同配置不同的后缀名。
注意:这种配置方式必须加载DispatcherServlet的配置之前,意思也就是在springmvc启动之前将静态资源的请求处理交给web容器来处理。
2.在springmvc-Servlet.xml中加入以下的配置:
<mvc:resources location="/assets/" mapping="/assets/**"></mvc:resources>
解释:这段配置即配置静态资源的请求及路径对应的资源mapping表示请求的路径,location表示请求所对应的资源。也可以配置的更加详细:
- <mvc:resources mapping="/javascript/**" location="/static_resources/javascript/"/>
- <mvc:resources mapping="/styles/**" location="/static_resources/css/"/>
- <mvc:resources mapping="/images/**" location="/static_resources/images/"/>