java這個404你能解決嗎?

今天在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/" />複製代碼

使用 元素,把mapping的URI註冊到SimpleUrlHandlerMapping的urlMap中,

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相關資源。

掃碼關注,精彩內容第一時間推給你

image

相關文章
相關標籤/搜索