目次へ

17.3. org.apache.struts.actions.LookupDispatchAction

LookupDispatchAction は DispatchAction に似ていますが、ディスパッチメソッドを呼び出すプロセスが異なります。DispatchAction はリクエストパラメータの値と同じ名前のメソッドを呼び出しますが、LookupDispatchAction はリクエストパラメータの値でメッセージリソースを逆引きし、得た値をキーとして自身が持つ Map からメソッド名を取得します。メッセージリソースを使用するため、押されたボタンによって処理を振り分けたい場合に便利です。

label.update=更新
label.delete=削除

たとえば上記のような記述がメッセージリソースにあるとき、以下の JSP コードは submit ボタンとして [更新] [削除] ボタンを生成します。

...
<html:form action="..." method="POST">
  <html:text property="id"/>
  <html:submit property="method"><bean:message key="label.update"/></html:submit>
  <html:submit property="method"><bean:message key="label.delete"/></html:submit>
</html:form>
...

Action クラスは org.apache.struts.actions.LookupDispatchAction クラスを継承して作成します。Action クラスの実装方法は DispatchAction とあまり変わりませんが、Map からメソッド名を取得する必要があるため getKeyMethodMap() メソッドを実装する必要があります。

public class SampleDispatchAction extends LookupDispatchAction {
    protected Map getKeyMethodMap() {
        Map map = new HashMap();
        map.put("label.update", "update");
        map.put("label.delete", "delete");
        return map;
    }

    public ActionForward update(ActionMapping mapping,
                                ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response)
                         throws Exception {

        // ここに処理を書きます。
        return mapping.findForward("update");
    }

    public ActionForward delete(ActionMapping mapping,
                                ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response)
                         throws Exception {

        // ここに処理を書きます。
        return mapping.findForward("delete");
    }
}

Map の第 1引数にはメッセージリソースのキーを、第 2引数には逆引きによりそのキーが取得された場合に呼び出されるメソッド名を指定します。Struts 設定ファイルには DispatchAction の場合と同様にボタンの値が送られてくるリクエストパラメータ名を parameter 属性で指定します。指定する値は submit タグの property 要素とあわせる必要があります。

<action path="/test"
        type="example.SampleDispatchAction"
        parameter="method"
        name="myForm"
        scope="request"
        input="/test.jsp"/>

最後に [更新] ボタンが押された場合のプロセスをたどってみましょう。[更新] ボタンが押されると

  1. リクエストパラメータ method で "更新" という値が送られます。
  2. メッセージリソースから "更新" を逆引きして "label.update" という値を得ます。
  3. getKeyMethodMap() メソッドで返される Map オブジェクトから "label.update" をキーとして "update" という値を得ます。
  4. "update" という名前のメソッドを呼び出します。

実習課題 3

以下の Web アプリケーションを、Struts を用いて作成しなさい。

  • 入力フォームにはテキストボックスが 1つだけ含まれる。
  • submit ボタンは [表示] と [検索] の 2つ
  • 表示ボタンが押されたときは、入力された値を表示する。
  • 検索ボタンが押されたときは、入力された値を Google で検索した結果ページを表示する。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp