今天在tomcat里部署运行了一个小工程,工程结构如下:
运行tomcat服务器后,访问index.html,发现报404:
但是后台接口是正常返回的:
去看webapps里工程目录下,index.html文件是有的,见鬼了,是哪儿出了问题?
然后看到控制台日志(或者tomcat_home/logs/catalina.log)报错如下:
大致意思是springmvc这个servlet处理不了index.html。原来是配置有问题。
看看web.xml配置,是这样写的:
这里url-pattern匹配所有请求,可以实现现在很流行的REST风格,但是会导致js、html、css等静态资源被拦截,拦截后找不到对应的Handler去处理,就会报404
可以通过以下几种方式去解决:
1、
在web.xml中配置默认servlet,去处理静态资源,配置如下:
这样配置后,匹配到的静态资源会被Servlet名称是"default"的DefaultServletHttpRequestHandler去处理,这样就可以找到了。但是该方式每种静态资源文件都得配置一个。
2、
在spring3.0.4以后版本提供了mvc:resources,使用方法:
使用元素,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中,
key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,
这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回,所以就支持classpath目录,jar包内静态资源的访问。
3、
使用
该标签会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到DefaultServletHttpRequestHandler 处理并返回,
DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet
按照最简单的第三种方式,修改以后,index.html页面访问正常:
总结一下,归根结底还是自己对SpringMVC不熟悉。
参考文章:
完美解决静态资源找不到
Spring MVC静态资源处理
https://www.cnblogs.com/fangqi/archive/2012/10/28/2743108.html
Spring中拦截/和拦截/*的区别
http://josh-persistence.iteye.com/blog/1922311
END
本文由“壹伴编辑器”提供技术支持由“壹伴编辑器”提供技术支持
领取专属 10元无门槛券
私享最新 技术干货