Struts2 Conventionプラグイン

| コメント(0) | トラックバック(0)


Struts2の大きな特徴である、

Zero Configuration(アクションマッピング等の設定をファイルに記述しない)

ですが、2.0系で使用していた、Codebehindプラグインが非推奨なった。

 

現時点(2010/11/3)での、Struts2のバージョンも2.2.1であるため、

最新のバージョンへの更新および、Codebehindプラグインをやめ、

Conventionプラグインへの切換えをおこなってみた。

しかも、GAE(Google App Engine)環境で。

 

仕組み自体はそう大して変わっていないと思っていたが・・・

やはり簡単には移行できなかったので、あれこれと調べる羽目になり、

時間も結構かかったが、なんとか動作するようになり、

Conventionプラグインについても見えてきた。

 

とりあえず、つまづき度が大きかった順に・・・

※これはGAE(Google App Engine)でテストしていたのも重なり、障害の

切り分けに時間がかかってしまったような気もするが・・・

障害としては、URLで該当のアクションwp呼び出すURLを入力しても、

「アクションが見つからない」とのメッセージ。

 

"There is no Action mapped for namespace /"

 

Codebehindプラグインを使用していた時にもハマったエラー。

その際は次のように、"actionPackages"というパラメータを

web.xmlで設定すれば、指定した名前空間の下にあるアクションクラスを

参照してくれるようになった。

 

 <filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  <init-param>
   <param-name>actionPackages</param-name>
   <param-value>com.pg2se.sample.action</param-value>
  </init-param>
 </filter>

しかし、今回は同様のパラメータ設定をしていてもうまくアクションが呼び出されない・・

そして、どこかのページで、Struts.xml の配置が必要で、

"<constant name="struts.devMode" value="true" />"の設定をしろ!のようなページを

見てしまったため、

"access denied (java.io.FilePermission jar:file:\C:\Projects\gae\war\WEB-INF\lib\struts2-core-2.2.1.jar read)"

というエラーも出るようになったりで、Struts2が悪いのか、GAEか、どこがどう悪いかが見当つかなくなった。

 

もう1点が、Resultのjspファイルが見つからない旨のエラーが発生したこと。

 

"No result defined for action "のエラーメッセージ。

 

アクションは実行されたようだだが、ビューファイルが見つからない。

これも今までは普通にjspを配置すれば動いていたのだが・・・

 

結局、順番にひとつづつ試していってわかったこと。

1.Struts.xml は無くても動作はした。

 

2.Struts.xml の"<constant name="struts.devMode" value="false" />"でvalueはfalseにする。

  ※これはGAE環境だからかもしれない・・

 

3.GAE環境では、セキュリティマネージャを無効にする必要がある

  ※web.xmlにリスナーを設定してセキュリティマネージャを無効にする。

 

     <listener><!-- GAE関連で必要なListenerを設定 -->

         <listener-class>com.pg2se.google.InitListener</listener-class>

     </listener>

 

    public class InitListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {

        @override

        public void contextInitialized(ServletContextEvent arg0) {
            OgnlRuntime.setSecurityManager(null);
        }

    }

  こんな感じ

 

4.これもGAE環境でのエラーのはず。

  クラスが見つからない旨のエラー。→xalan関連のクラス。

  こちらはxalanのライブラリをダウンロードして手動で追加する必要があった。

 

5.アクションクラスが見つからない件

  上記の設定で、すべて再起動、再ビルドするとアクションは実行されるようになった。

  ※因みにConventionプラグインでは、web.xmlでの、"actionPackages"パラメータは

  記述しなくて良く、アクションクラスの格納されたパッケージは自動検出される。

  →action,actions,struts,struts2の名前のついたパッケージが対象

 

6.ビューファイルが見つからない件

  Conventionプラグインでは、ビューファイル(jsp等)の配置場所もデフォルトで設定

  されている。それが、/WEB-INF/content/ です。

  ※そりゃ、今までどおりでは、resultのファイルが呼び出されない訳だ。

  取り急ぎ、jspのビューファイルを、上記場所に移動。

 

以上で、なんとかこれまでどおり、Struts2が動作するようになった。(しかもGAE上で)

Conventionプラグインン・・・なかなか癖があり、手ごわかった。

 

さて、これまでは、Conventionプラグインのデフォルトの設定を生かしたが、

カスタマイズするには?だけど・・・、方法はあります。

 

struts.xmlファイルに<constant>タグで設定を記述することによって、既定値を変更することが可能です。

例)<constant name="struts.convention.result.path" value="/WEB-INF/jsp/"/>

  <constant name="struts.convention.package.locators" value="act"/>

 

他にも設定変更の詳細や、今回ハマった内容のほとんどについては、

以下のページで詳しく解説されています。

Struts 2入門(6)?XML不要のZero Configuration?

Google App Engine/Struts2の連携

 

今後、Struts2.2、GAEを連携させてより深いところまで、

Struts2を追及していこうと思います。

トラックバック(0)

トラックバックURL: http://pg2se.com/mt6/mt-tb.cgi/71

コメントする