T2入門その3 -@ActionParam-

T2入門その1 -@Pageとアクションメソッド-
T2入門その2 -@ActionPath-


大分時間が空いてしまってすいません。
今回は第3回で、@ActionParamです。
@ActionParamはT2でも中心的な機能のひとつです。


第2回でお話したとおり、@ActionPathはURLによって制約を与える機能でした。
@ActionParamはリクエストパラメータによって制約を与えます。

JavaJSPベースのWebアプリケーション開発を行っていると、よく要望として
押したボタンごとに呼び出すメソッドをわけておきたいという要望があります。
押したボタンがイコール呼び出すメソッドとなっているのが直感的でわかりやすいというのは誰もが
経験あることじゃないかと思います。


この要望に応えるアノテーションが@ActionParamです。

簡単に言えば、

@ActionParamは画面側で押したボタンを認識し、その名前のメソッドを呼び出す

となります。


シンプルな足し算のJSPを考えてみましょう。

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" errorPage="/error/debug.jsp"%>
<%@taglib prefix="t" uri="http://www.t2framework.org/web/t2/functions"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>足し算画面</title>
</head>
<body>
<div>${message}</div>
<form name="addForm" action="${t:url('/add')}" method="post">
	<input type="text" name="arg1" value="${arg1}"/>
	<br />
	<input type="text" name="arg2" value="${arg2}"/>
	<br />
	<span>${result}</span><br />
	<input type="submit" name="add" value="同一ページ"/>
	<input type="submit" name="addAndMove" value="結果ページ"/>
	<input type="submit" name="addWithForm" value="@Formを使った足し算"/>
</form>
</body>
</html>

submitボタンのname属性がadd、addAndMove、addWithFormと分かれています。
これらを呼び分けたいときに@ActionParamを使います。こんな感じになります。

package examples.page;

(インポート文省略)
/**
 * ベーシックな足し算の例.バリデーションも自前.
 * 
 * @param context
 * @return
 */
@RequestScope
@Page("add")
public class AddPage {

	@Default
	public Navigation index(WebContext context) {
		return Redirect.to("jsp/add.jsp");
	}

	@POST
	@ActionParam
	public Navigation add(WebContext context) {
		//同じ画面で足し算
		return Forward.to("jsp/add.jsp");
	}

	protected boolean isBothEmpty(String s1, String s2) {
		return StringUtil.isEmpty(s1) || StringUtil.isEmpty(s2);
	}

	@POST
	@ActionParam("addAndMove")
	public Navigation add2(WebContext context) {
		//足し算して結果画面に遷移
		return Forward.to("jsp/addResult.jsp");
	}

	@POST
	@ActionParam
	public Navigation addWithForm(@Form AddForm dto, WebContext context) {
		//0.4の新機能の@Formを使って足し算
		return Forward.to("jsp/add.jsp");
	}

}


@ActionParamはvalue値が指定されない場合、メソッド名とリクエストパラメータの値をマッチングします。
@ActionParam("addAndMove")のように指定があればもちろんそちらが優先です。


@ActionParamによって画面のどのボタンが押されたかを認識できるので、
ありがちな「戻るボタンなのにバリデーションされてしまった」などという問題は起こりません。


今後の課題としては、@ActionParamのvalue値に簡単な式表現を許可するかどうかですね。
例えばテンプレートエンジンによりますが、連番でname属性に-1、-2なんてつくようなものを同一視したい・同一視したくない等
ありえる要望です。いまでも多分そこそこいけるはずですが、この辺は要望をみつつ決めていきたいと考えています。


次回は、今までの趣向と少し変えて、戻り値であるNavigationとその子クラスについて少し説明したいと思います。