zoukankan      html  css  js  c++  java
  • java这个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不熟悉。




    本公众号免费提供csdn下载服务,海量IT学习资源,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以公众号后台回复【2】,免费邀请加技术交流群互相学习提高,会不定期分享编程IT相关资源。


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

    image

  • 相关阅读:
    IOC架构设计之ButterKnife源码&原理(二)下篇
    IOC架构设计之ButterKnife源码&原理(二)中篇
    IOC架构设计之ButterKnife源码&原理(二)上篇
    IOC架构设计之控制反转和依赖注入(一)
    RXJava之线程控制Scheduler(四)
    RXJava之变换(三)
    RXJava之扩展的观察者模式(二)
    微信小程序弹框提示绑定手环实例
    SpringBoot进阶教程 | 第四篇:整合Mybatis实现多数据源
    SpringCloud核心教程 | 第一篇: 使用Intellij中的Spring Initializr来快速构建Spring Cloud工程
  • 原文地址:https://www.cnblogs.com/liabio/p/11718340.html
Copyright © 2011-2022 走看看