2014年6月16日 星期一

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


最近把我的project轉為spring mvc的架構,想說可以順便用spring的RESTful。Controller的method大概如下:
@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
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
不建議用以下這種 (我當時一開始的配置)
<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攔截

2014年6月7日 星期六

Web Server 與 Application Server的差別

看到AWS關於web application的architecture這張圖之後,不太懂為何server要分為兩層,於是就google了一下,找到一篇不錯的文章:
http://www.javaworld.com/article/2077354/learn-java/app-server-web-server-what-s-the-difference.html

這邊配合AWS的圖做個簡短的summary:
  • application server: 專門用來處理business logic的,較常見的用法是接受web server的request,執行完business logic (過程中視需要去access DB tier)之後把result回給web server
  • web server: 專門只處理HTTP request與response,當收到HTTP request之後,需要business logic的部分就從application server取,最後把result轉為HTTP response