トップ 差分 一覧 ping ソース 検索 ヘルプ PDF RSS ログイン

Struts2 設定項目 - 管理



目次



記事一覧

キーワード

Struts2 設定項目 - 管理

指定されたパートは存在しません。

 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ファイルを編成できます。


指定されたパートは存在しません。



YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto

Copyright© 矢木 浩人 All Rights Reserved.