Apache Clickには2.2.0からページインターセプターという機能が追加されており、ページの作成前後、レスポンス前、廃棄前後に処理を差し込むことができます。click.xmlでこんな感じで設定します。
<page-interceptor classname="com.mycorp.PageSecurityInterceptor" scope="application"> <property name="notAuthenticatedPath" value="/not-authenticated.htm"/> <property name="notAuthorizedPath" value="/not-authorized.htm"/> </page-interceptor>
見ての通り、インターセプターに設定するパラメータや、ライフサイクルなども指定することができます。
S2Clickではclick.xmlを使わずにs2click.diconですべての設定を行っているのですが、思い切ってページインターセプターはS2Containerで管理するようにしてみました。上記の例と同じ設定をするには以下のような感じになります。
<!-- ページインターセプターをコンポーネントとして定義 --> <component name="pageSecurityInterceptor" class="com.mycorp.PageSecurityInterceptor"> <property name="notAuthenticatedPath">"/not-authenticated.htm"</property> <property name="notAuthorizedPath">"/not-authorized.htm"</property> </component> <component class="org.seasar.s2click.s2ClickConfig"> ... <!-- ページインターセプターのコンポーネント名を指定 --> <initMethod name="addPageInterecptor"> <arg>"pageSecurityInterceptor"</arg> </initMethod> </component>
ライフサイクルやプロパティの設定はS2Container側に任せてしまっています。今まではLogServiceやTemplateService、ResourceServiceもClassオブジェクトとプロパティ設定用のMapをs2click.diconで設定するようにしていたのですが、これにあわせてS2ClickConfigに直接インスタンスをDIする形にしています。
たとえばいままでこんな感じだったのが…
<component class="org.seasar.s2click.s2ClickConfig"> ... <property name="logService"> @sample.service.SampleLogService@class </property> <!-- プロパティを指定する場合 --> <initMethod name="addTemplateServiceProperty"> <arg>"output"</arg> <arg>"/var/log/sample.log"</arg> </initMethod> </component>
こんな感じになります。
<component class="org.seasar.s2click.s2ClickConfig"> ... <property name="logService"> <component class="sample.service.SampleLogService"> <property name="output">"/var/log/sample.log"</property> </component> </property> </component>
というわけで、S2Clickの次のバージョン(1.0.4)ではサービスをカスタマイズする場合の設定方法が変更になります。