这个404你能解决吗?

今天在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不熟悉。

参考文章:

完美解决静态资源找不到

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

原文发布于微信公众号 - 我的小碗汤(mysmallsoup)

原文发表时间:2018-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏惨绿少年

默认权限umask、文件系统权限、特殊权限

第1章 权限相关错误 1.1 普通用户 ls /root/ /root  属于root 普通用户没有任何权限,所以无法查看 [oldboy@znix ~]$ l...

4590
来自专栏吴柯的运维笔记

如何快速实现Jenkins部署?

软件介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成...

2876
来自专栏小白鼠

Jenkins远程部署

服务器之间如果已经配置了通过ssh无密码访问,有关于这一步的配置就结束了。如果没有配置,可以通过密码的方式进行访问,需要配置 密码 和 端口。点击高级:

1.1K3
来自专栏君赏技术博客

【未解决】怎么代码加载Localizeable.strings文件到一个字典里面?

我想做一个功能是检查请求的参数值是否被国际化,如果被郭国际化就抱错。因为我们的请求的参数值只能是英文。

712
来自专栏贾鹏辉的技术专栏@CrazyCodeBoy

轻松搞定GitHub Pages

GitHub支持创建个人或组织以及项目这两种类型的网站。 本文章将向大家分享如何为项目、组织或个人创建一个GitHub Pages。 为项目创建GitHub ...

3828
来自专栏帘卷西风的专栏

CentOS yum安装或者升级GCC到4.8

之前一直没怎么用C++11,最近的项目都开始使用,但是Centos使用yum工具安装GCC的版本是4.4.7,因此需要升级才行。

2162
来自专栏SpringBoot

spingboot 打包jar

https://cloud.tencent.com/developer/support-plan?invite_code=jykf9t9jq2zu

1022
来自专栏Java开发

SpringMVC接收数组

后台写@RequestParam("img_array[]") String[] img_array

1014
来自专栏测试开发架构之路

Spring Boot 入门实践

1835
来自专栏nice_每一天

Java-JMS Bug记录

1.Junit测试时,使用for循环发送JMS(ReportQuestionSender)的时候,监听器(ReportQuestionListener)只接受到...

1053

扫码关注云+社区

领取腾讯云代金券