2013年7月8日

Spring MVC 3 實作教學 (2) - Hello Spring MVC tutorial !

延續實作教學(1) 建立好專案後,如何讓我的 Spring MVC Project 動起來?在開始動手之前,可以先閱讀官方 Spring MVC 教學文章,透過清楚的 Spring MVC 流程圖可以瞭解整個運作的情況。接著開始實作吧!



Config :

若詳細看過教學文章可以知道 Spring MVC 是透過名為 DispatcherServlet 的程式來將使用者的 Request 導向我們的 Controller ( 邏輯處理程式 )。而為了讓 Java EE Container 啓動時知道我們將會使用這個  DispatcherServlet  所以我們必須先在設定檔宣告,該設定檔即為   /WEB-INF/web.xml,設定如下:


Servlet :
可以看到上述 web.xml 中定義了 Servlet 名稱 (別名) 為 mercury ,實作 Class 為剛剛提到的 DispatcherServlet 。而 load-on-startup 指定為 1 ,可以解讀為當你在 web.xml 裡面定義很多個 Servlet 的情況下, Jave EE Container 啓動時載入這些 Servlet 的順序。若不指定的話,它就會隨機選擇載入時間點。

Servlet-mapping :
這邊指定了剛剛定義的 Servlet mercury 來實作 mapping 動作,url-pattern 則是定義 Servlet mercury 何時該介入處理使用者的請求。例如:當使用者發出 /account/CalculateMoney 的 Request ,因符合我們定義 "/" 路徑底下,此時 Servlet mercury 就會介入執行 mapping 動作。若還不瞭解的話,於後面實作程式時應該可以有更進一步的認知。


設定 web.xml 只是讓 Java EE Container 認識 Servlet,針對 Spring 功能還有許多參數需要去宣告,因此我們還需要一個 Spring 核心功能設定檔,這個檔案預設讀取位置是在 /WEB-INF 底下,設定檔預設名稱為  <servletname>-context.xml ,官方教學雖然是這樣寫但我實際測試名稱應該是 <servletname>-servlet.xml。若你沒新增設定檔或設定檔名稱錯誤,於啓動專案時會出現找不到該設定檔的錯誤訊息,因此到時後可以檢查錯誤訊息裡面顯示的設定檔名稱。另外要指定設定檔於特殊路徑底下,可以在 web.xml 裡面去設定 (請參考 Spring MVC 教學文章面的 web.xml )。
範例如下圖:


Spring 核心功能設定檔 ( /WEB-INF/mercury-servlet.xml )內容如下:


<context:component-scan base-package="mercury.*" />
這邊定義了專案裡特定 package 底下的程式,確保其中若有使用到 Annotation ( 如 @Controller 、@Service... ) 的程式會被找到。範例設定符合 mercury.* 的 package 內的程式都會被找到。

<mvc:annotation-driven /> :
此參數為將 Request 會自動導向對應 Controller 的功能開啓、宣告的動作。

ViewResolver :
這裡定義了當 Controller 執行完畢,若無特定指定呈現 View 的情況下,它會直接將 View 視為 /pages/ 路徑底下某個相對應名稱的 .jsp。 例如:當 Request 為 /Login 時,若無指定呈現的 View,則會自動以 /pages/Login.jsp 來作為預設的 View。當然 View 放置的路徑我自己習慣的模式,若你不喜歡這樣也可以照自己的設定來實作。


Controller and View :

以上將兩個主要的設定檔都設定完後,還需要一個處理 Request 的 Controller 實作程式。因此根據 /WEB-INF/mercury-servlet.xml 裡面宣告的 <context:component-scan base-package="mercury.*" /> ,我將會建立一個 package ,如下圖:


建立好名稱為 mercury.action.common 的 package,新增一個簡單的 Pojo,其內容如下:


可以看到這支程式非常簡潔,首先使用 Annotation @Controller 將此程式標註為處理 Request 的 Controller,裡面有一個名為 hellSpring 的 Method,而這個 Method 帶有 @RequestMapping( value="/helloSpring" ),其意思為當使用者 Request 為 /helloSpring 時,Request 會對應到 MercuryAction 裡的 helloSpring  Method。而你可以看到 helloSpring 並沒有回傳任何型態,此時該 Method 執行完就會尋找對應的 View 來顯示,意即 /pages/helloSpring.jsp。所以我們還需要新增一個對應  JSP 檔案。此範例完整檔案如下:


JSP 內容如下:


以上完成所有準備工作。

當我們輸入 url : http://localhost:8080/Mercury/helloSpring 時,透過 Spring MVC 會將 Request 導向 MercuryAction 並執行 helloSpring 時 Console  就會出現我們印的訊息,


最後將由 /pages/helloSpring.jsp 將結果呈現,參考下圖。


其他 Spring Framework 相關教學可以參考本篇整理