メリットデメリット

メリット

  1. 登場から長いので枯れていて安定している(1.2or1.3系)
  2. ノウハウや経験者が多い
  3. ほかの言語のフレームワークにも多大な影響を与えているので、覚えておいて損はない。

デメリット

  1. 設定ファイルまみれ(これを回避するにはSAStrutsを使うとよい)
  2. Actionクラスのフィールドはスレッドセーフにしなければいけないなどの、暗黙のルールがある
  3. ActionクラスはServletAPIにかなり依存しているので、単体テストしずらい。それを改良した後発のフレームワークに慣れていると不便

インストール

基本的には、warファイルを自動解凍するTomcatでやるのが楽。 webappフォルダにwarファイルをコピーしてからTomcat起動 WindowsでもLinuxでも成功!追記この手順でJDK6とTomcat6とStruts1.3.8の組み合わせで動かせた。

  1. struts-blank.warを解凍
  2. WEB-INF/lib以下をコピー
  3. WEB-INFの全ファイルコピー

struts-config.xmlの設定

データーソースの設定

<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>

Actionクラスのバリエーション

普通に考えると1画面1アクション。それだけだとただトップページを表示するだけのActionなどが大量に存在することになるのでForwardActionが用意されている。さらに同一画面でボタンにより複数の処理を分けたい場合にDispatchActionが用意されている。これはリクエストパラメータの値により呼び出すメソッドを動的に指定できるのでsymfonyのactionsみたいなものだ。

はまった点

Actionクラスはスレッドセーフではない

これはAPIにも記載があるのに意外とはまる人が多いので注意。Actionオブジェクトはプールされており同じインスタンスが使いまわされる。ゆえにログインしているユーザーの情報などリクエスト固有の情報をフィールドにもたせてはいけない。StrutsのActionクラスには定数フィールド以外は持たせないほうが無難である。最近流行のDIコンテナ(SpringやSeasarなど)を使うとリクエスト毎にActionオブジェクトを生成するようになるのでそっちを使うのも手。

その他

  1. リソースファイルはstruts-config.xmlで指定する。
  2. リソースについては英語しかダメなのですが(未解決)
  3. struts-config.xmlが間違っていると「サーブレット action は現在利用できません」のエラーが出る
  4. form-propertyに同一の名前があると同じく「サーブレット action は現在利用できません」エラー
  5. Dyna系フォームはプロパティのクラス名間違ってる(×String○java.lang.String)とActionFromがnullになる。

サーブレットactionは利用できません エラー対策

Strutsでリクエストの受付先であるActionServletが何かしらの理由(設定ファイル記述ミスが大半)により初期化失敗したときに上記エラーメッセージが出る。なので何かしらの変更を加えて、その後Tomcatを再起動した後にこのエラーに遭遇することが多い。一気に変更してタイプミスが一部に隠れているなどという凡ミスが多いので、もし変更前に戻せるなら戻すべきである。Tomcatではservletのinit()でUnavailableExceptionをthrowするとこのメッセージが出る。なのでほかのサーブレットでも出ることがある。要は初期化に失敗しているから使えませんよってことである。一度こうなると該当設定を見直して、アプリケーションサーバー(Tomcat)再起動しないとだめである。

上記エラー前にStrutsが出すエラーメッセージ

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サーブレットの初期化に失敗しました。このサーブレットを利用不可にセットします。原因としてはライブラリの設定が不正だったり、なかったりすることが考えられます。

struts-config.xmlがおかしい場合

タグ閉じ忘れでも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 に対するリソース読み込みエラー

eclipseとの連携

  1. struts-blankをworkspaceに解凍しておく
  2. そのまま新規プロジェクトをそのフォルダ名で作成する
  3. 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" />
Counter: 48280, today: 1, yesterday: 1

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-10-14 (金) 13:16:53