4月 7th, 2008at 12:29

Tags: ,

Struts1.3.5でLookupDispatchActionを使ったディスパッチ

このエントリーをはてなブックマークに追加

http://struts.apache.org/1.3.5/struts-extras/apidocs/org/apache/struts/actions/LookupDispatchAction.html

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が以下のように実装されていたら・・・

@Overrideprotected Map getKeyMethodMap() {    Map map = new HashMap();    map.put("user.reg", "userReg");    map.put("user.info.reg", "userInfoReg");    return map;}

これだと、どっちの登録かわかんない。多分、「先にみつかったキー」で実行されてしまうため、メソッドの実行が保障できなくなってしまう。

よって、同一アクション内では同じ名前のボタンを許すことができなくなる。

このエントリーをはてなブックマークに追加