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を追及していこうと思います。