这个404你能解决吗?

别来无恙 提交于 2021-02-11 13:17:13

点击上方蓝字关注 👆👆



今天在tomcat里部署运行了一个小工程,工程结构如下:



运行tomcat服务器后,访问index.html,发现报404:



但是后台接口是正常返回的:



去看webapps里工程目录下,index.html文件是有的,见鬼了,是哪儿出了问题?



然后看到控制台日志(或者tomcat_home/logs/catalina.log)报错如下:


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.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去处理,就会报404



可以通过以下几种方式去解决:


1、

在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去处理,这样就可以找到了。但是该方式每种静态资源文件都得配置一个。


2、

 在spring3.0.4以后版本提供了mvc:resources,使用方法:


<!-- 对静态资源文件的访问 -->      
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/js/**" location="/js/" />


使用<mvc:resources/>元素,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中,

key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,

这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回,所以就支持classpath目录,jar包内静态资源的访问。


3、

使用<mvc:default-servlet-handler/>

<mvc:default-servlet-handler/>


该标签会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到DefaultServletHttpRequestHandler 处理并返回,

DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet


按照最简单的第三种方式,修改以后,index.html页面访问正常:



总结一下,归根结底还是自己对SpringMVC不熟悉。



最后我为大家收集了些学习资料,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你。可以选择自己喜欢的,在公众号后台回复 :javagopythonspringcloudelk、嵌入式 获得对应资源,如果获取到的链接失效,请后台回复。


同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以加我微信【211140918】备注【加群】,期待你的加入!



参考文章:

完美解决静态资源找不到

https://blog.csdn.net/jdjdndhj/article/details/54907891

Spring MVC静态资源处理

https://www.cnblogs.com/fangqi/archive/2012/10/28/2743108.html

Spring中拦截/和拦截/*的区别

http://josh-persistence.iteye.com/blog/1922311


END


本文由“壹伴编辑器”提供技术支持由“壹伴编辑器”提供技术支持

推荐阅读:

推荐一款超好用的工具

四款神器,教你笑傲江湖

发送手机验证码实现

SpringMVC实现发送邮件


历史文章:

mysql支持原生json使用说明

maven最佳实践之模块划分

利用mybatis逆向工程生成代码

用go语言爬取珍爱网 | 第一回

用go语言爬取珍爱网 | 第二回

用go语言爬取珍爱网 | 第三回

LAMP环境部署物联网项目

linux上安装LAMP笔记

vmware上安装linux过程记录

NAT模式实现虚拟机共享主机网络


我是小碗汤,我们一起学习。


扫码关注,精彩内容第一时间推给你

本文分享自微信公众号 - 我的小碗汤(mysmallsoup)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!