前言
本文首發於公眾號【我的小碗湯】本公眾號免費提供csdn下載服務,海量IT學習資源,如果你准備入IT坑,勵志成為優秀的程序猿,那么這些資源很適合你,包括但不限於java、go、python、springcloud、elk、嵌入式 、大數據、面試資料、前端 等資源。掃碼關注:
正文
今天在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坑,勵志成為優秀的程序猿,那么這些資源很適合你,包括java、go、python、springcloud、elk、嵌入式 、大數據、面試資料、前端等資源。同時我們組建了一個技術交流群,里面有很多大佬,會不定時分享技術文章,如果你想來一起學習提高,可以關注以下公眾號后回復【2】,獲取。
我是小碗湯,我們一起學習,掃碼關注,精彩內容第一時間推給你