|
Annotation
en , ja アノテーション
アノテーションの指定の仕方T2の機能はアノテーションベースで成り立っています. アノテーションとは、Javaの標準機能のひとつでクラスやメソッドにつける注釈のようなものです. T2はこのアノテーションを読み取って、実行時値を設定したり、あるメソッドを呼び出すか・呼び出さないかを決定したりします. T2が使うアノテーションには大きく分けて3つあり、クラスにつけるクラスアノテーション、メソッドにつけるメソッドアノテーション、 メソッドの引数につける引数アノテーションです.クラスアノテーションはクラス全体で有効なもので、メソッドアノテーションは そのメソッドだけに影響し、引数アノテーションはメソッドに渡されるパラメータだけに影響するアノテーションです. 従って、このアノテーションをソースコードに書いておくことで、このクラスはPageクラスなので、/hogeというURLの時に呼び出してほしいということや、このメソッドは、リクエストパラメータに"foo"という文字列があった時に呼んでほしいというような事を、T2に伝えることができます。 クラスアノテーションクラスアノテーションは主にPageクラスとして認識させるためや、そのPageクラス全体で有効な設定を表す場合に使います. @Page@PageはこのクラスがT2で管理すべきPageクラスであることを示します. 属性
@ForwardTo@ForwardToはNavigationのForwardでクラスを引数にして遷移するための補助アノテーションです. 属性
メソッドアノテーションメソッドアノテーションはアクションメソッドにつけます. アクションメソッド以外につけてもT2では効果がありません. @GETHTTPのGETメソッドのみを許可するアノテーションです. 属性属性は特にありません. @POSTHTTPのPOSTメソッドのみを許可するアノテーションです. 属性属性は特にありません. @PUTHTTPのPUTメソッドのみを許可するアノテーションです. 属性属性は特にありません. @DELETEHTTPのDELETメソッドのみを許可するアノテーションです. 属性属性は特にありません. @HEADHTTPのHEADメソッドのみを許可するアノテーションです. 属性属性は特にありません. @OPTIONSHTTPのOPTIONSメソッドのみを許可するアノテーションです. 属性属性は特にありません. @ActionPath@ActionPathはURLによって呼び出されるアクションメソッドを指定するアノテーションです. このアノテーションをつけておけば、各URLごとに呼び出し先のメソッドを変えることが出来ます. また、このアノテーションは評価式を書くことが出来ます.評価式に関しては、こちらを参照してください. @ActionPathはAjaxリクエストを扱う@Ajaxと併用が出来ません. 属性
サンプル@Page("hello")
public class HelloPage {
@ActionPath
public Navigation request(HttpServletRequest request) {
...
}
@ActionPath("struts")
public Navigation likeStrutsType(HttpServletRequest request,
HttpServletResponse response) {
...
}@ActionParam@ActionParamは、リクエストパラメータに指定されたname属性と一致するかを判定するアノテーションです. わかりやすく言えば、押されたボタンのname属性と同一かどうかを判定するので、押されたボタンごとにアクションメソッドをキレイに分離することが出来ます. @ActionParamはAjaxリクエストを扱う@Ajaxと併用が出来ません. 属性
サンプル@Page("add")
public class AddPage {
@POST
@ActionParam
public Navigation add(WebContext context) {
...
}@Default@DefaultはPageクラス内で他のアクションメソッドアノテーションがどれも呼ばれなかったときのデフォルトの挙動をあらわすアノテーションです. T2では慣習的に、各画面の初期起動時は@Defaultで処理させるスタイルをお奨めしています.
属性特にありません. サンプル@Page("/hello")
public class HelloPage {
@Default
public Navigation index(Request request) {
request.setAttribute("greet", helloService.hello());
return Forward.to("/jsp/hello.jsp");
}
@Ajax@AjaxはXmlHttpRequest(Ajaxリクエスト)で呼ばれるアクションメソッドを指定します. XmlHttpRequestかどうかを判定するのには、以下の条件を満たすこととします.+ リクエストヘッダにX-Requested-With項目があること + その値がxmlhttprequest(ケースインセンシティブ)であること 以下のような近代的なJavaScriptフレームワークは上記の項目をサポートしています. + Prototype.js + jQuery + ExtJs 属性
サンプル@Page("/ajaxJQuery")
public class AjaxJQueryPage {
@Ajax
@POST
public Navigation execute(WebContext context) {
String hoge = context.getRequest().getAttribute("hoge");
return Json.convert(hoge + " is jQuery.");
}
}@AmfFlexまたはAIRからAMFを使った高速バイナリ通信で呼ぶアクションメソッドを指定するアノテーションです. @Amfを使うと、@Pageの値がFlexで言うところのdestination、@Amfの値が呼び出しFunction名になります. Flexの呼び出しの詳細はRemoteObjectを参照してください. 属性
サンプルFlex側の簡単な呼び出しは以下のようになります.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" height="600" width="800">
<mx:Script>
<![CDATA[
private var ro:RemoteObject;
public function callAmf():void{
if(ro == null){
ro = new RemoteObject("amfsimple1");
var endPoint:String = URLUtil.getFullURL(Application.application.url, "t2.amf");
var channel:Channel = URLUtil.isHttpsURL(endPoint) ?
new SecureAMFChannel(null,endPoint) : new AMFChannel(null, endPoint);
var channelSet:ChannelSet = new ChannelSet();
channelSet.addChannel(channel);
ro.channelSet = channelSet;
}
var token:AsyncToken = ro.execute(data);
token.addResponder(new AsyncResponder(
function(e:ResultEvent, o:Object=null):void{
Alert.show("success");
},
function(e:FaultEvent, o:Object=null):void{
Alert.show("fail:" + e.message);
}
));
}
]]>
</mx:Script>
<mx:Button label="Call" width="200" buttonMode="true" useHandCursor="true" click="callAmf()" />
</mx:Application>
@Page("/amfsimple1")
public class AjaxJQueryPage {
@Amf
@Default
public Navigation execute(WebContext context) {
......
}
}引数アノテーション引数アノテーションは、T2から引数にコンポーネントをインジェクトしてもらうためのサポート用のアノテーションです. T2では、主に型で引数インジェクトしてもらうのが主流のスタイルですが、状況によっては明示的にユーザが特定の型・特定の値を 指定する必要があります.このような場合に引数アノテーションを使います. @Form@Formは送信されてきたフォームの内容をPOJOに変換するための引数アノテーションです. POJOへの型変換はT2が行います. 属性
サンプル @POST
@ActionParam
public Navigation addWithForm(@Form AddForm dto, ErrorInfo errorInfo) {
......
}参考デフォルトの挙動では、リゾルバクラスで変換した際に発生したエラーはErrorInfoにストアされます. 引数にErrorInfoも同時にインジェクトするようにしておけば、T2フレームワークが変換した際にエラーが発生したかどうかを知ることが出来ます. ベストプラクティスの@Formを使って変換する場合には、ErrorInfoも引数に記載するを参照してください. @RequestHeader@RequestHeaderはリクエストヘッダを取得する引数アノテーションです.
属性
制約@RequestHeaderは以下の型をサポートしています.
サンプル@Page("/requestheader")
public class RequestHeaderPage {
//リクエストヘッダ全てを取得する
@POST
@ActionParam
public Navigation execute1(@RequestHeader Map<String, String> map, WebContext context) {
......
}
//リクエストヘッダからcontent-typeのみ取得する
@POST
@ActionParam
public Navigation execute2(@RequestHeader(key = "content-type")
String header, WebContext context) {
......
}
}@RequestParam@RequestParamはリクエストパラメータを取得する引数アノテーションです. リクエストパラメータの特定のキーの値を取得できます. 属性
制約@RequestParamは以下の型をサポートしています.
empty属性がfalseの場合、以下の例外が発生します.ErrorHandlerなどで適切に処理してください. サンプル @POST
@ActionParam
public Navigation message(@RequestParam("left") String left,
@RequestParam("right") String right, HttpServletRequest request) {
......
}@SessionAttr@SessionAttrはセッションのある特定のキーの内容を取得する引数アノテーションです.
属性
制約Session内から取得したオブジェクトのクラスと、引数で指定したクラスの間に型の互換性の必要があります.
null属性がfalseの場合、以下の例外が発生します.ErrorHandlerなどで適切に処理してください. サンプル @POST
@ActionParam
public Navigation message(@SessionAttr("hoge") String hoge,
@SessionAttr("no_such_attr") String nosuchAttr, WebContext context) {
......
}
@Index@IndexはForEach内のサブミットされたボタンの何番目かを取得するためのアノテーションです.
属性
制約
サンプルjsp
Pageクラス
@Var@Pageや@ActionPathに書かれたURLの断片を取得するためのアノテーションです. T2の評価式を使って解釈します. RESTライクな形式でアクセスされたときなどに活用できます. 属性
サンプルPageクラス
@UploadFileUploadされたファイルを取得するためのアノテーション. 通常はこのアノテーションを使わず、クラスFileUploadを使用すれば問題ありません. | |