PGBox
P
G
Box

DispatchActionとLookupDispatchAction

機能リファレンスのメニューへ戻る



使用した環境
JDK 6 Update 11
struts 1.3.10

ボタンやリンクごとに呼び出すメソッドを切り替えるような実装が可能となります。


通常、1ボタンにつき1アクションといった構成になる事が多いと思いますが、1つの画面に幾つものボタンがある場合
例えば、登録・更新・削除などといったボタンがある画面の場合は
幾つもアクションクラスを作成しなくてはならないのは負担になります。

DispatchActionとLookupDispatchActionは若干アクションの実装方法が異なりますが、上記のようなケースの場合に
1つのアクションだけで対応可能にする事ができます。

DispatchAction

リクエストパラメータに呼び出すメソッド名を仕込む方法です。
DispatchActionは、主にリンクのURLパラメータごとに呼び出すメソッドを切り替えたい場合に使用します。


まず、メソッド名を保持するのが、どのリクエストパラメータ名であるかをstruts-configにて定義します。
<action 
    path="/sample" 
    name="SampleForm" 
    type="action.SampleAction" 
    validate="false" 
    parameter="method"
    >
    
    <forward name="success" path="/sample.jsp" />
</action>
parameter="method"とする事で、呼び出すメソッド名のパラメータ名は.do?method=xxxとなります。
このパラメータ名は自由に設定可能です。

アクションは以下のようになります。
public class SampleAction extends DispatchAction {
    
    // /xxx/sample.doのように、methodパラメータがない場合にデフォルトで呼び出すメソッド
    public ActionForward unspecified(ActionMapping mapping, ActionForm form
        , HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        System.out.println("unspecified");
        
        return mapping.findForward("success");
    }
    
    // /xxx/sample.do?method=regist の場合に呼び出すメソッド
    public ActionForward regist(ActionMapping mapping, ActionForm form
        , HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        System.out.println("regist");

        return mapping.findForward("success");
    }
    
    // /xxx/sample.do?method=update の場合に呼び出すメソッド
    public ActionForward update(ActionMapping mapping, ActionForm form
        , HttpServletRequest request, HttpServletResponse response) throws Exception {

        System.out.println("update");

        return mapping.findForward("success");
    }
    
    // /xxx/sample.do?method=delete の場合に呼び出すメソッド
    public ActionForward delete(ActionMapping mapping, ActionForm form
        , HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        System.out.println("delete");

        return mapping.findForward("success");
    }
}
通常のActionではなく、org.apache.struts.actions.DispatchActionを継承します。
executeはオーバーライドしません。

また、それぞれのメソッドの引数と戻り値はexecuteを実装する場合と同じになります。
unspecifiedメソッドは、メソッド名パラメータが存在しない場合に呼び出されます。
実装しなくても問題ありません。「unspecified」というメソッド名は固定です。


LookupDispatchAction

リクエストパラメータと呼び出すメソッド名をマッピングする方法です。

LookupDispatchActionは主にボタンに応じて呼び出すメソッドを切り替えたい場合に使用します。


まず、メソッド名を保持するのが、どのリクエストパラメータ名であるかをstruts-configにて定義します。
<action 
    path="/sample" 
    name="SampleForm" 
    type="action.SampleAction" 
    validate="false" 
    parameter="method"
    >
    
    <forward name="success" path="/sample.jsp" />
</action>
parameter="method"とする事で、呼び出すメソッド名のパラメータ名は.do?method=xxxとなります。
このパラメータ名は自由に設定可能です。

次にMessageResources.propertiesに、submitボタンの表示文言(ラベル)を定義しておきます。
label.regist=登録
label.update=更新
label.delete=削除


JSPは以下のように記述します。
<html:form action="/sample">
    
    <%-- 登録ボタン --%>
    <html:submit property="method"><bean:message key="label.regist" /></html:submit>

    <%-- 更新ボタン --%>
    <html:submit property="method"><bean:message key="label.update" /></html:submit>

    <%-- 削除ボタン --%>
    <html:submit property="method"><bean:message key="label.delete" /></html:submit>
    
</html:form>
<html:submit>タグのproperty="method"は、struts-configで定義しておいたparameter="method"の値と同一にしておく必要があります。
また、bean:messageタグを使用して、ボタンの表示ラベルをMessageResources.propertiesから取得しています。


アクションは以下のようになります。
public class SampleAction extends LookupDispatchAction {
    
    
    @Override
    protected Map getKeyMethodMap() {

        // ボタンのラベルキーと呼び出すメソッド名のマップを作成する
        Map<String, String> map = new HashMap<String, String>();
        map.put("label.regist", "regist");
        map.put("label.update", "update");
        map.put("label.delete", "delete");
        
        return map;
    }
    


    // どのボタンも押下されていない場合(初期表示時)に呼び出されるメソッド
    public ActionForward unspecified(ActionMapping mapping, ActionForm form
        , HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        System.out.println("unspecified");
        
        return mapping.findForward("success");
    }
    
    // label.registのボタンが押下された場合に呼び出されるメソッド
    public ActionForward regist(ActionMapping mapping, ActionForm form
        , HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        System.out.println("regist");

        return mapping.findForward("success");
    }
    
    // label.updateのボタンが押下された場合に呼び出されるメソッド
    public ActionForward update(ActionMapping mapping, ActionForm form
        , HttpServletRequest request, HttpServletResponse response) throws Exception {

        System.out.println("update");

        return mapping.findForward("success");
    }
    
    // label.deleteのボタンが押下された場合に呼び出されるメソッド
    public ActionForward delete(ActionMapping mapping, ActionForm form
        , HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        System.out.println("delete");

        return mapping.findForward("success");
    }
}

通常のActionではなく、org.apache.struts.actions.LookupDispatchActionを継承します。
executeはオーバーライドしません。

LookupDispatchActionを使用する場合はgetKeyMethodMapメソッドをオーバーライドする必要があります。
MessageResources.propertiesに定義されているボタンのラベルのキーと、それに対応するメソッド名のマップを作成します。


また、それぞれのメソッドの引数と戻り値はexecuteを実装する場合と同じになります。
unspecifiedメソッドは、メソッド名パラメータが存在しない場合に呼び出されます。
実装しなくても問題ありません。「unspecified」というメソッド名は固定です。





機能リファレンスのメニューへ戻る