DispatchActionとは異なり、メッセージリソースのキーからディスパッチを行ってくれる。
使い方
LookupDispatchActionを継承したActionクラスを作成。getKeyMethodMapをオーバーライドする。
public class LoginAction extends LookupDispatchAction {
private static final String CLASS_NAME = "LoginAction";
private WebAppLogger logger = WebAppLogger.getInstance();
@Override
protected Map getKeyMethodMap() {
Map map = new HashMap();
map.put("login.login.button", "login");
return map;
}
public ActionForward login(ActionMapping map,
ActionForm form,
HttpServletRequest req,
HttpServletResponse res) {
}
JSPにmethodパラメタを埋め込む。
<html:submit property="method">
<bean:message key="login.login.button" />
</html:submit>
以下でもOK。
<html:submit property="method">ログイン</html:submit>
メッセージリソースに「login.login.button」というキーとその値を追加。日本語の場合はnative2asciiで変換が必要。
login.login.button=ログイン < わかりやすくするために日本語としている
struts-config.xmlはDispatchActionのときと同じく、parameter属性を追加しておく。
<action path="/login"
type="com.daipresents.struts135.login.LoginAction"
name="LoginForm"
scope="request"
parameter="method">
<forward name="success" path="top" />
<forward name="error" path="/login/login.jsp" />
</action>
動作は以下の通り。
- JSPでは「<input type=”submit” name=”method” value=”ログイン”>」という風に出力される
- valueである「ログイン」がmethodパラメタの値として飛ばされる
- LookupDispatchActionメッセージリソースから値が「ログイン」のものを見つける
- getKeyMethodMapメソッドが返すMapから、見つけたキーで値を取得する
- 取得した値をメソッド名として呼び出す
問題点
画面は異なっていても同じ名前のボタンが存在する場合がありえる。例えば、ユーザーの新規登録ボタンとユーザ情報の登録ボタンなど、「登録」とまとめてしまいたいときもある。
そういうときはメッセージリソースが以下のようになってしまう。
user.reg=登録
user.info.reg=登録
そしてgetKeyMethodMapが以下のように実装されていたら・・・
@Override
protected Map getKeyMethodMap() {
Map map = new HashMap();
map.put("user.reg", "userReg");
map.put("user.info.reg", "userInfoReg");
return map;
}
これだと、どっちの登録かわかんない。多分、「先にみつかったキー」で実行されてしまうため、メソッドの実行が保障できなくなってしまう。
よって、同一アクション内では同じ名前のボタンを許すことができなくなる。