Develop with pleasure!

福岡でCloudとかBlockchainとか。

ResultType

Struts2では、Viewテクノロジがデフォルトで色々と選択できる。Struts1.x系のstruts-config.xmlと言うと、 action-mappingに定義するActionからの遷移先の定義にresult-typeというのが設定できるようになった。
(ZeroConfigurationの場合はActionクラスに定義した@Resutlアノテーションで定義)

デフォルトで以下のようなresult-typeが定義されてる。

  • chain

    別Actionを呼び出す場合

  • dispatcher

    JSPを使用する場合

  • httpheader

    HTTPヘッダのみレスポンスとして返す場合

  • redirect

    リダイレクトのレスポンスを返す場合

  • redirectAction

    Actionにリダイレクトレスポンスを返す場合

  • stream

    Streamをレスポンスとして返す場合(ファイルのダウンロードみたいな)

  • velocity

    Velocityのテンプレートを実行して返す場合

    XSLT変換したレスポンスを返す場合

  • plainText

    プレーンテキストを返す場合

といった具合にデフォルトで様々なResultTypeが用意されている。便利。

今回は、諸事情によりVelocityをViewテクノロジとして採用。ただ、携帯システムなので、キャリア/世代変換にXSLT変換を必要とする。

基本的にResultTypeによるViewの変換処理もStruts2ではInterceptorとして定義されている。折角 Interceptorベースのアーキテクチャになっているので、View変換した後のデータをXSLT変換するInterceptorを作って変換しようかと試みるが、結局Velocity変換の際に既にHttpServletResponseに対し書き込みが行われており、単純にその後に Struts2のInterceptorとして処理を追加しても手遅れになってしまう…。
しょうがないので、書き込む前にSpringのAOPで処理を入れ込むかとも考えるが、無難にServletFilterで解決…。あぁだこうだ難しく考える前にFilterは偉大だった…。