Strutsで実行するアクションメソッドを指定する

2008年最初の記事です。
Strutsのサブミットボタンのカスタムタグをカスタマイズし、アクションメソッドを指定できるようにしてみます。
DispatchActionを使用すると、1つのアクションクラスに複数のメソッドを用意しどのメソッドをDispatchするかをパラメータで指定することができるようになります。この仕組みについての説明は、「civic site : Struts開発パターン3」を参考にしてください。

サブミットボタン単位で、イベントメソッドを切り替えて送信する場合には、JavaScriptでcmdパラメータを指定します。この機能を持ったサブミットボタンを作ろうというのが今回の目的です。
dsipatchsubmittag.png
つまり、こんな風にボタンに対して呼び出したいイベントメソッドをボタン単位で指定できるようにします。


<html:submit cmd="plus">足し算</html:submit>
<html:submit cmd="minus">引き算</html:submit>

Actionクラス

Actionクラスは、DispatchActionを継承して2つのメソッドを用意します。


public class TagTestAction extends DispatchAction {
  /** 足し算ボタン用メソッド */
  public ActionForward plus(ActionMapping mapping, ActionForm form,
      HttpServletRequest request, HttpServletResponse response)
      throws Exception {

    ~中略~
  }
  /** 引き算ボタン用メソッド */
  public ActionForward minus(ActionMapping mapping, ActionForm form,
      HttpServletRequest request, HttpServletResponse response)
      throws Exception {
    ~中略~
  }
}

カスタムタグ:DispatchSubmitTag

新しいカスタムタグDispatchSubmitTagをStruts純正のSubmitTagを継承して作成します。
このタグには純正SubmitTagに加えて新しい属性cmdを指定できるようにします。属性cmdをJavaBeanのプロパティとして用意します。


public class DispatchSubmitTag extends SubmitTag {
  private String cmd = "";
  public String getCmd() {
    return cmd;
  }
  public void setCmd(String cmd) {
    this.cmd = cmd;
  }
  ~中略~
}

加えて、JavaScriptのonclickイベントでcmd値を変更するスクリプトを自動出力します。
getOnclickメソッドをオーバーライドするだけでSubmitTagの一部の処理を拡張できます。

@Override
public String getOnclick() {
  String org = super.getOnclick();
  //親のFormタグを取得
  FormTag formTag = (FormTag)findAncestorWithClass(this, FormTag.class);
  //onclickスクリプトを変更
  StringBuffer buff = new StringBuffer();
  buff.append(formTag.getBeanName());
  buff.append(".cmd.value='");
  buff.append(cmd);
  buff.append("';");
  buff.append(org == null ? "" : org);
  return buff.toString();
}

さらに、DispatchActionで必要となる、リクエストパラメータcmdを自動的に出力するようにします。

@Override
public int doEndTag() throws JspException {

  //最初にDispatchSubmitTagが出力されたときにhiddenタグを出力する
  if (pageContext.getAttribute(SubmitTag.class.getName()) == null){
    TagUtils.getInstance().write(this.pageContext, "<input type='hidden' name='cmd' />");
    pageContext.setAttribute(SubmitTag.class.getName(), Boolean.TRUE);
  }
  return super.doEndTag();
}

TLDファイル

TLDファイルを修正します。今回はタグの追加ではなく、もともとのSubmitTagを作成したDispatchSubmitTagに置き換えます。
struts-html.tldファイルのなかから、<tag><name>submit</name></tag>の部分を検索して見つけ、<tagclass>タグのクラス名を、自作したDispatchSubmitTagに変更します。


<tag>
  <name>submit</name>
  <tagclass>struts.tags.DispatchSubmitTag</tagclass>
  ~中略~
</tag>

そして追加した属性cmdを<attribute>要素として追加します。

<tag>
  <name>submit</name>
  <tagclass>struts.tags.DispatchSubmitTag</tagclass>
  <attribute>
    <name>cmd</name>
    <required>true</required>
    <rtexprvalue>true</rtexprvalue>
  </attribute>
  ~中略~
</tag>

JSP

JSPは最初に示した例のように、submitタグでどのメソッドを呼び出すのか指定できるようになりました。


<html:submit cmd="plus">足し算</html:submit>
<html:submit cmd="minus">引き算</html:submit>

このようにすることで、Strutsに慣れていない人に説明する時にも、「このcmd属性に書いたメソッドが動くんだよ」と教えることができるようになります。1画面にたくさんのボタンがあってそれぞれにイベントメソッドを割り当てたい場合には便利です。

サンプルソースコード

関連記事


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)