Spring2.0.4 AbstractController

AbstractController Javadoc

Controllerを便利にしたのがAbstractController

handleRequestの変わりに、handleRequestInternalメソッドが呼ばれるので、このメソッドを実装する。

設定できる項目

supportedMethods サポートするHTTPメソッドをカンマ区切りで指定できる。デフォルトは「GET,POST」。PUTも設定可能
requireSession このコントローラのリクエストを処理するためにセッションが必要かどうかを設定。デフォルトはFalse。セッションが見つからない場合、ServletExceptionが投げられる
cacheSeconds レスポンスのキャッシュヘッダの秒数を設定。デフォルトは-1でキャッシュが設定されない。
synchronizeOnSession 処理をシンクロナイズドさせるかを設定する。デフォルトはFalse
useExpiresHeader HTTP1.0のExpireヘッダを利用するかどうか設定。デフォルトはTrue。
useCacheHeader HTTP1.1のExpireヘッダを利用するかどうか設定。デフォルトはTrue。

上記設定はBean定義ファイルに記述する。

 <bean id="testAbstractController" class="com.daipresents.spring204.controller.TestAbstractController">
<property name="cacheSeconds" value="120"/>
<property name="synchronizeOnSession" value="true" />
</bean>

実装例

AbstractControllerを継承した「TestAbstractController」はこんな感じ。

public class TestAbstractController extends AbstractController {

@Override
protected ModelAndView handleRequestInternal(
HttpServletRequest req,
HttpServletResponse res) throws Exception {

System.out.println("getCacheSeconds() = " + getCacheSeconds());
System.out.println("isSynchronizeOnSession() = " + isSynchronizeOnSession());

return new ModelAndView("/index.jsp");
}

}

しかーし、System.outした設定値を見てみても反映されていない。何か別の方法があるのかもと思って調べてみると、ApplicationContextを経由しないとだめぽい。IDてもんがあるんだからそらそうか。

public class TestAbstractController extends AbstractController {

@Override
protected ModelAndView handleRequestInternal(
HttpServletRequest req,
HttpServletResponse res) throws Exception {

ApplicationContext context
= RequestContextUtils.getWebApplicationContext(req);
TestAbstractController controller =
(TestAbstractController)context.getBean("testAbstractController");

//これなら取れるよーん
System.out.println("getCacheSeconds() = " + controller.getCacheSeconds());
System.out.println("isSynchronizeOnSession() = " + controller.isSynchronizeOnSession());

return new ModelAndView("/index.jsp");
}
}