Interceptor

default-interceptor-refのバグ

Struts2の設定で default-interceptor-ref を指定するといちいち個別の Action に interceptor-ref を書かないで済むので package で default-interceptor-ref を指定して package 内の Action ではすべて共通のinterceptorスタックを適用するような指定方法…

Interceptorパラメータ設定

Struts2でInterceptorのパラメータを設定する場合、 <interceptor-ref name="hoge"> <param name="fileUpload.maxallowsize">10000</param> </intrerceptor-ref> などと記述することができて便利であるが、hogeインターセプター・スタックに fileUpload インターセプターが無くてもエラーにならないので注意が必要だ。存在しないインターセプター名であれば警…

prepareインターセプターについて

Struts2のprepareインターセプターを利用するとメソッド実行前に処理を行わせることができるようになる。 実行するメソッドによって前処理で行う内容を変更したい場合は、staticParamsでパラメータを注入してもらい、その値で振り分けるようなことを考えてい…

DefaultWorkflowInterceptorのvalidation

DefaultWorkflowInterceptorは次の事を行う。 Validatable が実装されているアクションに対して validate() の呼び出し ValidationAware が実装されているアクションに対して、 hasErrors() によりエラーをチェックしエラーならActionを実行せずに戻りとして…

@BeforeResultによるAction返却値の変更

次のようにする事で、Actionの戻り値を別の値に変更することが出来る。 @BeforeResult public void beforer1() { ActionInvocation invocation = ActionContext.getContext().getActionInvocation(); String ans = invocation.getResultCode(); System.out.p…

annotationWorkflowの位置

@Beforeでオブジェクトの初期化をおこうなおうとするとAnnotationWorkflowInterceptorの位置はActionの直前が最適ではあるが @BeforeResultで戻り値を変更しようとする場合、exception や workflow の後だと、これらの"input"などの返却値いじることは出来な…

継承されたアクションクラスでの@Before Annotation

継承されたActionクラスで@BeforeなどのAnnotationがどのような振る舞いになるのか試してみたUserActionを継承したUserAction2を作ってUserActionとしてbean登録する package tutorial; import jp.co.hershe.struts2.util.Struts2Action; import org.springf…

annotationWorkflowの使い方

annotationWorkflowを有効にして、annotationを使うと次のタイミングでメソッドが実行できる。 annotation 実行タイミング 使えそうなシーン @Before アクションが実行される直前 投げられたパラメータによって初期化されるオブジェクトの生成とかに @Before…

workflowとannotationWorkflowについて

annotationWorkflowはannotationに従い、actionメソッドの実行前後に特定のメソッドを実行できるようにするもの。 workflow は validatableとvalidationAwareを処理するものとなっている。 上の通り annotationWorkflow は workflow とは名前は似ているが、…

paramのorderedオプション

ParametersInterceptor には ordered というオプションがある。通常パラメータはアルファベット順にプロパティとして設定される事になっていて、 a b.a b.b cのような順序でセットされるordered が指定されていると、"."の少ないほうから先に呼び出されるよ…

ネストしたパラメータ

フィールド名に "." が含まれると、ネストしたパラメータと解釈される。 例えば、 JSP中で <s:textfield name="nest.a" label="nest" /> というフィールドがあったとすると、ValueStack を次のように実行した結果が初期値として設定される getNest().getA() また、ParametersInterceptorにより投げられ</s:textfield>…

CookieInterceptorについて2

以前CookieInterceptorについて調べた時(CookieInterceptorについて - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit でフルスタックJAVAフレームワーク)には、これはSetする場合に結局ActionがHttpCookieとかで汚染されてしまうので、あまり…

checkboxの扱い

WebのformでCheckboxのUIを使う場合問題になるのが、Checkboxがcheckされていない場合にパラメータ自体が投げられず、実装によってはアプリ上で保持している値がクリアされないというものがある。 hiddenなどを使ってCheckboxが投げれら無かった場合の処理を…

ScopeInterceptorでSpringのbeanをsessionに保持

ApplicationContextの取得が出来るということは、そこからSpringのbeanを取得してあげれば、Spring管理下のBeanをScopeInterceptorで保持できると考えた。ScopeInterceptorで保持することの利点は、オブジェクト毎に簡単に破棄が出来る事。Springのsessionの…

CookieInterceptorについて

CookieInterceptorは投げられたCookieをプロパティにセットしてくれる。 しかし、特定のCookieだけを扱う場合以外はあまり扱いやすくないように思う。 例えば、全てのCookieを受け付ける "*" 指定をすると、セッショントラッキング用のJSESSIONIDというCooki…

Token Session Store Interceptorの使い方

使い方と言っても、TokenInterceptorと殆ど変わらない。 で、何が違うのかというと、通常トランザクションTokenでTokenが違う場合エラーメッセージや他の画面を表示する事になるが、これだと誤って2重ポストをした消費者にはエラー画面が表示され、完了画面…

TokenInterceptorの使い方

色々便利なInterceptorが標準装備のStruts2だが、WEBで一般的な問題の2重ポストについて、トランザクションTokenによる防止機構が用意されている。Tokenの仕組みは簡単に言うと、FORMにHIDDENで仕込んだTokenとセッションの保持している値との比較を行い、…

ScopeInterceptorのLock

コード見るとロックを掛けている様に見えるが、思ったとおりの動作にならない。 現在理由を調査中。

ScopeInterceptorの使い方

ScopeInterceptorを使用するとsessionやapplicationスコープでBeanのプロパティを簡単に管理できるようになる。 例えば、更新前に確認画面を表示した回数をカウントし、更新を実行したらカウントを破棄するような動作をさせる場合次のように実装できる。最初…

Localeによるリソース選択Interceptorの問題解消

何度かModelDrivenにしないと意図通りに動作しないとか、ModelになくActionに有るプロパティがsetされないと書いていたが、原因が判明した。 悪さをしていたのは Localeによるdispatch先の選択2 - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit…

Action側のパラメータがセットされない

2008/01/23 ここにあげた問題は勘違いによるものでした、現在は解決されています ParametersInterceptorやScopeInterceptorは ValueStack でsetされると書かれている、これは例えばModelDrivenでModel側にプロパティSetterがない場合、次に積まれているアク…

ScopeInterceptorについて

ScopeInterceptorを使うとsessionスコープやapplicationスコープのプロパティを簡単に使うことができるようだ。次のように struts.xml に記述すると <action name="scopetest" class="ScopeTestAction" method="doCountup"> <interceptor-ref name="transact"> <param name="scope.session">counter</param> </intercetor-ref> <result>/sample.jsp</result> </action> アクシ…

setXXXされたくないパラメータ2

setXXXされたくないパラメータは名前付けを工夫すれば回避できる( 投げられたパラメータを setXXX されたくない場合 - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit でフルスタックJAVAフレームワーク )が、他にも方法があった。その方法は Pa…

Uploadエラーメッセージの場所

FileUploadInterceptorで出力されるエラーメッセージはグローバルリソースに設定しておかなければいけないのだが、ソースを読むとリソース探索の起点としてInterceptorのクラスを渡しているけれど、本来はアクションのクラスで、どうもこの制限はバグなので…

FileUploadの為のInterceptor設定

Uploadに対応するためには現在のフレームワークのJarに次のJarを追加する必要がある。 commons-fileupload-1.2.jar commons-io.jarまた、FileUploadInterceptorをInterceptorスタックに追加する必要があるが、exceptionを捕捉するためと、プロパティへの設定…

Methodフィルタを行うInterceptor

ActionのMethod名により適用を制御できる標準のInterceptorは次のとおりであるが TokenInterceptor TokenSessionStoreInterceptor DefaultWorkflowInterceptor ValidationInterceptor ExecuteAndWaitInterceptor ParametersInterceptor PrepareInterceptor …

Interceptorのパラメータをオーバーライドする

Interceptorのパラメータを変えたい場合は Interceptor のインスタンスを別に名前を付けて作成する必要があると思っていたが、アクション定義中で変えることができるようだ。こうやって <interceptor name="role_user" class="jp.co.hershe.struts2.acegi.AuthzInterceptor"> <param name="allowedRoles">ROLE_USER</param> </interceptor> <interceptor-stack name="default_user"> </interceptor-stack>

フレームワークの標準インターセプター呼び出し順序

次の順での呼び出しとしている。 <interceptor-stack name="transact" > <interceptor-ref name="chain"/> <interceptor-ref name="alias"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="i18n"/> <interceptor-ref name="locale" /> <interceptor-ref name="exception"/> </interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-stack>

staticParamsインターセプターの使い方

staticParamsインターセプターを使用すると、struts.xmlからアクションにパラメータを渡すことが出来る次のようにアクションに staticParamsを指定し、param を指定すると <action name="user_edit" class="UserAction"> <interceptor-ref name="staticParams"/> <param name="preread">true</param> </action> アクションの setPrereadメソッドが "true"引数で呼び出される public class…

Localeによるdispatch先の選択2

この記事のコードには問題があります。正しくは Localeによるリソース選択Interceptorの問題解消 - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit でフルスタックJAVAフレームワークを参照してください。 Localeの設定によって選択可能にはなっ…