2009年2月14日 星期六

[Struts2] 簡介 Struts2 的 Action

初啼試聲 HelloStruts2 中我們可以清楚的了解到 Action 是 Struts2 framework 中最核心的角色!接下來我將會介紹 Action 所提供的三個最主要的功能,並且與 Struts1 的 Action 作比較。

在 Struts2 中的 Action 主要有三件事要作。首先,你應該已經很清楚了,既然 Action 是 Struts2 framework 中最核心的角色,那一定會負責 business logic 的工作。第二,Action 會將使用者在頁面上所輸入的資料帶入 Action 中,如此一來,我們的 Action 才可以根據使用者所輸入的資料執行我們的 business logic。最後一項工作就是,Action 會負責哪些頁面是要回應給使用者的,也就是當 Action 執行完成 business logic 後,會將結果的顯示頁面回應給使用者。

以下將分成三點加以介紹。

Actions 包裝 business logic 的工作

Actions 既然是核心元件,自然就會包裝了整個網站的 business logic,所以我們可以在 Action 中所提供的 execute() method 裡加入我們的 business logic。



public String execute()
{
this.setName("Hello~"+this.getName());
return "success";
}

上面的程式碼是根據 初啼試聲 HelloStruts2 中所介紹的 HelloUser class。範例中的程式碼是簡單的,如果我們所開發的網站中,所撰寫的 business logic 是很複雜的,我們可以不必完全的撰寫在 Action 中的 execute() method 中,因為這樣反而會造成程式碼在維護上得困難!

我們可以將我們的 business logic 進一步的包裝成 components,在將這些 components 注入(inject)到 Action 中,透過這樣的 dependency injection 的方式讓 Actions 與 business logics 之間的相依性(dependency)與耦合度(coupling)降低。甚至,我們可以使用 Spring framework 來幫助我們整合管理這些注入的元件。

回顧 Struts 1.x V.S. Struts 2.x 中提到,Action 的 execute() method 在這兩個版本是有很大的差異,總歸一句,Struts 1.x 的 execute() method 相對於 Struts 2.x 來說是比較繁瑣、肥大與測試上不方便,不過如果你寫過 Struts 1.x 的 Action 對於 Struts 2 Action 中提供的 execute() method 可能會出現小小的疑惑:那我要怎樣取得 HttpServletRequest 與 HttpServletResponse 物件呢?一開始我也會有這樣的疑惑,不過等你看到 interceptor 就會得到解答了!

Actions 負責資料的傳送

初啼試聲 HelloStruts2 中可以知道,Action 中會帶有使用者中所輸入的資料,所以 Action 是需要提供一群 getter 與 setter 來讓資料可以存取。不過,資料的帶入真的是由 Action 來完成嗎?其實不是,Action 只是資料帶入的終點與資料帶出的起點,真正幕後的執行者是 interceptor 在做,也就是說,Action 中的那些 JavaBean properties 會在使用者輸入資料送出後,被某一個 interceptor 負責將使用者輸入的值帶入到 Action 中的 properties。當 Action 完成整個 business logic 的工作後,這個 interceptor 也會負責將 Action 中的值帶出到使用者的頁面上。

不同 Struts 1.x 所使用的 ActionForm 來負責接收使用的資料,Struts 2.x 中省去了 ActionForm 的角色,讓這些工作都交由 Action 來負責,這樣看似讓整個 Action 變的更複雜,其實卻不然!也因為這樣的設計,Action 的 execute() method 中的 business logic 可以直接取得使用者所輸入的資料,這樣也讓 execute() method 可以不必將資料透過 parameter 來注入,使 execute() method 更加的乾淨!

Actions 負責回傳結果頁面的控制字串

Action 的最後一項工作就是:回傳頁面的控制字串。從上面的程式碼中可以發現,execute() method 的最後一行是回傳一個 success 的字串,這個字串是用來告知 Struts2 說:幫我回傳給使用者我定義在 struts.xml 中 success 所代表的頁面。當然,我們可以不只有一個頁面控制字串,在 struts.xml 中我可以定義很多個控制字串,這樣也可以讓我們很容易的維護我們系統,換句話說,當我們有某個控制字串所對應的頁面更改了,我們無須去更動程式碼,只要更改 struts.xml 中的設定就可以了!

回傳了控制字串後,Struts2 會幫我們轉換使用者的頁面,在透過剛剛說過的某個 interceptor 將 Action 中的資料帶出到頁面中!

沒有留言: