| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
編集の要約なし
'''Interceptorsの登録'''
<&lt;interceptors>&gt; <&lt;interceptor name="security" class="com.company.security.SecurityInterceptor"/>&gt; <&lt;interceptor-stack name="secureStack">&gt; <&lt;interceptor-ref name="security"/>&gt; <&lt;interceptor-ref name="defaultStack"/>&gt; <&lt;/interceptor-stack>&gt; <&lt;/interceptors>&gt;
個々のInterseptorや、Interceptor StackはInterceptor Stackで適宜されたどのような順序"混合されていたり、調和が取れていたり"もとることができる。フレームワークはStackにあるInterceptorを定義された順序で呼び出す。
ほとんどのアプリケーションはデフォルトのInterceptor Stackを定義する。
<&lt;default-interceptor-ref name="secureStack"/>&gt;
しかしどのアクションもそれぞれ独自のローカルstackを持つことができる。
'''ローカル Interceptor Stack'''
<&lt;action name="VelocityCounter" class="org.apache.struts2.example.counter.SimpleCounter">&gt; <&lt;result name="success">&gt;...<&lt;/result>&gt; <&lt;interceptor-ref name="defaultComponentStack"/>&gt; <&lt;/action>&gt;
デフォルトの設定(struts-default.xml)はほとんどのアプリケーションで動作する、デフォルトInterceptorをセットアップする。
===Action設定===
'''Logon Action'''
<&lt;action name="Logon" class="tutorial.Logon">&gt; <&lt;result type="redirect-action">&gt;Menu<&lt;/result>&gt; <&lt;result name="input">&gt;/tutorial/Logon.jsp<&lt;/result>&gt; <&lt;/action>&gt;
=====Action Names=====
Webアプリケーションにて、name属性は、ブラウザ(もしくは他のHTTPクライアント)のロケーションリクエストの一部にマッチする。フレームワークはホストとアプリケーション名、拡張子を取り除いた真ん中部分にマッチさせる。なので、http://www.planetstruts.org/struts2-mailreader/Welcome.do というリクエストは、Welcome アクションにマップされる。
アプリケーションの中では、アクションへのリンクは、普通 Struts タグ によって生成される。このタグはアクションを名前で指定することができ、フレームワークはデフォルトの拡張子や必要なその他の物をその名前から生成する。
'''Hello Form'''
<&lt;s:form action="Hello">&gt; <&lt;s:textfield label="Please enter your name" name="name"/>&gt; <&lt;s:submit/>&gt; <&lt;/s:form>&gt;
=====Action Methods=====
時々、開発者は1つのActionに1つ以上のエントリポイントを設けることを好む。例えば、データアクセスアクションンの場合、開発者はおそらくエントリポイントを、create、retrieve、update、deleteに分けるだろう。異なったエントリポイントを method 属性にて指定できる。
<&lt;action name="delete" class="example.CrudAction" method="delete">&gt;
もし、executeメソッドや他のメソッドが設定されていない場合、フレームワークは例外を送出する。
このようなパターンのそれぞれのアクションクラスでマッピングコードを分けて書クコと無しに、ワイルドカードマッピングとして、一箇所に書くことができる。
<&lt;action name="*Crud" class="example.Crud" method="{1}">&gt;
これは、"editCrud"への参照はCrudアクションクラスのインスタンスのeditメソッドを呼び出す。同様に、"deleteCrud"への参照は、変わりにdeleteメソッドを呼び出す。
* "action=Crud_delete"
ポストフィックスを使用するには、ワイルドカードを移動して、アンダースコアを付け加えればよい。
<&lt;action name="Crud_*" class="example.Crud" method="{1}">&gt;
フレームワークの視点からは、ワイルドカードマッピングは、他の属性と同様に新しい静的な"仮想"マッピングを生成する。結果として、拡張された妥当なワイルドカード名、型変換、ローカライズされたファイルをあたかもAction名のように使用することができる。
=====ActionSupport Default=====
アクションマッピングのclass属性がブランクのままである場合、com.opensymphony.xwork.ActionSupport が既定値として利用される。
<&lt;action name="Hello">&gt;
// ...
<&lt;/action>&gt;
※ActionSupport クラスはexecuteおよびinputメソッドを持ち、"success"を返す。
これらの2つの戦略では、同時に指定されないアクションから"post-back"をされる機会が生じます。単純なサブミットをアクションに返すformは以下のように作成します。
<&lt;s:form>&gt; <&lt;s:textfield label="Please enter your name" name="name"/>&gt; <&lt;s:submit/>&gt; <&lt;/s:form>&gt;
=====Action Default=====
普通、あるアクションがリクエストされ、フレームワークがリクエストをアクション名にマッピングできない場合、結果は通常の"404 - ページが見つかりません"エラーとなる。しかし、多くを包括したあるアクションにリクエストの不一致を処理させることを好む場合、異なるアクションを指定することができる。もしアクションがマッチしない場合、デフォルトアクションがその代わりに使用される。
<&lt;package name="Hello" extends="action-default">&gt;
<&lt;default-action-ref name="UnderConstruction">&gt;
<&lt;action name="UnderConstruction">&gt; <&lt;result>&gt;/UnderConstruction.jsp<&lt;/result>&gt; <&lt;/action>&gt;
デフォルトアクションとするために、特別に何かする必要はない。それぞれのパッケージに独自のデフォルトアクションを持つことができる。ただし、namespace毎にひとつだけ。
'''Namespaceにひとつ'''
=====Wildcard Default=====
ワイルドカード使用することは、デフォルトアクションのことなった方法である。ワイルドカードアクションは、設定の最後で、マッチしない参照をキャッチすることができる。
<&lt;action name="*" >&gt; <&lt;result>&gt;/{1}.jsp<&lt;/result>&gt; <&lt;/action>&gt;
新たなアクションが必要な場合、スタブページを追加する。
===Result 設定===
Result Typeの規定値は、パッケージそれぞれの設定の部分セットとなることができる。もし、あるパッケージが他のパッケージを継承している場合、"子供"のパッケージは独自の規定resultをセットするか、親から継承することができる。
'''Result Type の規定値を設定'''
<&lt;result-types>&gt; <&lt;result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>&gt; <&lt;/result-types>&gt;
type属性が指定されていない場合、フレームワークは dispatcherを利用する。規定のResult Type、dispatcher、は他のWebリソースにフォワードする。
そのリソースがJSPの場合、コンテナはJSPエンジンを使用してページを生成する。
'''規定値を指定しない Result 要素'''
<&lt;result name="success" type="dispatcher">&gt; <&lt;param name="location">&gt;/ThankYou.jsp<&lt;/param>&gt; <&lt;/result>&gt;
'''規定値を利用したResult要素'''
<&lt;result>&gt; <&lt;param name="location">&gt;/ThankYou.jsp<&lt;/param>&gt; <&lt;/result>&gt;
param タグはResultオブジェクトのプロパティを設定する。よく利用するプロパティはWebリソースへのパスを指定するlocationである。param属性は、他のintelligent defaultsである。
'''さらなる規定値を利用した Result 要素'''
<&lt;result>&gt;/ThankYou.jsp<&lt;/result>&gt;
resultをintelligent defaultsとその他のresultsを混ぜたものは、"クリティカルパス"により、用意に見分けられる。
'''混合Results'''
<&lt;action name="Hello">&gt; <&lt;result>&gt;/hello/Result.jsp<&lt;/result>&gt; <&lt;result name="error">&gt;/hello/Error.jsp<&lt;/result>&gt; <&lt;result name="input">&gt;/hello/Input.jsp<&lt;/result>&gt; <&lt;/action>&gt;
=====Global Result=====
しばしば、resultsはaction要素に入れ子にされる。しかし、いくつかのresultsは複数のアクションに適用される。セキュアなアプリケーションでは、クライアントはページへ認証なしにアクセスを試みるかもしれないが、多くのアクションは"logon"resultを返す必要があるであろう。
もし、アクションがresultsを共有する必要がある場合、それぞれのパッケージにglobal resultsを定義できる。フレームワークは最初にアクションタグに入れ子になった、local resultを探す。もし、localにマッチしない場合、global resultsがチェックされる。
'''global resultsの定義'''
<&lt;global-results>&gt; <&lt;result name="error">&gt;/Error.jsp<&lt;/result>&gt; <&lt;result name="invalid.token">&gt;/Error.jsp<&lt;/result>&gt; <&lt;result name="login" type="redirect-action">&gt;Logon!input<&lt;/result>&gt; <&lt;/global-results>&gt;
----
{{include_html banner_html, "!Struts"}}

案内メニュー