LookupDispatchAction

dispatchアクションの選択にはよくボタンが使われますが、他言語サポートのアプリケーションなどでは、ユーザのロケールによってボタンのラベルが違ったりするので問題がでてきます。 例えば英語と日本語をサポートしているサイトのフォームでは、ボタンがdeleteだったり消去だったりするわけです。 そんな場合に役立つのが、Struts1.1からできたLookupDispatchActionです。
action-mappingはDispatchActionと同じです。


<action path="/recordAction"
type="app.RecordLookupDispatchAction"
name="recordForm"
scope="request"
input="record.jsp"
parameter="method"> ←methodという名前でパラメータの受渡しをします。
<forward name="success" path="confirm.jsp"/>
</action>
methodという名前のパラメータでアプリケーションリソースでマッチするキーを見付けます。 例えば、ApplicationResources.propertiesファイルに↓このようなラインがあります。

button.create=Create
button.delete=Delete
button.update=Update
また、ApplicationResources_ja.propertiesファイルには、同じようなラインが日本語で設定されています。

button.create=追加
button.delete=削除
button.update=変更
JSPファイルには下のようなボタンを作成します。

<html:form action="/recordAction">

<html:submit property="method">
<bean:message key="button.create"/>
</html:submit>

<html:submit property="method">
<bean:message key="button.delete"/>
</html:submit>

<html:submit property="method">
<bean:message key="button.update"/>
</html:submit>

</html:form>

ユーザのロケール設定により、ボタンのラベルが"create"だったり、"追加"だったりするわけです。
そしてDispatchActionの時のように各メソッドを作成するんですが、その前にインプリメントしないといけないのが、getKeyMethodMapです。

protected Map getKeyMethodMap() {
Map map = new HashMap();
map.put("button.create", "create");
map.put("button.delete", "delete");
map.put("button.update", "update");
return map;
}

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

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

これで、ユーザのロケール設定が何であろうと、ボタンのバリューが日本語であろうと、正しいメソッドが選択されます。
マッチしないキー(例えば上の例で"add"など)がパスされた場合はexceptionになります。また、同じキーが2つ以上ある場合は、最初に見付けられたものが使われます。