T2入門その2 -@ActionPath-


さて、前回はT2の基本的な@Page、@POST/@GETについて説明しました.

今日はその続き、@ActionPath(と@Default)です.


前回のように物凄いシンプルな画面をつくるのであれば@POST/@GETで
問題ないですが、もう少し気の効いたことをしようとおもうと、あれだけでは足りません.


特にキレイなURLをつかって、メソッドを呼び分けたい場合などを考えると
なにかそこに制約が必要です.このURLを使って制約を与える機能の1つが@ActionPathです.



@ActionPath : 主にGETで使用され、URL指定で呼び出されるアクションメソッドを指定するアノテーション
value : アクセスされたときのURL.省略されると、メソッド名と同一のものが呼ばれる.


また、@DefaultはそのPageクラスのデフォルトでアクセスされるメソッドを決めます.
各Pageクラスにひとつ配置することを推奨してます.


では使い方を見てみましょう.HelloWorld的なもので試してみます.
URLのマッピング例として以下のような場合を考えてメソッドを呼び分けてみましょう.


この場合を考えると、


実装コードは以下のような形になります.

(パッケージなど省略)
/**
 * シンプルなHello Worldサンプル.
 * 
 * @author shot
 */
/* http://yourdomain/t2-samples/helloでマッピング. */
@RequestScope
@Page("hello")
public class HelloPage {

	protected HelloService helloService;

	@Default
	public Navigation index(WebContext context) {
		context.getRequest().setAttribute("greet", helloService.hello());
		return Forward.to("/jsp/hello.jsp");
	}

	/**
	 * http://yourdomain/t2-samples/hello/requestというURLで呼ばれる.
	 */
	@ActionPath
	public Navigation request(HttpServletRequest request) {
		System.out.println("request.getContextPath() : "
				+ request.getContextPath());
		request.setAttribute("greet", helloService.hello()
				+ " from request().");
		return Forward.to("/jsp/hello.jsp");
	}

	/**
	 * @ActionPathでvalueとして、"struts"としているので、
	 * http://yourdomain/t2-samples/hello/strutsというURLの場合呼ばれる.
	 */
	@ActionPath("struts")
	public Navigation likeStrutsType(HttpServletRequest request,
			HttpServletResponse response) {
		System.out.println("request.getContextPath() : "
				+ request.getContextPath());
		request.setAttribute("greet", helloService.hello()
				+ " from likeStrutsType().");
		return Forward.to("/jsp/hello.jsp");
	}

	/**
	 * Lucyによってインジェクトされる.
	 * 
	 * @param helloService
	 */
	@Inject
	public void setHelloService(HelloService helloService) {
		this.helloService = helloService;
	}

}

@ActionPathのvalue値は省略できます.省略するとメソッドと同じ名前を使います.
このあたりはT2の数少ない規約のひとつです.詳細はドキュメント参照.

クローズアップすると、以下のrequestメソッドが@ActionPathの省略系にあたります.

	/**
	 * http://yourdomain/t2-samples/hello/requestというURLで呼ばれる.
	 */
	@ActionPath
	public Navigation request(HttpServletRequest request) {
              ......


もちろん明示的に値を指定することも出来ます.

	/**
	 * @ActionPathでvalueとして、"struts"としているので、
	 * http://yourdomain/t2-samples/hello/strutsというURLの場合呼ばれる.
	 */
	@ActionPath("struts")
	public Navigation likeStrutsType(HttpServletRequest request,
              ......


@ActionPathは通常@GETと一緒に呼ばれることを想定していますが
特に何の制限もしていないので@POSTでも使えると思います.


まとめると、@POST/@GETだけでは機能的にあまりに自由すぎるので、
呼び出すアクションメソッドに対してURLベースで制約を与える機能、それが@ActionPathです.


次回はもうひとつのActionアノテーション、@ActionParamです.

Tomcat Lite


Tomcatの開発メーリングリスト(dev@tomcat.apache.org)で最近Tomcat Liteを作る話が出てますね。

というか多分もう出来ているので、次(Tomcat7)から正式リリースにするかどうか、みたいな話に読めます。

ちら見しかしてないので、アレですけどw


軽量なTomcatは歓迎すべきところですが、仕様が大きく変わったらいやだなあ・・・・

T2+ZPT


id:skirnirさんがT2+ZPTのやり方を書いてくれました!ありがとー^^

T2はテンプレートエンジン非依存型かつFilter指向なので、テンプレートエンジンは簡単に切り替えられます.


blogはこちら.


Wikiはこちら.