今天在tomcat里部署运行了一个小工程,工程结构以下:css
运行tomcat服务器后,访问index.html,发现报404:html
可是后台接口是正常返回的:前端
去看webapps里工程目录下,index.html文件是有的,见鬼了,是哪儿出了问题?java
而后看到控制台日志(或者tomcat_home/logs/catalina.log)报错以下:python
org.springframework.web.servlet.PageNotFound.noHandlerFound No mapping fo
und for HTTP request with URI [/artmuseum/index.html] in DispatcherServlet with name 'springmvc'复制代码
大体意思是springmvc这个servlet处理不了index.html。原来是配置有问题。web
看看web.xml配置,是这样写的:面试
<!-- 注册前端控制器 -->
<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*:config/spring-*.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--默认匹配全部的请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>复制代码
这里url-pattern匹配全部请求,能够实现如今很流行的REST风格,可是会致使js、html、css等静态资源被拦截,拦截后找不到对应的Handler去处理,就会报404spring
能够经过如下几种方式去解决:编程
一、tomcat
在web.xml中配置默认servlet,去处理静态资源,配置以下:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</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>*.xml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.swf</url-pattern>
</servlet-mapping>复制代码
这样配置后,匹配到的静态资源会被Servlet名称是"default"的DefaultServletHttpRequestHandler去处理,这样就能够找到了。可是该方式每种静态资源文件都得配置一个。
二、
在spring3.0.4之后版本提供了mvc:resources,使用方法:
<!-- 对静态资源文件的访问 -->
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/js/**" location="/js/" />复制代码
使用
key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,
这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回,因此就支持classpath目录,jar包内静态资源的访问。
三、
使用
<mvc:default-servlet-handler/>复制代码
该标签会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到DefaultServletHttpRequestHandler 处理并返回,
DefaultServletHttpRequestHandler使用就是各个Servlet容器本身的默认Servlet
按照最简单的第三种方式,修改之后,index.html页面访问正常:
总结一下,归根结底仍是本身对SpringMVC不熟悉。
本公众号免费提供csdn下载服务,海量IT学习资源,若是你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时咱们组建了一个技术交流群,里面有不少大佬,会不定时分享技术文章,若是你想来一块儿学习提升,能够公众号后台回复【2】,免费邀请加技术交流群互相学习提升,会不按期分享编程IT相关资源。
扫码关注,精彩内容第一时间推给你