如果DispatcherServlet拦截“/”,即拦截了所有的请求,对*.js,*.jpg等静态资源的访问也就被拦截了。但如果DispatcherServlet只拦截*.do这样的URL,就不存在访问不到静态资源的问题。
通过下面几种方式可以正常访问静态文件,不要找不到静态文件报404。
方法一:利用Tomcat的defaultServlet来处理静态文件
在web.xml里添加如下配置
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</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>*.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>*.html</url-pattern>
</servlet-mapping>
要配置多个,每种文件配置一个。
要写在DispatcherServlet的前面, 让defaultServlet先拦截。
不同的Web应用服务器默认Servlet的名字有所不同,要注意。
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:annotation-driven/>
<!--方式一:要注意/resources/后面的‘/’不要忘记-->
<mvc:resources location="/resources/" mapping="/resources/**"/>
/resources/**会映射到ResourceHttpRequestHandler进行处理,location指定静态资源的位置。如果出现错误,可能是没有配置<mvc:annotation-driven />的原因。
location的位置不能是/WEB-INF/下,因为WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。但是可以通过下面的映射访问该目录下的资源。
<mvc:resources mapping="/js/**" location="/WEB-INF/js/" />
方法三:使用<mvc:default-servlet-handler/>
<mvc:default-servlet-handler/>会把”/**”url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回。DefaultServletHttpRequestHandler 使用就是各个 Servlet 容器自己的默认 Servlet。
方法四:使用JavaConfig中的addResourceHandlers
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
@ComponentScan(basePackages = "XiyouLinux")
public class configuration extends WebMvcConfigurationSupport{
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
}
方法五:使用JavaConfig中的configureDefaultServletHandling
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
@ComponentScan(basePackages = "XiyouLinux")
public class configuration extends WebMvcConfigurationSupport{
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
{
configurer.enable();
}
}
小结
方法二和方法四、方法三和方法五原理是一样的,只是实现的方式不同,一个是XML,另一个时JavaConfig,如果方法四和方法五无效,将@EnableWebMvc注解去掉再试试。
补充说明
DefaultAnnotationHandlerMapping 的 order 属性值是:0
自动注册的 SimpleUrlHandlerMapping 的 order 属性值是: 2147483646
自动注册的 SimpleUrlHandlerMapping 的 order 属性值是:2147483647
spring 会先执行 order 值比较小的。