java這個404你能解決嗎?


前言

本文首發於公眾號【我的小碗湯】本公眾號免費提供csdn下載服務,海量IT學習資源,如果你准備入IT坑,勵志成為優秀的程序猿,那么這些資源很適合你,包括但不限於java、go、python、springcloud、elk、嵌入式 、大數據、面試資料、前端 等資源。掃碼關注:

image

正文

今天在tomcat里部署運行了一個小工程,工程結構如下:

image

運行tomcat服務器后,訪問index.html,發現報404:

image

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

image

去看webapps里工程目錄下,index.html文件是有的,見鬼了,是哪兒出了問題?

image

然后看到控制台日志(或者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'

image

大致意思是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頁面訪問正常:

image

總結一下,歸根結底還是自己對SpringMVC不熟悉。


最后,csdn資源,收集了海量學習資料,如果你准備入IT坑,勵志成為優秀的程序猿,那么這些資源很適合你,包括java、go、python、springcloud、elk、嵌入式 、大數據、面試資料、前端等資源。同時我們組建了一個技術交流群,里面有很多大佬,會不定時分享技術文章,如果你想來一起學習提高,可以關注以下公眾號后回復【2】,獲取。


我是小碗湯,我們一起學習,掃碼關注,精彩內容第一時間推給你
歡迎掃碼關注


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM