今天在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/" />複製代碼
使用
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相關資源。
掃碼關注,精彩內容第一時間推給你