SAStrutsはとてもシンプルなので追加でほしい機能が出てくるんじゃないでしょうか。個人的に必要になった機能を追加してみました。
最新版は、下記のバージョンで動作を確認しています。
開発環境としては下記の組み合わせを想定しています。sa-struts-extra-project.zipを解凍してimportするだけで準備が整います。
アクションメソッドに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つのフォーマッタを提供しています。
独自のフォーマッタを作成するときは、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も参考にしてください。
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でインクルードします。このdiconはsa-struts-extra-*.jarに含まれています。
<components> : <include path="sa-struts-extra.dicon"/> :
controllerタグのprocessorClass属性を書き換えます。
: <controller maxFileSize="1024K" bufferSize="1024" processorClass="jp.gr.java_conf.xazen.sastruts.S2RequestProcessorExtra" multipartClass="org.seasar.struts.upload.S2MultipartRequestHandler"/> :
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> :
0.1.1 [2010/05/04]
0.1.0 [2008/09/10]