トップ 一覧 ping 検索 ヘルプ RSS ログイン

Struts2 設定項目 - リクエスト処理の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!Struts2 設定項目 - リクエスト処理
{{include_html banner_html, "!Struts"}}

!!Interceptor 設定
Interceptors は アクションメソッドの実行される前または後に実行されるコードを定義することができます。(フィルターパターン)Interceptorsはアプリケーション開発で、とても強力なツールとなります。これは様々な場面で利用できます、Interceptros、including、validation、property population、security、logging、profiling。

,名称,内容
,Validation,入力が妥当か検査
,Property Population,入力を、オブジェクトのプロパティとして転送/変換する
,Logging,アクションの詳細についてログをとる
,Profiling,パフォーマンスボトルネックを見つけるために、アクションのスループットを計測する

Interceptorsは、生成されたInterceptor"Stack"と共に、連鎖使用することができます。もし、あるアクションがクライアントの信用証明のチェック、アクションのログ、アクションの処理時間を必要とする場合、これらのルーチンな処理は、同じInterceptor Stackの部分として構築できます。

Interceptorsは、Javaのクラスとして実装され、それぞれのInterceptorは、一意なクラス名を持ちます。Interceptorsへの参照を簡単にするため、それぞれのクラスはフレームワークに簡略名を登録することができます。

'''Interceptorsの登録'''
 <interceptors>
   <interceptor name="security" class="com.company.security.SecurityInterceptor"/>
   <interceptor-stack name="secureStack">
     <interceptor-ref name="security"/>
     <interceptor-ref name="defaultStack"/>
   </interceptor-stack>
 </interceptors>
個々のInterseptorや、Interceptor StackはInterceptor Stackで適宜されたどのような順序"混合されていたり、調和が取れていたり"もとることができる。フレームワークはStackにあるInterceptorを定義された順序で呼び出す。

ほとんどのアプリケーションはデフォルトのInterceptor Stackを定義する。
 <default-interceptor-ref name="secureStack"/>
しかしどのアクションもそれぞれ独自のローカルstackを持つことができる。
'''ローカル Interceptor Stack'''
 <action name="VelocityCounter" class="org.apache.struts2.example.counter.SimpleCounter">
    <result name="success">...</result>
    <interceptor-ref name="defaultComponentStack"/>
 </action>
デフォルトの設定(struts-default.xml)はほとんどのアプリケーションで動作する、デフォルトInterceptorをセットアップする。
!!Action設定
アクションマッピングは、フレームワークの基本"動作単位"。本質的に、アクションはある識別子を処理クラスにマップする。リクエストとアクションの名前がマッチすると、フレームワークはアクションマッピングをどのようにリクエストを処理するか決定するのに使用する。

::Action Mappings
アクションマッピングは、result types、exception handlers、interceptor stackを指定することができる。しかし、name 属性だけが必須である。その他の属性はpackage スコープで提供することもできる。

'''Logon Action'''
 <action name="Logon" class="tutorial.Logon">
   <result type="redirect-action">Menu</result>
   <result name="input">/tutorial/Logon.jsp</result>
 </action>
::Action Names
Webアプリケーションにて、name属性は、ブラウザ(もしくは他のHTTPクライアント)のロケーションリクエストの一部にマッチする。フレームワークはホストとアプリケーション名、拡張子を取り除いた真ん中部分にマッチさせる。なので、http://www.planetstruts.org/struts2-mailreader/Welcome.do というリクエストは、Welcome アクションにマップされる。

アプリケーションの中では、アクションへのリンクは、普通 Struts タグ によって生成される。このタグはアクションを名前で指定することができ、フレームワークはデフォルトの拡張子や必要なその他の物をその名前から生成する。
'''Hello Form'''
 <s:form action="Hello">
     <s:textfield label="Please enter your name" name="name"/>
    <s:submit/>
 </s:form>

::Action Methods
ハンドルクラスの、デフォルトエントリーメソッドがActionインターフェースで定義されている。
'''Action インターフェース'''
 public interface Action {
     public String execute() throws Exception;
 }
※ Actionインターフェースの実装は、オプションである。もし、Actionを実装しない場合、フレームワークはリフレクションを利用して、execute メソッドを探す。

時々、開発者は1つのActionに1つ以上のエントリポイントを設けることを好む。例えば、データアクセスアクションンの場合、開発者はおそらくエントリポイントを、create、retrieve、update、deleteに分けるだろう。異なったエントリポイントを method 属性にて指定できる。
 <action name="delete" class="example.CrudAction" method="delete">
もし、executeメソッドや他のメソッドが設定されていない場合、フレームワークは例外を送出する。

::Wildcard Method
多くの場合、アクションマッピングのセットは一般的なパターンで共用される。例えば、すべての編集アクション(おそらく"edit"で始まる)は、アクションクラスの"edit"メソッドを呼び出す。削除アクションも変わりにdeleteが利用されること以外、同様に違いない。

このようなパターンのそれぞれのアクションクラスでマッピングコードを分けて書クコと無しに、ワイルドカードマッピングとして、一箇所に書くことができる。
 <action name="*Crud" class="example.Crud" method="{1}">
これは、"editCrud"への参照はCrudアクションクラスのインスタンスのeditメソッドを呼び出す。同様に、"deleteCrud"への参照は、変わりにdeleteメソッドを呼び出す。

他の一般的なアプローチは、メソッド名にプレフィックスを付けたり、感嘆符やアンダースコアやその他の特別な文字でメソッド名を分割したりする。
* "action=Crud_input"
* "action=Crud_delete"
ポストフィックスを使用するには、ワイルドカードを移動して、アンダースコアを付け加えればよい。
 <action name="Crud_*" class="example.Crud" method="{1}">
フレームワークの視点からは、ワイルドカードマッピングは、他の属性と同様に新しい静的な"仮想"マッピングを生成する。結果として、拡張された妥当なワイルドカード名、型変換、ローカライズされたファイルをあたかもAction名のように使用することができる。

*  Crud_input-validation.xml
* Crud_delete-conversion.xml

※"!"をポストフィックスとして利用することは、WebWork2では可能だが、異なる実装が施された。古い実装を利用するには、struts.properties file にて、struts.enable.DynamicMethodInvocation=TRUE と設定する。その代わりにワイルドカードを利用するのをこのむのなら、struts.enable.DynamicMethodInvocation=FALSE と設定する。
::ActionSupport Default
アクションマッピングのclass属性がブランクのままである場合、com.opensymphony.xwork.ActionSupport が既定値として利用される。
 <action name="Hello">
    // ...
 </action>
※ActionSupport クラスはexecuteおよびinputメソッドを持ち、"success"を返す。

::Post-Back Default
アクションにリンクを貼ることは、ページにリンクを貼るよりよい方法です。アクションにリンクを貼ることはサーバーがページを生成することをカプセル化し、アクションクラスがページの生成の前に実行されることを保障します。

その他の一般的なワークフローでは、まずページを異なったメソッド(input のような)で生成し、その後、デフォルトのexecuteメソッドにサブミットを返させます。

これらの2つの戦略では、同時に指定されないアクションから"post-back"をされる機会が生じます。単純なサブミットをアクションに返すformは以下のように作成します。
 <s:form>
     <s:textfield label="Please enter your name" name="name"/>
     <s:submit/>
 </s:form>
::Action Default
普通、あるアクションがリクエストされ、フレームワークがリクエストをアクション名にマッピングできない場合、結果は通常の"404 - ページが見つかりません"エラーとなる。しかし、多くを包括したあるアクションにリクエストの不一致を処理させることを好む場合、異なるアクションを指定することができる。もしアクションがマッチしない場合、デフォルトアクションがその代わりに使用される。
 <package name="Hello" extends="action-default">
 
 <default-action-ref name="UnderConstruction">
 
 <action name="UnderConstruction">
   <result>/UnderConstruction.jsp</result>
 </action>
デフォルトアクションとするために、特別に何かする必要はない。それぞれのパッケージに独自のデフォルトアクションを持つことができる。ただし、namespace毎にひとつだけ。
'''Namespaceにひとつ'''
デフォルトアクション機能は、namespace毎にひとつだけセットアップされる。もし、複数のパッケージをひとつのデフォルトアクションと同じnamespaceで宣言した場合、どのアクションがデフォルトとして機能するかは保障されない。
::Wildcard Default
ワイルドカード使用することは、デフォルトアクションのことなった方法である。ワイルドカードアクションは、設定の最後で、マッチしない参照をキャッチすることができる。
 <action name="*" >
   <result>/{1}.jsp</result>
 </action>
新たなアクションが必要な場合、スタブページを追加する。
!!Result 設定
Actionクラスのメソッドが完了したら、文字列を返す。文字列の値はresult要素を選択するのに利用されます。アクションマッピングはしばしば、異なった結果を表現する、結果セットを持つ。標準的な結果セットトークンはActionSupportbaseクラスに定義されている。

'''用意されている結果文字列'''
 String SUCCESS = "success";
 String NONE    = "none";
 String ERROR   = "error";
 String INPUT   = "input";
 String LOGIN   = "login";

もちろん、アプリケーションで、指定したケースにマッチする別の結果文字列を定義することもできる。

::Result 要素
result 要素は2つの仕事を行う。1つ目には、論理名を提供する。アクションは、"success"や"error"のような文字列を、そのほかの実装の詳細なしに戻すことができる。2つ目には、result要素は、Result Typeを提供する。ほとんどの結果は単純にサーバーページが、テンプレートをフォワードすが、Result Typeはさらに興味深い方法で利用することができる。
::Intelligent Details
Result Typeの規定値は、パッケージそれぞれの設定の部分セットとなることができる。もし、あるパッケージが他のパッケージを継承している場合、"子供"のパッケージは独自の規定resultをセットするか、親から継承することができる。
'''Result Type の規定値を設定'''
 <result-types>
  <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" 
   default="true"/>
 </result-types>
type属性が指定されていない場合、フレームワークは dispatcherを利用する。規定のResult Type、dispatcher、は他のWebリソースにフォワードする。
そのリソースがJSPの場合、コンテナはJSPエンジンを使用してページを生成する。

同様に、name属性が指定されていない場合、フレームワークは"success"を設定する。

これらのintelligent defaults、により、多くの Result Typeは単純になる。

'''規定値を指定しない Result 要素'''
 <result name="success" type="dispatcher">
     <param name="location">/ThankYou.jsp</param>
 </result>
'''規定値を利用したResult要素'''
 <result>
     <param name="location">/ThankYou.jsp</param>
 </result>
param タグはResultオブジェクトのプロパティを設定する。よく利用するプロパティはWebリソースへのパスを指定するlocationである。param属性は、他のintelligent defaultsである。

'''さらなる規定値を利用した Result 要素'''
 <result>/ThankYou.jsp</result>
resultをintelligent defaultsとその他のresultsを混ぜたものは、"クリティカルパス"により、用意に見分けられる。
'''混合Results'''
 <action name="Hello">
   <result>/hello/Result.jsp</result>
   <result name="error">/hello/Error.jsp</result>
   <result name="input">/hello/Input.jsp</result>
 </action>
::Global Result
しばしば、resultsはaction要素に入れ子にされる。しかし、いくつかのresultsは複数のアクションに適用される。セキュアなアプリケーションでは、クライアントはページへ認証なしにアクセスを試みるかもしれないが、多くのアクションは"logon"resultを返す必要があるであろう。

もし、アクションがresultsを共有する必要がある場合、それぞれのパッケージにglobal resultsを定義できる。フレームワークは最初にアクションタグに入れ子になった、local resultを探す。もし、localにマッチしない場合、global resultsがチェックされる。
'''global resultsの定義'''
 <global-results>
   <result name="error">/Error.jsp</result>
   <result name="invalid.token">/Error.jsp</result>
   <result name="login" type="redirect-action">Logon!input</result>
 </global-results>


----
{{include_html banner_html, "!Struts"}}