T2にリクエストヘッダを取る機能をつけました


T2は基本的にメソッドの引数に並べたものをインジェクトするようになっています。
今まではWebアプリケーション上での結構プリミティブなデータ、例えばHttpServletRequestなどを
インジェクトしていましたが、徐々に細かめに色々インジェクトできるようにしていこうと考えています。
出来るだけ、各メソッド内部でGETするようなコードを書かせず、一律インジェクトさせる方向性が大事だと思います。
この辺は各開発者を悩ませない仕組みが重要だと考えているわけです。


というわけで、今回はリクエストヘッダを取得する、@RequestHeaderです。
全体を取るときはMapでもらえて、一部の場合は@RequestHeader(key="content-type")のように
キー指定で取得します。


サンプルコードは以下のとおり。

@Page("requestheader")
public class RequestHeaderPage {

	private static Logger logger = Logger.getLogger(RequestHeaderPage.class);

	@Default
	public Navigation index() {
		return Forward.to("/jsp/requestHeader.jsp");
	}

	//全部欲しい場合は、@RequestHeaderしてMapを型にしておけばインジェクトします
	@POST
	@ActionParam
	public Navigation execute1(@RequestHeader Map<String, String> map,
			WebContext context) {
		StringBuilder builder = new StringBuilder();
		builder.append("<ul>");
		for (Map.Entry<String, String> entry : map.entrySet()) {
			final String key = entry.getKey();
			final String value = entry.getValue();
			logger.debug("key={}, value={}", key, value);
			builder.append("<li>");
			builder.append(key + ":" + value);
			builder.append("</li>");
		}
		builder.append("</ul>");
		context.getRequest().setAttribute("message", new String(builder));
		return index();
	}

	//一部だけ欲しい場合は、@RequestHeaderにkeyを指定します。String[]にしておけば複数も可能
	@POST
	@ActionParam
	public Navigation execute2(
			@RequestHeader(key = "content-type") String header,
			WebContext context) {
		StringBuilder builder = new StringBuilder();
		builder.append("<ul>");
		{
			logger.debug("header={}", header);
			builder.append("<li>");
			builder.append(header);
			builder.append("</li>");
		}
		builder.append("</ul>");
		context.getRequest().setAttribute("message", new String(builder));
		return index();
	}

}


また、今回からTomcatよりもお手軽サーブレットコンテナ、SDLoaderでのブートストラップコードも
入れました。SNAPSHOTリリースのときは、Tomcat/SDLoaderで確認しています。


t2-samplesのSNAPSHOTをリリースしました。
以下のURLからどうぞ。