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");
}
}