理論上Struts 2.0的Action無須實現任何介面或繼承任何類型,但是,我們為了方便實現Action,大多數情況下都會繼承com.opensymphony.xwork2.ActionSupport類,並重載(Override)此類裡的String execute()方法。
由JavaDoc可知,ActionSupport類實現了介面。
com.opensymphony.xwork2.Action。
com.opensymphony.xwork2.LoaleProvider。
com.opensymphony.xwork2.TextProvider。
com.opensymphony.xwork2.Validateable。
com.opensymphony.xwork2.ValidationAware。
com.uwyn.rife.continuations.ContinuableObject。
java.io.Searializable。
java.lang.Cloneable。
例如下例所示:
- public class HelloWorld extends ActionSupport {
- private String message;
-
- public String getMessage() {
- return message;
- }
-
- public String execute() {
- message = " Hello World, Now is " +
- DateFormat.getInstance().format( new Date());
- return SUCCESS;
- }
- }
然後可以配置如下映射:
- <package name ="ActionDemo" extends ="struts-default">
- <action name ="HelloWorld" class ="tutorial.HelloWorld">
- <result> /HelloWorld.jsp</result>
- </action>
- </package>
在預設情況下,當請求HelloWorld.do發生時,Struts 2會根據struts.xml裡的Action映射集(Mapping)執行個體化tutoiral.HelloWorld類,並調用其execute()方法。當然,我們可以通過以下兩種方法改變這種預設調用,這個功能(Feature)有點類似Struts 1中的LookupDispathAction。
在sturts.xml中建立Action,並指明其調用的方法。
訪問Action時,在Action名後加上"!xxx"(xxx為方法名)。
例如我們可以在tutorial/HelloWorld.java中加入以下方法:
- public String aliasAction() {
- message ="自訂Action調用方法";
- return SUCCESS;
- }
然後可以在sturts.xml中指定method來佈建要求的函數名:
- <action name="AliasHelloWorld" class="
- tutorial.HelloWorld" method="aliasAction">
- <result>/HelloWorld.jsp</result>
- </action>
也可以直接在URL地址欄中使用"!method"來佈建要求的函數名:
- http://localhost:8080/Struts 2Test
- /HelloWorld!aliasAction.action
通過上面的兩個例子,細心的朋友應該可能會發現classes/tutorial/HelloWorld.java中Action方法(execute和aliasAction)返回的都是SUCCESS。這個屬性變數筆者並沒有定義,所以大家應該會猜到它在ActionSupport或其父類中定義。沒錯,SUCCESS在介面com.opensymphony.xwork2.Action中定義,另外同時定義的還有ERROR、INPUT、LOGIN、NONE。
此外,筆者在配置Action時都沒有為result定義名字(name),所以它們預設都為SUCCESS。值得一提的是,Struts 2.0中的result不僅僅是Struts 1.x中Forward的別名,它可以實現除Forward外的很激動人心的功能,如將Action輸出到FreeMaker模板、Velocity模板、JasperReports和使用XSL轉換等。這些都過result裡的type(類型)屬性(Attribute)定義的。另外,你還可以自訂result類型。