2010年08月26日

ThreadLocalで

どうも、塩内藤です。

Webアプリ開発をしていて業務ロジック内とかでRequestとか参照したーーーい!!とかよくあると思いますよ?

少なくとも自分は結構あります。。。

そんな時に、この方法を先生に教えてもらいました。


今更な技術らしいのですが、自分は知りませんでした。。。。

めんどいのでクラスをそのままw

spring3.0のspringMVCで開発してます。

まぁあれです、リクエスト毎のHttpServletRequestとHttpServletResponseをコンテキストに設定後、コンテキストそのものをThreadLocalに登録するみたいな事です。

使い方はHandlerInterceptorAdapterとか継承したクラスのpreHandleメソッドでTestWebContext.init()を呼び出してコンテキストの初期化

あとは、好きなとこでTestWebContext.getContext()からあれやこれやします。

今回はセッション、リクエストへの属性保存と取得。
あとはBeanFactoryも入れてみました。

便利ですねぇ楽ですねぇ



package test.context;

import org.springframework.web.servlet.support.RequestContext;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* コンテキスト
* <p>
* ローカルスレッドにTestWebContextを保持し、<br/>
* リクスト毎のローカル変数としてHttpServletRequestを提供します.
* </p>
*
*
*/
public final class TestWebContext {

/** ThreadLocal. */
private static ThreadLocal<TestWebContext> threadLocal = new ThreadLocal<TestWebContext>();

/** HttpServletRequest. */
private HttpServletRequest request = null;

/** HttpServletResponse. */
private HttpServletResponse response = null;

/** RequestContext. */
private RequestContext requestContext = null;

/**
* コンストラクタ.
*/
private TestWebContext() {
}

/**
* HttpServletRequest getter.
*
* @return HttpServletRequest
*/
public HttpServletRequest getRequest() {
return request;
}

/**
* HttpServletRequest setter.
*
* @param request
* HttpServletRequest
*/
public void setRequest(HttpServletRequest request) {
this.request = request;
}

/**
* HttpServletResponse getter.
*
* @return HttpServletResponse
*/
public HttpServletResponse getResponse() {
return response;
}

/**
* HttpServletResponse setter.
*
* @param response
* HttpServletResponse
*/
public void setResponse(HttpServletResponse response) {
this.response = response;
}

/**
* RequestContext getter.
*
* @return RequestContext
*/
public RequestContext getRequestContext() {
return requestContext;
}

/**
* RequestContext setter.
*
* @param requestContext RequestContext
*/
public void setRequestContext(RequestContext requestContext) {
this.requestContext = requestContext;
}

/**
* リクエスト:値の取得.
*
* @param <T>
* T
* @param key
* String
* @return <T>
*/
@SuppressWarnings("unchecked")
public <T> T fromRequest(String key) {
return (T) this.request.getAttribute(key);
}

/**
* リクエスト:値の保存.
*
* @param key
* String
* @param obj
* Object
*/
public void toRequest(String key, Object obj) {
this.request.setAttribute(key, obj);
}

/**
* If session does exist,return true.
*
* @return boolean
*/
public boolean isSessionExist() {

return this.request.getSession(false) != null;

}

/**
* セッション:値の取得.
*
* @param <T>
* T
* @param key
* String
* @return <T>
*/
@SuppressWarnings("unchecked")
public <T> T fromSession(String key) {
return (T) this.request.getSession().getAttribute(key);
}

/**
* セッション:値の保存.
*
* @param key
* String
* @param obj
* Object
*/
public void toSession(String key, Object obj) {
this.request.getSession().setAttribute(key, obj);
}

/**
* セッション:値のクリア.
*
* @param key
* String
*/
public void clearSession(String key) {
this.request.getSession().removeAttribute(key);
}

/**
* Beanの取得
* <p>
* springにより管理されているBeanをid指定で取得します.
* </p>
*
* @param <T> T
* @param beanId
* コンテナに登録されているbeanId
* @return <T> 取得したBean
*/
@SuppressWarnings("unchecked")
public <T> T getBean(String beanId) {

return (T) this.requestContext.getWebApplicationContext().getBean(beanId);

}

/**
* Beanの取得.
* <p>
* springにより管理されているBeanをクラス指定で取得します.
* </p>
*
* @param <T>
* Class
* @param clazz
* Class<T> コンテナに登録されているbeanのクラス
* @return <T> 取得したBean
*/
public <T> T getBean(Class<T> clazz) {

return this.requestContext.getWebApplicationContext().getBean(clazz);

}

/**
* コンテキストを取得します.
*
* @return TestWebContext
*/
public static TestWebContext getContext() {

return threadLocal.get();

}

/**
* コンテキスト初期化処理
* <p>
* コンテキストをスレッドローカル変数として保持します.
* </p>
*
* @return TestWebContext
*/
public static TestWebContext init() {

TestWebContext testContext = new TestWebContext();

threadLocal.set(testContext);

return testContext;

}

/**
* コンテキストの破棄.
*/
public static void destroy() {

threadLocal.set(null);

}

}


posted by しお at 13:53| Comment(0) | TrackBack(0) | spring

あろえonly

どうも、塩内藤です。

最近あろえの画像をアップしてなかったので、今日はあろえ画像を、、、

下のはうちに来たばかりの時の画像、、、

aroe.jpg

こっちは、最近の画像
来た時と比べると、、、、全然違う、、、

100820_1538061.jpg

SBSH01231.JPG
posted by しお at 13:34| Comment(0) | TrackBack(0) | あろえとつくし