My favorites | Sign in
t-2
Project Home Downloads Wiki Issues Source
READ-ONLY: This project has been archived. For more information see this post.
Search
for
Annotation  

en , ja
Updated Mar 24, 2011 by yone...@gmail.com

アノテーション

アノテーションの指定の仕方

T2の機能はアノテーションベースで成り立っています. アノテーションとは、Javaの標準機能のひとつでクラスやメソッドにつける注釈のようなものです.
T2はこのアノテーションを読み取って、実行時値を設定したり、あるメソッドを呼び出すか・呼び出さないかを決定したりします. T2が使うアノテーションには大きく分けて3つあり、クラスにつけるクラスアノテーション、メソッドにつけるメソッドアノテーション、 メソッドの引数につける引数アノテーションです.クラスアノテーションはクラス全体で有効なもので、メソッドアノテーションは そのメソッドだけに影響し、引数アノテーションはメソッドに渡されるパラメータだけに影響するアノテーションです.
従って、このアノテーションをソースコードに書いておくことで、
このクラスはPageクラスなので、/hogeというURLの時に呼び出してほしい
ということや、
このメソッドは、リクエストパラメータに"foo"という文字列があった時に呼んでほしい
というような事を、T2に伝えることができます。

クラスアノテーション

クラスアノテーションは主にPageクラスとして認識させるためや、そのPageクラス全体で有効な設定を表す場合に使います.

@Page

@PageはこのクラスがT2で管理すべきPageクラスであることを示します.

属性

  • value
    • アクセスされたときのコンテキストルートからのURL.省略されると、Pageクラスと同じ名前でアクセスされる.ケースインセンシティブ.

@ForwardTo

@ForwardToはNavigationのForwardでクラスを引数にして遷移するための補助アノテーションです.

属性

  • value
    • 遷移先を指定します.

メソッドアノテーション

メソッドアノテーションはアクションメソッドにつけます. アクションメソッド以外につけてもT2では効果がありません.

@GET

HTTPのGETメソッドのみを許可するアノテーションです.

属性

属性は特にありません.

@POST

HTTPのPOSTメソッドのみを許可するアノテーションです.

属性

属性は特にありません.

@PUT

HTTPのPUTメソッドのみを許可するアノテーションです.

属性

属性は特にありません.

@DELETE

HTTPのDELETメソッドのみを許可するアノテーションです.

属性

属性は特にありません.

@HEAD

HTTPのHEADメソッドのみを許可するアノテーションです.

属性

属性は特にありません.

@OPTIONS

HTTPのOPTIONSメソッドのみを許可するアノテーションです.

属性

属性は特にありません.

@ActionPath

@ActionPathはURLによって呼び出されるアクションメソッドを指定するアノテーションです. このアノテーションをつけておけば、各URLごとに呼び出し先のメソッドを変えることが出来ます. また、このアノテーションは評価式を書くことが出来ます.評価式に関しては、こちらを参照してください. @ActionPathはAjaxリクエストを扱う@Ajaxと併用が出来ません.

属性

  • value
    • このアクションメソッドを呼んで欲しいURLを指定する.省略されると、メソッド名を使用する.

サンプル

@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と併用が出来ません.

属性

  • value
    • 主にボタン押下時のname属性を指定する.省略すると、メソッド名を使用する.

サンプル

@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

属性

  • value
    • 現在使用されていません.

サンプル

@Page("/ajaxJQuery")
public class AjaxJQueryPage {

	@Ajax
	@POST
	public Navigation execute(WebContext context) {
		String hoge = context.getRequest().getAttribute("hoge");
		return Json.convert(hoge + " is jQuery.");
	}

}

@Amf

FlexまたはAIRからAMFを使った高速バイナリ通信で呼ぶアクションメソッドを指定するアノテーションです. @Amfを使うと、@Pageの値がFlexで言うところのdestination、@Amfの値が呼び出しFunction名になります. Flexの呼び出しの詳細はRemoteObjectを参照してください.

属性

  • value
    • Flexからの呼び出し名を指定します.

サンプル

Flex側の簡単な呼び出しは以下のようになります.

  • mxmlの例
  • <?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クラスの例
  • @Page("/amfsimple1")
    public class AjaxJQueryPage {
    
    	@Amf
    	@Default
    	public Navigation execute(WebContext context) {
    	......
    	}
    
    }

引数アノテーション

引数アノテーションは、T2から引数にコンポーネントをインジェクトしてもらうためのサポート用のアノテーションです. T2では、主に型で引数インジェクトしてもらうのが主流のスタイルですが、状況によっては明示的にユーザが特定の型・特定の値を 指定する必要があります.このような場合に引数アノテーションを使います.

@Form

@Formは送信されてきたフォームの内容をPOJOに変換するための引数アノテーションです. POJOへの型変換はT2が行います.

属性

  • resolverClass
    • FormをPOJOへ変換するためのリゾルバクラスを指定する.デフォルトは、org.t2framework.t2.spi.impl.FormResolverImpl

サンプル

	@POST
	@ActionParam
	public Navigation addWithForm(@Form AddForm dto, ErrorInfo errorInfo) {
		......
	}

参考

デフォルトの挙動では、リゾルバクラスで変換した際に発生したエラーはErrorInfoにストアされます. 引数にErrorInfoも同時にインジェクトするようにしておけば、T2フレームワークが変換した際にエラーが発生したかどうかを知ることが出来ます.
ベストプラクティスの@Formを使って変換する場合には、ErrorInfoも引数に記載するを参照してください.

@RequestHeader

@RequestHeaderはリクエストヘッダを取得する引数アノテーションです.

属性

  • key
    • リクエストヘッダのキーを指定します.指定しない場合、リクエストヘッダを全て取得して返します(以下、制約参照).

制約

@RequestHeaderは以下の型をサポートしています.
  • String
    • ヘッダのある特定のキー項目に該当するヘッダ情報
  • Stringの配列
    • ヘッダのある特定のキー項目に該当する複数のヘッダ情報
  • Map
    • ヘッダ情報全て

サンプル

@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はリクエストパラメータを取得する引数アノテーションです. リクエストパラメータの特定のキーの値を取得できます.

属性

  • key
    • リクエストパラメータのキーを指定します.必須項目です.
  • empty
    • 空文字がインジェクトされるのを許可するかを指定します.デフォルトではtrueです.falseの場合、例外が発生します(後述).

制約

@RequestParamは以下の型をサポートしています.
  • String
    • パラメータのある特定のキー項目に該当するヘッダ情報
  • Stringの配列
    • パラメータのある特定のキー項目に該当する複数のヘッダ情報
empty属性がfalseの場合、以下の例外が発生します.ErrorHandlerなどで適切に処理してください.
  • RequestParameterNotFoundRuntimeException
  • InvalidRequestParameterTypeRuntimeException

サンプル

	@POST
	@ActionParam
	public Navigation message(@RequestParam("left") String left, 
		@RequestParam("right") String right, HttpServletRequest request) {
		......
	}

@SessionAttr

@SessionAttrはセッションのある特定のキーの内容を取得する引数アノテーションです.

属性

  • key
    • リクエストパラメータのキーを指定します.必須項目です.
  • nullable
    • nullがインジェクトされるのを許可するかを指定します.デフォルトではtrueです.falseの場合、例外が発生します(後述).

制約

Session内から取得したオブジェクトのクラスと、引数で指定したクラスの間に型の互換性の必要があります.

null属性がfalseの場合、以下の例外が発生します.ErrorHandlerなどで適切に処理してください.
  • SessionAttributeNotFoundRuntimeException
  • InvalidSessionAttributeTypeRuntimeException

サンプル

	@POST
	@ActionParam
	public Navigation message(@SessionAttr("hoge") String hoge, 
		@SessionAttr("no_such_attr") String nosuchAttr, WebContext context) {
		......
	}

@Index

@IndexはForEach内のサブミットされたボタンの何番目かを取得するためのアノテーションです.

属性

  • value
    • 評価式のキー名です.デフォルトではindexで、ほとんどのケースで変更する必要はありません.

制約

  • @Indexはリクエストパラメータのキーから解析するため@ActionParamと併用する必要があります.
  • インデックスはhoge[0]のような形式である必要があります(下記jspを参考にしてください).

サンプル

jsp
	<c:forEach var="e" items="${hogeList}" varStatus="s">
		<input type="submit" name="hoge[${s.index}]" value="${e}"/>
		<br />
	</c:forEach>
Pageクラス
	@POST
	@ActionParam("hoge[{index}]")
	public Navigation hoge(@Index int id) {
		......
	}

@Var

@Pageや@ActionPathに書かれたURLの断片を取得するためのアノテーションです. T2の評価式を使って解釈します.
RESTライクな形式でアクセスされたときなどに活用できます.

属性

  • value
    • URLのキーを指定します.必須項目です.
  • nullable
    • nullがインジェクトされるのを許可するかを指定します.デフォルトではtrueです.falseの場合、例外が発生します.

サンプル

Pageクラス
@Page("/var/{aaa}/{bbb}")
public class VarPage {

	@Default
	public Navigation index(
		@Var("aaa") String str, 
		@Var("bbb") String str2) {
		......
	}

}

@Upload

FileUploadされたファイルを取得するためのアノテーション.
通常はこのアノテーションを使わず、クラスFileUploadを使用すれば問題ありません.

TOPに戻る

Powered by Google Project Hosting