天天看點

在Struts2中,Action可以以幾種不同的方式來工作

 本文節選自《struts2權威指南--基于webwork核心的MVC開發》

    感覺這本書還是不錯 呵呵 

    下面說說Action的一些工作方式:

單個結果

Action最常用也是最基本的用法就是執行操作後傳回單個結果。這種Action看上去就是這樣的:

class MyAction {

public String execute() throws Exception {

return "success";

}

}

這樣簡單的幾行代碼當然說明不了什麼。但首先,這個Action類不需要繼承其它類,也不需要實作其他接口。這樣的類就是一個簡單的POJO。

其次,在這個類中有一個名為“execute”的方法。這個方法名是依照慣例命名的,如果你想用其他名字的話,那麼隻需要在Action的配置檔案中做出更改。無論方法名是什麼,它們都被認為會傳回一個String類型的值。Action的配置檔案會将該Action的傳回代碼與要呈現給使用者的結果進行比對。另外,該方法還可以在需要的時候抛出異常。

下面是最簡單的配置資訊:

<action name="my" class="com.fdar.infoq.MyAction" >

<result>view.jsp</result>

</action>

“name”屬性提供了執行Action所對應的URL位址,在這裡就是“my.action”。“.action”的擴充名是在“struts.properties” 4檔案中配置的。“class”屬性指定了要執行的action所對應的類的全限定名。

多個結果

現在情況稍微複雜了一些,Action需要根據邏輯運算的結果,來生成多個結果。下面的代碼和剛才那個類看上去很像:

class MyAction {

public String execute() throws Exception {

if( myLogicWorked() ) {

return "success";

} else {

return "error";

}

}

}

因為這裡有兩個結果,是以就為每一種不同的情況來配置要呈現給使用者的結果。配置檔案就變成了如下的樣子:

<action name="my" class="com.fdar.infoq.MyAction" >

<result>view.jsp</result>

<result name="error">error.jsp</result>

</action>

我們可以看到在result節點中多了“name”屬性,實際上這個屬性是一直都存在的,如果開發人員沒有顯式指定它的值,那麼它的預設值就是“success”(第一個result的配置就是如此)。

前面我們已經看到了定義Action結果的最通用的方式。而實際上我們還有另外四種方式:

1. Action方法傳回一個字元串——這個傳回的字元串與“struts.xml”的一個action配置相比對。例子中已經示範這一種方式。

2. 使用Code behind插件 ——當使用這個插件的時候,它會将Action的名字和Action傳回的結果字元串進行連接配接來得到視圖模闆。比如說,如果URL是“/adduser.action”,而Action傳回了“success”,那麼要渲染的頁面就是“/adduser-success.jsp” 。更多資訊請參見http://struts.apache.org/2.x/docs/codebehind-plugin.html。

3. 使用 @Result注解—— action類可以用@Results 和@Result注解來标注多個不同的結果。Action所傳回的字元串需要與所注解的結果之一相比對。

4. 方法傳回一個Result類的執行個體——Action不必一定要傳回一個字元串,它可以傳回一個Result類的執行個體,該執行個體應當是已經配置好可使用的。

結果類型

Action生成并傳回給使用者的結果可能會有多個值,而且也可能是不同的類型。“success”的結果可能會渲染一個JSP頁面,而“error”的結果可能需要向浏覽器發送一個HTTP頭。

結果類型(本章中稍後會詳細讨論)是通過result節點的“type”屬性來定義的。和“name”屬性一樣,這個屬性有一個預設值——“dispatcher”——用來渲染JSP。大多數情況下,你隻需要使用預設的結果類型就可以了,但是你可以提供自定義的實作。

請求和表單類型

Action為了執行操作,并為資料庫持久化對象提供資料,就必須要通路請求字元串和表單中的資料。

Struts2采用了JavaBean的風格——要通路資料的話,就給字段提供一個getter和setter,要通路請求字元串和表單也是一樣的道理。每一個請求字元串和表單的值都是一個簡單的名/值對,是以要設定一個特定名稱的值的話,就要為它提供一個setter。比如,如果一個JSP調用了“/home.action?framework=struts&version= 2 ” 這樣一個請求,那麼action就應該提供如下兩個setter:“setFramework( String frameworkName )”和“setVersion( int version )”。

我們可以看到,例子中的setter并不是隻接受String類型的參數。在預設情況下,Struts2可以把String類型的值轉換成action所需要的類型,這條規則對于所有的primitive類型和基本對象類型的值都适用,當然你也可以對其進行配置,讓它也适用于你所建立的類。Struts2還可以在更加複雜的對象圖中進行定位後指派 ,比如說如果一個表單元素的名字是“person.address.home.postcode”,其值為“2”,那麼Struts2就會調用“getPerson().getAddress().getHome().setPostcode(2)”這個方法。