sa-struts-extra


SAStruts Extra

SAStrutsはとてもシンプルなので追加でほしい機能が出てくるんじゃないでしょうか。個人的に必要になった機能を追加してみました。

動作環境

最新版は、下記のバージョンで動作を確認しています。

  • SAStruts 1.0.4-sp1

開発環境としては下記の組み合わせを想定しています。sa-struts-extra-project.zipを解凍してimportするだけで準備が整います。

  • eclipse 3.3以降
  • m2eclipse 0.9.5以降

機能と使い方

  • アクションメソッドの結果をAjaxレスポンスにする
  • バリデーションをインターセプタ化する

アクションメソッドの結果をAjaxレスポンスにする

アクションメソッドにAjaxアノテーションを付けると、戻り値をResponseUtil?で書き出します。

@Ajax
@Execute(validator = false)
public String hello() {
    return "やあ、ようこそ。" + helloForm.value;
}

これだけだと何の芸もないので、既存のバリデーション機構もそのまま使えるようにしてあります。通常、バリデーションに失敗した場合はエラーメッセージが適切なスコープにセットされページ遷移しますが、これがResponseUtil?で書き出されるようになります。このとき、エラーメッセージはStrutsの<html:errors/>と同様のフォーマットで整形します。

@Ajax
@Execute(input = Ajax.INPUT)
public String hello() 
    return "やあ、ようこそ。" + helloForm.value;
}

:

public class HelloForm {
    @Required
    public String value;
}

通常のアクションメソッドと同じようにExecuteアノテーションにinput属性を指定します。ページ遷移がないのでvalidator = trueとだけしたいところですが、validatorがtrueのときはinputが必須なのでAjax.INPUTというダミーの値を指定しています(この値には何の意味もないので他の値を指定してもよいです)。

ここでhelloForm.valueの値が空でやってくると

<font color="red"><ul><li>valueは必須です。</li></ul></font>

という文字列がAjaxのレスポンスとして返却されます。しかし常にこのフォーマットだと少々厄介なので別のフォーマットを指定することもできます。たとえば標準では一切の整形をしないフォーマットを用意しています。こんな感じで使います。

@Ajax(formatter = NullFormatter.class)
@Execute(input = Ajax.INPUT)
public String hello() {
  :

結果はこうなります。

valueは必須です。

タグによる整形がなくなりました。

デフォルトでは2つのフォーマッタを提供しています。

  • ErrorsFormatter?(formatter属性のデフォルト)
  • NullFormatter?

独自のフォーマッタを作成するときは、AjaxActionMessagesFormatter?インタフェースを実装して作ります。それをS2Containerに登録してAjaxアノテーションのformatter属性に指定するだけで使えるようになります。

ちなみに、ErrorsFormatter?では<html:errors header="false"/>のようなフォーマットのオプションを指定することもできます。左記と同様にするには、

@Ajax
@ErrorsFormatter.Part(header = false)
@Execute ...
:

のようにPartアノテーションを使って指定します。アノテーションが別のアノテーションを必要とするというまさにアノテーション地獄の始まりです。アノテーションの使用は最小限に控えましょう。

バリデーションをインターセプタ化する

ログイン済みかどうかなどの認証はインターセプタでやりたいものです。でもバリデーションの効いてるアクションだとバリデーションの方がはやく実行されてしまう。バリデーションよりも先にインターセプタが効いてくれればなー、なんていう場合にピッタリです。バリデーションをインターセプタ化して独自のインターセプタよりあとに実行されるようにしてしまいます。

例えばバリデーションより認証済みの確認を先に実行したい場合はcustomizer.diconに次のように書きます。

<component name="actionCustomizer"
    class="org.seasar.framework.container.customizer.CustomizerChain">
  :
  <initMethod name="addAspectCustomizer">
    <arg>"authenticationInterceptor"</arg>
  </initMethod>
  <initMethod name="addAspectCustomizer">
    <arg>"sse.validationInterceptor"</arg>
  </initMethod>
  :

sse.validationInterceptorがインターセプタ化したバリデーションです(sa-struts-extra.diconに含まれています)。認証インターセプタ(authenticationInterceptor)をバリデーションインターセプタより上位に記述して先に実行されるようにします。


セットアップ

以下の順序でセットアップします。sa-struts-extra-project.zipに含まれているsa-struts-extra-examplesも参考にしてください。

  1. sa-struts-extraをdependencyに追加する
  2. sa-struts-extra.diconをapp.diconでインクルードする
  3. struts-config.xmlのリクエストプロセッサを書き換える
  4. customizer.diconにインターセプターを追加する

sa-struts-extraをdependencyに追加する

sa-struts-extraをpom.xmlのdependencyに追加します。

<dependencies>
  :
  <dependency>
    <groupId>jp.gr.java_conf.xazen</groupId>
    <artifactId>sa-struts-extra</artifactId>
    <version>0.0.1</version>
  <dependency>
  :
</dependencies>

sa-struts-extra.diconをapp.diconでインクルードする

sa-struts-extra.diconをapp.diconでインクルードします。このdiconはsa-struts-extra-*.jarに含まれています。

<components>
  :
  <include path="sa-struts-extra.dicon"/>
  :

struts-config.xmlのリクエストプロセッサを書き換える

controllerタグのprocessorClass属性を書き換えます。

:
<controller
    maxFileSize="1024K"
    bufferSize="1024"
    processorClass="jp.gr.java_conf.xazen.sastruts.S2RequestProcessorExtra"
    multipartClass="org.seasar.struts.upload.S2MultipartRequestHandler"/>
:

customizer.diconにインターセプタを追加する

Actionのカスタマイザにインターセプタを追加します。この追加するインターセプタの順序は重要です。かならず下記の順序にしてください。ただしインターセプタ間の前後関係が重要なだけなので、インターセプタの間に他のインターセプタを追加することはできます。

<component name="actionCustomizer"
    class="org.seasar.framework.container.customizer.CustomizerChain">
  <initMethod name="addAspectCustomizer">
    <arg>"aop.traceInterceptor"</arg>
  </initMethod>
  <!-- これを追加 -->
  <initMethod name="addAspectCustomizer">
    <arg>"sse.ajaxInterceptor"</arg>
  </initMethod>
  <initMethod name="addAspectCustomizer">
    <arg>"actionMessagesThrowsInterceptor"</arg>
  </initMethod>
  <!-- これを追加 -->
  <initMethod name="addAspectCustomizer">
    <arg>"sse.ajaxActionMessagesThrowsInterceptor"</arg>
  </initMethod>
  <!-- これを追加 -->
  <initMethod name="addAspectCustomizer">
    <arg>"sse.validationInterceptor"</arg>
  </initMethod>
  :

ダウンロード

file0.1.1 [2010/05/04]

  • sa-struts-1.0.4-sp8に対応。
  • AjaxアノテーションのformatterにJSONFormatterを追加。エラーメッセージを{"errors":[{"message":"..."}, {...}]}のJSONで返却する。
  • AjaxアノテーションのデフォルトのformatterをJSONFormatterに変更。
  • Ajaxアノテーションの実行メソッドの戻り型を任意の型にできるAjaxActionCustomizer?を追加。CharSequence?にassignableFromでないオブジェクトが返却された場合はJSONにエンコードする。エンコードにはJSONICを使用。
  • ValidationInterceptor?の対象を実行メソッドに限定した。

file0.1.0 [2008/09/10]

  • Ajaxアノテーション
  • インターセプタ化されたバリデーション

最新の20件

2007-05-13 2007-08-04 2007-04-30 2010-05-04
  • sa-struts-extra
2010-03-16 2007-09-05 2007-08-28 2006-09-22 2006-02-22

  • counter: 3915
  • today: 1
  • yesterday: 0
  • online: 1