基本的には、warファイルを自動解凍するTomcatでやるのが楽。 webappフォルダにwarファイルをコピーしてからTomcat起動 WindowsでもLinuxでも成功!追記この手順でJDK6とTomcat6とStruts1.3.8の組み合わせで動かせた。
<data-sources> <data-source type="org.apache.commons.dbcp.BasicDataSource"> <set-property property="driverClassName" value="org.postgresql.Driver" /> <set-property property="url" value="jdbc:postgresql://ホスト名:ポート番号/DB名" /> <set-property property="username" value="ユーザー" /> <set-property property="password" value="パスワード" /> <set-property property="maxActive" value="10" /> <set-property property="maxWait" value="5000" /> <set-property property="defaultAutoCommit" value="false" /> <set-property property="defaultReadOnly" value="false" /> <set-property property="validationQuery" value="SELECT version()" /> </data-source> </data-sources>
例外の種別ごとにキャッチできる。またExceptionHanderクラスを継承してログ出力などの処理を間にはさむこともできる。
<global-exceptions> <exception type="java.lang.Exception" key="hoge.hoge" path="/common/error.jsp" handler="common.ExceptionHandler"/> </global-exceptions>
各アクションで共通のものを定義できる
<global-forwards> <forward name="top" path="/index.jsp"/> </global-forwards>
普通に考えると1画面1アクション。それだけだとただトップページを表示するだけのActionなどが大量に存在することになるのでForwardActionが用意されている。さらに同一画面でボタンにより複数の処理を分けたい場合にDispatchActionが用意されている。これはリクエストパラメータの値により呼び出すメソッドを動的に指定できるのでsymfonyのactionsみたいなものだ。
これはAPIにも記載があるのに意外とはまる人が多いので注意。Actionオブジェクトはプールされており同じインスタンスが使いまわされる。ゆえにログインしているユーザーの情報などリクエスト固有の情報をフィールドにもたせてはいけない。StrutsのActionクラスには定数フィールド以外は持たせないほうが無難である。最近流行のDIコンテナ(SpringやSeasarなど)を使うとリクエスト毎にActionオブジェクトを生成するようになるのでそっちを使うのも手。
Strutsでリクエストの受付先であるActionServletが何かしらの理由(設定ファイル記述ミスが大半)により初期化失敗したときに上記エラーメッセージが出る。なので何かしらの変更を加えて、その後Tomcatを再起動した後にこのエラーに遭遇することが多い。一気に変更してタイプミスが一部に隠れているなどという凡ミスが多いので、もし変更前に戻せるなら戻すべきである。Tomcatではservletのinit()でUnavailableExceptionをthrowするとこのメッセージが出る。なのでほかのサーブレットでも出ることがある。要は初期化に失敗しているから使えませんよってことである。一度こうなると該当設定を見直して、アプリケーションサーバー(Tomcat)再起動しないとだめである。
Unable to initialize Struts ActionServlet due to an unexpected exception or error thrown, so marking the servlet as unavailable. Most likely, this is due to an incorrect or missing library dependency.
予期せぬエラーのためActionサーブレットの初期化に失敗しました。このサーブレットを利用不可にセットします。原因としてはライブラリの設定が不正だったり、なかったりすることが考えられます。
タグ閉じ忘れでもNG。struts-config.xmlがIEなどのブラウザでも開けなかったらそれはxmlとして不正ということ。以下のエラーメッセージが出るはず。
2007-07-11 14:31:24 StandardWrapper[/struts-blank-1.3.8:action]: サーブレット action を利用不可能にマークします 2007-07-11 14:31:24 StandardContext[/struts-blank-1.3.8]: サーブレット /struts-blank-1.3.8 がload()例外を投げました javax.servlet.UnavailableException: パス jndi:/localhost/struts-blank-1.3.8/WEB-INF/struts-config.xml に対するリソース読み込みエラー
<message-resources parameter="java.resources.application" />
struts-blank.warでは、application.propertiesは「/WEB-INF/src/java/resouces」というディレクトリに含まれていますので、eclipse上でソースディレクトリを「WEB-INF/src」とした場合は、リソースファイルは「java.resources」パッケージに含まれることになります。従って、解決方法としては(1)eclipse上でのソースディレクトリを「WEB-INF/src/java」にする。(2)struts-config.xmlのmessage-resourceタグのparameterを「java.resources.application」にする。(3)application.propertiesファイルを「/WEB-INF/src/resoucrs」に移動する。の何れかが必要です。
上記は1.2系
1.3系は以下のようにする
<message-resources parameter="java.MessageResources" />