-標準フレームワーク。JSFの登場でどうなる?以下の内容は1.x.x系のものです。2.0は登場してから日が経つけど未だ使ったことがない。

#contents

*メリットデメリット [#p32d6e9c]

**メリット [#m3925ddd]

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

**デメリット [#jd9521e9]

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

*インストール [#a46a051d]

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

-手作業でやる場合は以下の手順で
+struts-blank.warを解凍
+WEB-INF/lib以下をコピー
+WEB-INFの全ファイルコピー

*struts-config.xmlの設定 [#h8ab57a9]

**データーソースの設定 [#yf10608f]

-struts-config.xmlで設定できる。DBCPを利用しているのでパラメータの詳細はDBCPのドキュメントを参照のこと!

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

**例外処理 [#k9418f73]

例外の種別ごとにキャッチできる。またExceptionHanderクラスを継承してログ出力などの処理を間にはさむこともできる。

    <global-exceptions>
    	<exception type="java.lang.Exception" key="hoge.hoge" path="/common/error.jsp" handler="common.ExceptionHandler"/>
    </global-exceptions>

**グローバルフォワード [#v81d8bc6]

各アクションで共通のものを定義できる

    <global-forwards>
        <forward name="top" path="/index.jsp"/>
    </global-forwards>

*Actionクラスのバリエーション [#y495ff0f]

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

*はまった点 [#v18601f4]

**Actionクラスはスレッドセーフではない [#fdb83ab3]

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

**その他 [#b0d64775]

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

*サーブレットactionは利用できません エラー対策 [#o0762960]

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

**上記エラー前にStrutsが出すエラーメッセージ [#xd880530]

-解決策はログを見ることだ。TOMCAT_HOME/logsを開いてみるべし。すると以下のようなメッセージが見つかるだろう。

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がおかしい場合 [#f946fdd0]

タグ閉じ忘れでもNG。ブラウザでも開けなかったらそれは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との連携 [#hddd083a]

+struts-blankをworkspaceに解凍しておく
+そのまま新規プロジェクトをそのフォルダ名で作成する
+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

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS