輕量級JavaEE企業應用實戰(十)

配置Action

Struts2使用包來組織Action,因此,將Action定義在包定義下完成,每個package元素配置一個包
在Struts.xml文件中,package元素用於包的定義
屬性:
name:這是一個必須屬性,該屬性指定該包的名字,該名字是被其他包引用的key
extends:可選屬性,該屬性指定該包繼承其他包。可以繼承其他包中的Action定義、攔截器定義等
namespace:可選屬性,定義該包的命名空間
abstract:可選,指定該包是否一個抽象包,抽象包不能包含Action定義

<package name="test" extends="struts-default" namespace="/test">
    <interceptors>
        <interceptor-stack name="curdStack">
            <interceptor-ref name="params">
            <interceptor-ref name="defaultStack">
        </interceptor-stack>
    </interceptors>
    <action name="date" class="com.action.DateAction">
        <result name="success">/date.jsp</result>
    </action>
</package>

那麼這個struts-default父包從何而來?
在struts2-core-2.1.2.jar中,有一個struts-default.xml

<package name="struts-default" abstract="true">

該包下有大量結果類型定義、攔截器定義、攔截器引用定義等,這些定義是配置Action的基礎,所以開發者定義的package通常應繼承此抽象包

那麼命名空間何用?

http://localhost:8080/strutsDemo/test/date.action

此連接是訪問上述定義DateAction的鏈接,strutsDemo是應用名,可以得出:當包指定了命名空間後,該包下所有的Action處理的URL是:命名空間+Action名

顯式指定根命名空間:

namespace="/"

注:系統如果根據指定的命名空間沒有找到處理的Action,則將到默認命名空間查找對應名的Action,如果找到則使用默認命名空間下的Action處理請求,如果都未找到,則報錯

Action配置

<action name="login" class="com.action.LoginAction">
    ...
</action>

class屬性不是必須的,如果未指定,則系統默認使用系統的ActionSupport類

Action方法的動態調用

//JS調用後臺loginAction中的指定方法
<input type="submit" value="註冊" οnclick="register();">

function register() {
    //獲取頁面第一個表單
    targetForm = document.forms[0];
    //動態修改表單的action屬性
    targetForm.action="login!register";
}

指定method屬性及使用通配符

<action name="login" class="com.action.LoginAction" method="login">
    ...
</action>

method屬性,指定通過哪個方法進行處理。

通配符方式:一個action元素配置多個邏輯的action

//同一個類中,通配符調用不同方法
<action name="*Action" class="com.action.LoginRegistAction" method="${1}">
    ...
</action>

public class LoginRegistAction extends ActionSupport {
    //省略其他
    public String login() throws Exception {
        ...
    }
    public String regist() throws Exception {
        ...
    }
}

function regist() {
    targetForm = document.forms[0];
    targetForm.action = "registAction";
}
此時會默認調用LoginRegistAction中的regist()方法

//在不同類中,調用默認方法
<action name="*Action" class="com.action.{1}Action">
    ...
</action>

//同時在class和method屬性中使用通配符
<action name="*_*" method="${2}" class="com.action.{1}">
例如:URL是BookAction_save, 調用BookAction中的save方法

此外,還可以:
<action name="Login_*" class="com.action.LoginAction" method="${1}">

<action name="*">
    <result>${1}.jsp</result>
</action>

這種方式會帶來一個問題:
例如:abcAction.action,同時符合在struts.xml中配置的:abcAction、*Action、*,這三個,這三種匹配並沒有優先匹配的說法,先找到哪個就會使用哪個進行處理

配置默認Action

<package name="xx" extends="struts-default">
    <default-action-ref name="resultAction">
    <action name="resultAction" class="com.action.ResultAction">
        ...
    </action>
</package>

配置Action的默認處理類

<package name="struts-default" abstract="true">
    <default-class-ref class="com.opensymphony.
    xwork2.ActionSupport">
</package>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章