Struts2 設定項目 - 管理
目次
Struts2 設定項目 - 管理
テンプレート:Include html banner html, "!Struts"
Bean設定
内部的にフレームワークはDIコンテナを使用している。DIコンテナはキーとなるフレームワークのオブジェクトをロードする。このためフレームワークのどの部分も、一貫した方法で、置き換えや拡張や削除ができる。プラグインは特にこのSpringやSitemeshのようなサードパーティのライブラリによりフレームワークを拡張することのできる機能を活用している。
Beans
bean要素には、class属性が必須。class属性には、生成し利用するJavaクラス名を指定する。beanは、以下のいづれか
- フレームワークのコンテナにより生成され、フレームワークオブジェクトの中に注入される。または、
- staticメソッドにより値を注入する。
1つ目の使用法、オブジェクトインジェクションは、普通type属性を伴う。この属性は、コンテナにオブジェクトが実装しているインターフェースを教える。 2つ目の使用法、バリューインジェクションは、フレームワークの定数からコンテナがオブジェクトを生成することが許可されていない場合に役立つ。この場合、static属性を定義する必要がある。
属性 | 必須 | 内容 |
---|---|---|
class | yes | beanクラス名 |
type | no | classが実装している主なインターフェース |
name | no | beanの一意名。同じtypeのbean中で一意である必要がある。 |
scope | no | beanのスコープ。default、singleton、request、session、threadのいづれか |
static | no | staticメソッドインジェクションかどうか。typeが指定されている場合、trueではいけない。 |
optional | no | beanがオプショナルか否か。 |
Bean Example (struts.xml)
<struts> <bean type="com.opensymphony.xwork2.ObjectFactory" name="myfactory" class="com.company.myapp.MyObjectFactory" /> ... </struts>
Constant設定
Constantsはキーの設定により、Strutsアプリケーションをカスタマイズする簡単な方法を提供する。これにより、フレームワークやプラグインの振る舞いを変更される。Constantsには、2つのkeyの役割がある。1つ目は設定の上書き、例えばファイルアップロードサイズの最大数やStrutsフレームワークが"devMode"か否か。2つ目はtypeにより複数指定されている実装の中からどのBeanを選ぶかを指定する。
Constantsは、複数のファイルで定義できる。デフォルトでは、次の順序で検索される。後のファイルの設定により、前の設定が上書きされる。
- struts-default.xml
- struts-plugin.xml
- struts.xml
- struts.properties
- web.xml
※struts.propertiesはWebWorkの後方互換のために提供。
Constant
属性 | 必須 | 内容 |
---|---|---|
name | yes | 定数の名前 |
value | *yes | 定数の値 |
Constant Example (struts.xml)
<struts> <constant name="struts.devMode" value="true" /> ... </struts>
Constant Example (struts.properties)
struts.devMode = true
Constant Example (web.xml)
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> <init-param> <param-name>struts.devMode</param-name> <param-value>true</param-value> </init-param> </filter> ... </web-app>
Package設定
Packagesは、actions、results、result types、interceptors、interceptor-stacksを論理的な設定単位にグループ化する方法。
Packages
package要素は、唯一name属性を必須とする。name属性はpackageをキーで参照する。extends属性はオプションで、ある事前に定義されたパッケージをひとつ以上継承できる。
※ 設定ファイルはシーケンシャルに処理されるため、"extends"で参照されるpackageは、使用する箇所より前で定義されている必要がある。
abstract属性は、actionの設定を省いた、基底packageを生成する。
属性 | 必須 | 内容 |
---|---|---|
name | yes | 他のpackageから参照されるためのキー |
extends | no | packageの振る舞いを継承する |
namespace | no | Namespce 設定を参照 |
abstract | no | 抽象packageを宣言(package内に、action設定を要求しない) |
Package Example (struts.xml)
<package name="employee" extends="default" namespace="/employee"> <default-interceptor-ref name="crudStack"/> <action name="list" method="list" class="org.apache.struts2.showcase.action.EmployeeAction" > <result>/empmanager/listEmployees.jsp</result> <interceptor-ref name="basicStack"/> </action> <action name="edit-*" class="org.apache.struts2.showcase.action.EmployeeAction"> <param name="empId">{1}</param> <result>/empmanager/editEmployee.jsp</result> <interceptor-ref name="crudStack"> <param name="validation.excludeMethods">execute</param> </interceptor-ref> </action> <action name="save" method="save" class="org.apache.struts2.showcase.action.EmployeeAction" > <result name="input">/empmanager/editEmployee.jsp</result> <result type="redirect">edit-${currentEmployee.empId}.action</result> </action> <action name="delete" method="delete" class="org.apache.struts2.showcase.action.EmployeeAction" > <result name="error">/empmanager/editEmployee.jsp</result> <result type="redirect">edit-${currentEmployee.empId}.action</result> </action> </package> </struts>
Namespace 設定
namespace 属性は、actionを論理モジュールに分割する。それぞれプレフィックスで識別される。Namespaceはaction名の衝突を避ける。それぞれのnamespaceは、独自に実装した"menu"や"help" action を持つことができる。ブラウザのURIにプレフィックスが現れるにもかかわらず、タグは"namespaceを認識している"ので、namespaceプレフィックスをformタグやlinkタグへ埋め込む必要はない。
Default Namespace
デフォルトのnamespaceは、""(空文字)です。デフォルトnamespaceは、"すべてキャッチする"namespaceとして利用されます。もし、あるactionの設定が指定されたnamespaceに見つからない場合、デフォルトのnamespaceも検索されます。ローカル/グローバル 戦略はアプリケーションがグローバルアクション設定を、"継承"され、階層化されたアクションの外側に持つことを許可します。
namespaceプレフィックスは、javaの宣言型のセキュリティを承認されたユーザのみがnamespaceを与えられたアクションにアクセスできることを保障するように、登録することがでる。
Root Namespace
ルート namespace("/")もサポートされます。コンテキストパス直下にに直接リクエストされる場合が、ルートnamespaceです。他のnamespaceと同様に、ローカルアクションが見つからない場合、デフォルトnamespace("")に送信されます。
Namespaceの例
<package name="default"> <action name="foo" class="mypackage.simpleAction> <result name="success" type="dispatcher">greeting.jsp</result> </action> <action name="bar" class="mypackage.simpleAction"> <result name="success" type="dispatcher">bar1.jsp</result> </action> </package> <package name="mypackage1" namespace="/"> <action name="moo" class="mypackage.simpleAction"> <result name="success" type="dispatcher">moo.jsp</result> </action> </package> <package name="mypackage2" namespace="/barspace"> <action name="bar" class="mypackage.simpleAction"> <result name="success" type="dispatcher">bar2.jsp</result> </action> </package>
どのように動くのか
もし、/barspace/bar.action とリクエストされた場合、/barspace namespaceが検索され、bar アクションがみつかれば実行されます。そうでない場合は、デフォルトnamespaceに処理されます。Namespaceの例では、bar アクションは barspace namespaceに存在しています。barspace.bar アクションは実行され、"success"が返され、リクエストは bar2.jspにフォワードされます。
Fooへリクエストが落ち込んでいく もし、リクエストが /barspace/foo.action であれば、/barspace にfooアクションが探されます。もしローカルアクションが見つからない場合、デフォルトnamespaceがチェックされます。Namespace例では、fooアクションは、/barspace namespaceに存在しないため、デフォルトがチェックされ、/foo.action が実行されます。
Namespace例では、もしmoo.actionがリクエストされた場合、ルートnamespace("/")が検索されます。もし、ルートアクションが見つからない場合、デフォルトnamespaceがチェックされます。このケースでは、moo アクションは存在するため、選択されます。成功した場合、リクエストは、bar2.jspにフォワードされます。
Rootを受け取る もし /foo.action がリクエストされた場合、ルート / namespaceがチェックされます。もしfooがみつかれば、ルートアクションが選択されます。見つからない場合、フレームワークは、デフォルトnamespaceをチェックします。この例の場合、foo アクションはルートnamespaceに存在しないため、デフォルトnamaspaceがチェックされ、デフォルトのfoo アクションが選択されます。
Namespaceはパスではない! Namespace はファイルシステムのパスのように階層化されていません。namespaceは1つの階層しかありません。例えば、URL /barspace/myspace/bar.action がリクエストされた場合、フレームワークは最初に /barspace/myspace namespaceを探します。もし、アクションが /barspace/myspace に見つからない場合、検索は直ちにデフォルトnamespace ""に落ち込みます。フレームワークはnamespaceをフォルダに解析しません。Namespace例では、デフォルトnamespaceのbarアクションが選択されます。
Include 設定
一般的な戦略として"分割統治"があります。Struts2フレームワークでは"分割統治"を、設定ファイルでinclude要素を使用することで行うことができます。
それぞれのincludeされたファイルは、インクルードしているdoctypeの、struts.xmlと同じ書式である必要があります。includeするファイルはclasspathが通っているところであればどこにでも置くことができます。
大規模なチームによる開発環境では、異なったチーム毎に開発されるアプルケーションのモジュールとしてそれぞれ別のincludeファイルを編成できます。
© 2006 矢木浩人