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


さて、リリースはしたT2 0.3(通称Project Diet)ですが、まだまだドキュメントも足りずノウハウも
たまっていません.なので毎日くらいの勢いでドキュメントの元ネタをがんがんblogに書こうと思います.


まずは今日はT2の基本中の基本について書いてみたいと思います.
T2の基本、それはアノテーションです.
アノテーションで、URLの一部とPOJOマッピングして、POJO内のメソッドを条件にマッチするときに実行します.
これが基本です.


ここでHelloWorldが来ると思う方も多いでしょうが、実はT2-samplesではGetAndPostPageというクラスが
一番簡単なサンプルです.このサンプルはまるでServlet3.0仕様か!くらいの非常に簡単かつ純粋なサンプルですw


ではまずはGetAndPostPageを見てみましょう.
GetAndPostPageでは、http://yourdomain.com/context-root/getandpostというURLでViewからリクエストされた場合に
動くPOJOとします.あ、yourdomain.comとcontext-rootは特に今回は関係ないので適当です.

@Page("getandpost")が一番の基本です.
(@RequestScopeとかはT2の機能じゃないのでまた今度説明します)
これでhttp://yourdomain.com/context-root/getandpostというリクエストがあったら、
Pageクラスはこいつが使われることが確定します.
こんな感じになります.

package examples.page;
......
/**
 * This example shows you T2 can do like Servlet3.0:P
 * 
 * @author shot
 * 
 */
@RequestScope
@Page("getandpost")
public class GetAndPostPage {

ここまで簡単なので、おわかりいただけるかと思います.
では次にメソッドの説明にいきましょう!
T2で呼び出されるメソッドを「アクションメソッド」と呼びます.
アクションメソッドは以下のような形になります.

  1. 戻り値はNavigationインタフェースの実装クラス
  2. メソッドアノテーションによって、呼び出すときの条件を決定する
  3. 引数アノテーションによって、渡す値を絞り込んだりもできる
  4. 暗黙的に引数に渡せる値はHttpServletRequestなどいくつか存在する(ここはドキュメントよんでちょ)



T2のポリシーとして、HTTPメソッドごとにアクションメソッドは呼び分けるようにしています.
これとっても重要です. HTTPのメソッドが違えばやりたいことも違うでしょう、というのがT2の考え方です.
強制はしてませんから、別に一緒にもできますが、ちゃーんとHTTPの基本に則って開発するのが良いですよ、という
T2のメッセージと捉えてほしいと思ってます^^


ではPOSTとGETを分けて実行してみましょう.
HTTPメソッド用のアノテーションとして、@POST/@GETを使います.

こんな感じ.まるでServlet3.0・・・・

	@POST
	public Navigation post(HttpServletRequest request,
			HttpServletResponse response) {
		request.setAttribute("message", "Do POST.");
		return Forward.to("jsp/simpleGetAndPost.jsp");
	}

	@GET
	public Navigation get(HttpServletRequest request,
			HttpServletResponse response) {
		request.setAttribute("message", "Do GET.");
		return Forward.to("jsp/simpleGetAndPost.jsp");
	}


@POST/@GETがついたメソッド、どちらもリクエストに値をちょろっと設定して、フォワードしているだけです.
が、これでHTTPメソッドごとに呼び出すメソッドを切り分けることができるようになってます.
PUTとDELETEも実は動かすように出来ますが今のところOFFにしてたはず.
0.4か0.5でコンソールクライアントのサンプルでも作ろうと思っているので、そこから使えるようにしようかな・・・


最後にjspは以下のような感じです.
${t:url('/getandpost')とかはJSPのFunction機能で、コンテキストルートを先頭に追加してるだけです.
JSP2.0から入ったFunction機能はCubbyで知りました。ありがとう、Cubbyの皆さん!!
しかし、便利すぐる、Function.

<%@ 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>Simple GET and POST</title>
</head>
<body>
<span>${ message }</span>
<form name="form1" action="${t:url('/getandpost')}" method="post">
	<input type="submit" name="posts" value="POST"/>
</form>
<form name="form2" action="${t:url('/getandpost')}" method="get">
	<input type="submit" name="gets" value="GET"/>
</form>
</body>
</html>


駆け足でT2の基本@Pageと、@POST/@GETを説明してみました.
まとめると、以下の2点です.

  1. POJOに@PageでURL断片とマッピング
  2. @POSTまたは@GETでHTTPメソッドごとに呼び出すメソッドを確定


次回はアクションメソッドを呼び出す条件を絞り込む、@ActionPathなどを説明します.