1. 程式人生 > ><mvc:default-servlet-handler/>導致controller失效,報404錯誤

<mvc:default-servlet-handler/>導致controller失效,報404錯誤

pri app 小項目 一行代碼 servlet AD inf png 分享

最近在做ssm框架整合的一個小項目時,頁面跳轉一直有404錯誤,也沒有報錯提示。然後一步一步去找,終於發現是<mvc:default-servlet-handler/>的原因。

技術分享圖片

如上圖所示,如果springmvc的配置文件這樣寫的話會報錯。

<mvc:default-servlet-handler/>這一行代碼的意思是使用默認的Servlet來響應靜態文件,因為在web.xml中使用了DispatcherServlet截獲所有請求的url,包括jsp頁面的關於js,css等引入。由於找不到這些靜態文件,所以會報404錯誤。而當配置文件加上這個默認的Servlet時,Servlet會在找不到它的時候去找靜態內容。

但是引入這行代碼後,Controller就會失效了,準確來說是RequestMapping下面的方法失效了,從而界面無法跳轉。在網上看了一些原因後,總結一下就是

<mvc:default-servlet-handler/>將在SpringMVC上下文中定義一個DefaultServletHttpRequestHandler,這個Handler的作用是去Servlet容器查找默認的Servlet來響應靜態文件,而這會導致上圖配置文件的處理映射器和處理適配器失效,從而Controller失效。


解決辦法如下圖

技術分享圖片

<mvc:annotation-driven/>這一行代碼的作用是自動註冊RequestMappingHandlerMapping和RequestMappingHandlerAdapter這兩個bean,所以我把他們註釋了。

也就是說這兩個bean的順序一定要在<mvc:default-servlet-handler/>的前面。<mvc:default-servlet-handler/>定義的DefaultServletHttpRequestHandler,是當沒有其他mapping可以處理請求時才會執行該handler匹配的mapping,從而去查找靜態內容。

同理,你也可以把我的第一張圖的<mvc:default-servlet-handler/>這行代碼放到兩個bean的後面也可解決。

<mvc:default-servlet-handler/>導致controller失效,報404錯誤