リファレンストップへ Java | DispatchActionとLookupDispatchAction使用した環境 JDK 6 Update 11 struts 1.3.10 ボタンやリンクごとに呼び出すメソッドを切り替えるような実装が可能となります。通常、1ボタンにつき1アクションといった構成になる事が多いと思いますが、1つの画面に幾つものボタンがある場合 例えば、登録・更新・削除などといったボタンがある画面の場合は 幾つもアクションクラスを作成しなくてはならないのは負担になります。 DispatchActionとLookupDispatchActionは若干アクションの実装方法が異なりますが、上記のようなケースの場合に 1つのアクションだけで対応可能にする事ができます。 DispatchActionリクエストパラメータに呼び出すメソッド名を仕込む方法です。DispatchActionは、主にリンクのURLパラメータごとに呼び出すメソッドを切り替えたい場合に使用します。 まず、メソッド名を保持するのが、どのリクエストパラメータ名であるかをstruts-configにて定義します。 <action parameter="method"とする事で、呼び出すメソッド名のパラメータ名は.do?method=xxxとなります。path="/sample" name="SampleForm" type="action.SampleAction" validate="false" parameter="method" > <forward name="success" path="/sample.jsp" /> </action> このパラメータ名は自由に設定可能です。 アクションは以下のようになります。 public class SampleAction extends DispatchAction { 通常のActionではなく、org.apache.struts.actions.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"); } } executeはオーバーライドしません。 また、それぞれのメソッドの引数と戻り値はexecuteを実装する場合と同じになります。 unspecifiedメソッドは、メソッド名パラメータが存在しない場合に呼び出されます。 実装しなくても問題ありません。「unspecified」というメソッド名は固定です。 LookupDispatchActionリクエストパラメータと呼び出すメソッド名をマッピングする方法です。LookupDispatchActionは主にボタンに応じて呼び出すメソッドを切り替えたい場合に使用します。 まず、メソッド名を保持するのが、どのリクエストパラメータ名であるかをstruts-configにて定義します。 <action parameter="method"とする事で、呼び出すメソッド名のパラメータ名は.do?method=xxxとなります。path="/sample" name="SampleForm" type="action.SampleAction" validate="false" parameter="method" > <forward name="success" path="/sample.jsp" /> </action> このパラメータ名は自由に設定可能です。 次にMessageResources.propertiesに、submitボタンの表示文言(ラベル)を定義しておきます。 label.regist=登録 label.update=更新 label.delete=削除 JSPは以下のように記述します。 <html:form action="/sample"> <html:submit>タグのproperty="method"は、struts-configで定義しておいたparameter="method"の値と同一にしておく必要があります。<%-- 登録ボタン --%> <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> また、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」というメソッド名は固定です。 |
|