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"/>
最後に [更新] ボタンが押された場合のプロセスをたどってみましょう。[更新] ボタンが押されると
- リクエストパラメータ method で "更新" という値が送られます。
- メッセージリソースから "更新" を逆引きして "label.update" という値を得ます。
- getKeyMethodMap() メソッドで返される Map オブジェクトから "label.update" をキーとして "update" という値を得ます。
- "update" という名前のメソッドを呼び出します。
実習課題 3
以下の Web アプリケーションを、Struts を用いて作成しなさい。
- 入力フォームにはテキストボックスが 1つだけ含まれる。
- submit ボタンは [表示] と [検索] の 2つ
- 表示ボタンが押されたときは、入力された値を表示する。
- 検索ボタンが押されたときは、入力された値を Google で検索した結果ページを表示する。