Spring MVC 之 DispatcherServlet - url pattern設置問題 (/ vs. /*)

最近把我的 project 轉為 spring mvc 的架構,想說可以順便用 spring 的 RESTful。Controller 的 method 大概如下:

1
2
3
4
5
6
@RequestMapping(value = "/show_my_page", method = RequestMethod.GET)  
public String showMyPage(Model model) {
// do something

return "myPage";
}

結果 Server 卻丟出類似如下的 error message:
WARN PageNotFound:1114 - No mapping found for HTTP request with URI [/myWebApp/WEB-INF/views/myPage.jsp] in DispatcherServlet with name 'dispatcherServlet'

我的 jsp 路徑沒錯,google 了好一陣子也找不到解答,後來看 Spring in Action 第三版裡面建議針對DispatcherServlet 用如下的 url-pattern

1
2
3
4
<servlet-mapping>  
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

不建議用以下這種 (我當時一開始的配置)

1
2
3
4
<servlet-mapping>  
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

不過它的解釋我看不太懂,應該說它並沒有針對這兩個的不同做解釋。總之,我把 url-pattern 改為 / 之後,就可以正常顯示我的 jsp了 (感動 T^T)

自己的推測:

  • url-pattern: /*
    DispatcherServlet 會攔截 web app 外部和內部所有的 request,所以當 View 將 request dispatch 給jsp 時會被攔截,而 DispatcherServlet 找不到對應的 method,因此拋出上面那個錯誤
  • url-pattern: /
    DispatcherServlet 會攔截 web app 外部所有的 request 而不會攔截內部的,所以 View 可以順利的將request dispatch 給 jsp 而不被 DispatcherServlet 攔截
#

評論

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×