STRUTS0.5(STRUTS1.0ではかなり仕様が変更されています。)

 ◆STRUTS(ストラ−ツ)とは
   サ−ブレット・コンテナ上に構築するフレ−ムワ−クであり、タグライブラリとクラスライブラリ及びXMLファイル
   で構成されています。</p>   ◆STRUTS0.5の基本
   ●コントロ−ラ
      ストラ−ツではActionServletあるいはActionServletを継承したサ−ブレットをWEBアプリ単位での共通
     コントロ−ラとして用います。共通コントロ−ラはサ−ブレット・コンテナが制御を行います。
      共通コントロ−ラはサブコントロ−ラ、モデル、マッパ−、ビュ−の呼び出し等、WEBアプリの制御を行っ
     ています。
      共通コントロ−ラはビュ−上から"Actionクラスの代替名.do"がコ−ルされたときに起動され、"Action
     クラスの代替名"に対応したActionクラスのインスタンス化、アクション定義ファイル(action.xml)に基づいた
     ActionForm・ActionMappingのインスタンス化等の処理を行い、Actionクラスのperformメソッドをコ−ルし
     た後、その返り値で表示するビュ−の分岐を行います。

   ●サブコントロ−ラ
      ストラ−ツではサブコントロ−ラに各Webアプリ独自の処理を記述します。
     サブコントロ−ラではHttpServletではなくストラ−ツ独自のActionBaseクラスを継承し、doGet()・doPost()
     メソッドのかわりに performメソッドをオ−バ−ライド(上書き)します。
      ActionBaseあるいはそのサブクラスを継承したクラスをActionクラスと呼びます。
     
   ●モデル
      ストラ−ツではモデルにActionFormあるいはJavaBeansを使用します。ActionFormはActionFormインタ−
     フェイスあるいはそのサブインタ−フェイスを実装し、そのクラスの中にsetterとgetterを用意します。
     ActionFormとアクション定義ファイルとビュ−上でのストラ−ツ独自タグを用いたFORMの記述との連携に
     より、perform メソッド上でActionFormクラスのインスタンスを新規に生成したときに、ActionServletが
     ビュ−上のFormから取得したデ−タをActionFormオブジェクトに格納する事ができます。
      
   ●マッパ−
      ペ−ジ間の移動の関係を格納するものをマッパ−と呼びます。ストラ−ツではマッパ−として、
     ActionMappingクラスを用います。
      ActionMappingクラスはActionMappingBaseクラスを継承します。ActionMappingクラスは必ずfinal指定し
     ます。
      このクラスの中にアクション定義ファイルの中に記述したforwardタグの“省略名”に対応したsetterとgetter
     をforwardタグの数だけ用意する必要があります。

   ●ビュ−
      JSPファイルとして記述します。JSP内部ではストラ−ツ独自のタグライブラリを使用します。
     ◆サブコントロ−ラについて
   ●performメソッドはActionServlet、ActionMapping、ActionForm、HttpServletRequest、
     HttpServletResponseオブジェクトを引数としてもっています。

    1.ActionMappingクラスはアクション記述ファイルに記述されているペ−ジ移動の関係を格納するクラスです。
    2.ActionFormクラスはフォ−ムのデ−タを格納するクラスです。
    3.ActionServlet、ActionMapping、HttpServletRequest、HttpServletResponseに関しては、performメソッド
     の実行前にオブジェクトが存在します。ActionFormに関しては存在する場合と存在しない場合があります。

 ◆アクション定義ファイル(action.xml)の記述法
   ●XMLツリ−の頂点には必ずaction-mappingsタグがあります。
   ●action-mappingsタグ直下にはforwardタグとactionタグがあります。
   ●actionタグ直下にはpropertyタグとforwardタグがあります。
   ●forwardタグについて
     forwardタグは下記の形式で記述します。
      <forward name="省略名" path="ビュ−のWEBアプリル−トからの相対パス"/>
     forwardタグを記述しておくと、ActionMappingオブジェクトのfindForwardメソッド呼び出し時に引数として
     “省略名”を与えることにより、省略名に対応したペ−ジへの移動を行えます。
       return ActionMappingオブジェクト.findForward("省略名")

      action-mappings直下のforwardタグの“省略名”はアクション定義ファイルに記述した全てのAction
     クラス内で有効です。
      actionタグ直下にあるforwardタグの省略名はそのActionタグに対応するActionクラス内でのみ有
     効です。

   ●Actionタグについて
     Actionクラスの数だけ用意する必要があります。
     Actionタグは下記の形式で記述します。

     <action path="/Actionクラスの代替名"
      actionClass="Actionクラスのパッケ−ジ内パス"
      formAttribute="ActionFormの代替名"
      formClass="ActionFormのパッケ−ジ内パス"
      inputForm="ビュ−のWEBアプリル−トからの相対パス">
       <forward name="省略名" path="ビュ−のWEBアプリル−トからの相対パス"/>
     </action>
     
     あるいは

     <action path="/Actionクラスの代替名">
      <property name="actionClass" value="Actionクラスのパッケ−ジ内パス"/>
      <property name="formAttribute" value="ActionFormの代替名"/>
      <property name="formClass" value="ActionFormのパッケ−ジ内パス"/>
      <property name="inputForm" value="ビュ−のWEBアプリル−トからの相対パス"/>
      <forward name="省略名" path="ビュ−のWEBアプリル−トからの相対パス"/>
     </action>

      inputFormプロパティ(省略可能)を記述しておくと、performの中でActionMappingオブジェクトの
      getInputFormメソッドを呼び出すことでinputFormで指定したビュ−に移動できます。
      return new ActionForward(ActionMappingオブジェクト.getInputForm()))

   ●アクション定義ファイルの全体像
      <action-mappings>
       <forward name="省略名" path="ビュ−のWEBアプリル−トからの相対パス"/>
       forwardタグの羅列
       <action path="/Actionクラスの代替名"
        actionClass="Actionクラスのパッケ−ジ内パス"
        formAttribute="ActionFormの代替名"
        formClass="ActionFormのパッケ−ジ内パス"
        inputForm="ビュ−のWEBアプリル−トからの相対パス">
        <forward name="省略名" path="ビュ−のWEBアプリル−トからの相対パス"/>
        forwardタグの羅列
       </action>
       actionタグの羅列
      </action-mappings>

 ◆strutsでのエラ−メッセ−ジ表示手順

   1.MessagesResourcesクラスのインスタンスの生成時に引数としてActionServletオブジェクトを与えた
    ActionBaseクラスのgetResourcesメソッドの返り値を生成したオブジェクトに渡します。
     MessageResources MessageResourcesオブジェクト = getResources(ActionServletオブジェクト)

     この処理ではActionServletに格納されているリソ−スデ−タのMessageResources
    オブジェクトへのコピ−が行われています。
    
   2.ErrorMessagesクラスのインスタンス化を行います。
     ErrorMessages ErrorMessagesオブジェクト = new ErrorMessages()

   3.リソ−スデ−タの“省略名”を引数として、ErrorMessagesオブジェクトのaddErrorメソッドを呼び出します。
     この処理では表示したいエラ−メッセ−ジに対応する“省略名”のErrorMessagesオブジェクトへの格納
    が行われています。
     ErrorMessagesオブジェクト.addError("リソ−スデ−タの省略名")

   4.Performメソッドの終わりで、ErrorMessagesオブジェクトを引数としてActionBaseクラスのsaveErrors
    メソッドを呼び出します。
     saveErrors(ErrorMessagesオブジェクト)

     この処理ではのErrorMessagesオブジェクト属性のペ−ジコンテキストへの格納が行われています。

   5.リソ−スデ−タはActionServlet起動時にActionServletオブジェクト内に格納され、MessageResources
    オブジェクトの属性はその時にペ−ジコンテキストに登録されます。

   6.JSPファイルにストラ−ツのエラ−タグ<struts:errors/>を記述することにより、実行時にエラ−
    メッセ−ジを画面に表示します。
     この処理ではペ−ジコンテキストから取り出した“省略名”の配列とリソ−スデ−タを照合し、エラ−
    メッセ−ジの生成及び表示を行っています。

    ※表示されるメッセ−ジの詳細はerrors.header対応メッセ−ジ+改行+各エラ−メッセ−ジ(改行付き)の
    羅列+errors.footer対応メッセ−ジです。
    (errors.headerとerrors.footerはstruts.jar中のActionResources.propertiesに記述されている省略名
    です)

 ◆ApplicationResources.propertiesの記述法
   「省略名=表示メッセ−ジ」の形式で記述します。省略名の重複はエラ−となります。
   表示メッセ−ジにはHTMLなどのタグを埋め込むことができます。
    
 ◆STRUTSにおけるログ
    任意の文字列を引数として、ActionServletオブジェクトのlogメソッドを呼び出すと、
   サ−ブレットコンテナのサ−ブレット用ログファイルに任意の文字列を書き込みます。
    ActionServletオブジェクト.log("任意の文字列")

 ◆ActionFormのインスタンス化について
   ActionFormオブジェクトが存在しない場合には、newを使って、ActionFormオブジェクトの生成を行います。
    ActionForm ActionFormオブジェクト = new ActionForm()
   すでにActionFormオブジェクトが存在している場合は生成するオブジェクトにperformメソッドの引数として
   与えられているActionFormオブジェクトを渡して、ActionFormオブジェクトを生成します(このときには必ず
   ActionFormクラスでキャストします)。
    ActionForm ActionFormオブジェクト = (ActionForm)引数ActionFormオブジェクト

   上記のようにActionFormオブジェクトを生成すると、内部では下記の処理が行われます。
   1.リクエストのパラメ−タとActionFormの属性が一致すれば、setterを起動します。
   2.更新されたActionFormオブジェクトを必要なときにActionクラスのperformメソッドに渡します。

 ◆ActionFormの有効期限について
   ●<jsp:useBean>タグを使う場合にはJSPファイル(ビュ−)側でActionFormの有効期限を設定します。

   ●<jsp:useBean>タグをつかわない場合はペ−ジコンテキストへのActionFormオブジェクト属性の登録、
     ペ−ジコンテキストからのActionFormオブジェクトの属性の削除をActionクラスで行ってやらなくては
    なりません。

    1.newを使って、SESSIONクラスをインスタンス化します。
    2.ペ−ジコンテキストへの属性の登録は下記のメソッドで行います。
     SESSIONオブジェクト.setAttribute(ActionMappingオブジェクト.getFormAttribute(),
       ActionFormオブジェクト)
    3.ペ−ジコンテキストからの属性の削除は下記のメソッドで行います。
     SESSIONオブジェクト.removeAttribute(ActionMappingオブジェクト.getFormAttribute())

**********************************************************************************
 ◆STRUTS0.5のセットアップ
    ●Tomcat3.XとApacheの場合
     1.jakarta-struts-x.tar.gz(windowsの場合の拡張子はzip)を解凍し、webappフォルダにある
      struts-example.jarとstruts-documentation.jarをTomcatをインスト−ルしたフォルダ直下
      のwebappsフォルダにコピ−します。

     2.Apacheとの連携の場合には、Apacheをインスト−ルしたフォルダ直下のconfフォルダにある
      httpd.confに次の一文を追加します。
       AddHandler jserv-servlet .do
      ※本家の方法とは異なります。こうすることにより、mod_jk.soの場合とApacheModuleJserv.so
       の場合(windowsの場合はdll)を区別する必要がありません。
        Tomcat起動時にstrutsがwebアプリに必要な設定をmod-jk.conf-autoとtomcat-apache.conf
       に書き込む為、これらのファイルに追加するのは得策ではありません。

     3.Tomcatを再起動します。

     4.ブラウザを立ち上げ、http://localhost/struts-example にアクセスして下さい。
      MailReader Demonstrationが表示されれば、インスト−ルは終了です。

    ●Resin1.2の場合
    1.jakarta-struts-x.tar.gz(windowsの場合の拡張子はzip)を解凍し、webappフォルダにある
     struts-example.jarとstruts-documentation.jarをResinをインスト−ルしたフォルダ直下
     のwebappsフォルダにコピ−します。

    2.struts.tldにバグが存在するため、これを修正する必要があります。
     1080行と1758行の
      <required>name</required>
     を次のように修正すれば、バグつぶしは終了です。
      <required>false</required>

    3.ブラウザを立ち上げ、http://localhost/struts-example にアクセスして下さい。
     MailReader Demonstrationが表示されれば、インスト−ルは終了です。
     (Resinは再起動なしにWEBアプリの展開を行えるため、再起動の必要はありません)

 ◆STRUTS0.5アプリの設定
    ●WEBアプリ定義ファイル(web.xml)への追加
     STRUTSアプリの動作にはweb.xmlへの設定の追加が必要です。
     <!-- Action Servlet Configuration -->
     <servlet>
      <servlet-name>action</servlet-name>
      <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
      <init-param>
       <param-name>application</param-name>
       <param-value>リソ−スデ−タのパッケ−ジ内パス名</param-value>
      </init-param>
      <init-param>
       <param-name>config</param-name>
       <param-value>action.xmlのル−トからの相対パス</param-value>
      </init-param>
      <init-param>
       <param-name>debug</param-name>
       <param-value>2</param-value>
      </init-param>
      <init-param>
       <param-name>detail</param-name>
       <param-value>2</param-value>
      </init-param>
      <load-on-startup>2</load-on-startup>
     </servlet>

     <!-- Action Servlet Mapping -->
     <servlet-mapping>
      <servlet-name>action</servlet-name>
      <url-pattern>*.do</url-pattern>
     </servlet-mapping>

     <!-- Struts Tag Library Descriptor -->
      <taglib>
      <taglib-uri>struts.tldのル−トからの相対パス</taglib-uri>
      <taglib-location>struts.tldのル−トからの相対パス</taglib-location>
      </taglib>

      1.ActionServletConfigurationでの設定事項
        ・ActionServletの代替名の設定
        ・ActionServletで使用するリソ−スデ−タの簡略名の設定
        ・action.xmlの省略名設定
        ・その他

      2.ActionServletMappingの設定事項
        ActionServletが拡張子が.doとなっているURIとマッチするように設定しています。
        この設定により、*.doというURIがコ−ルされたときにActionServletが最初に起動されるように
        なります。

     3.Struts Tag Library Descriptorでの設定事項
        Strutsタグライブラリのエントリを定義しています。
        この設定により、WEBアプリ内でのStrutsタグライブラリの使用が許可されます。

**********************************************************************************
STRUTS0.5タグ・リファレンス

 ◆メッセ−ジ
   <struts:message key="ActionResources.properties内の省略名"/>

   省略名に対応したメッセ−ジを画面上に表示します。

 ◆HTMLプロパティ
   <struts:htmlProperty name="モデルの代替名" property="モデルのプロパティ名"/> 

   モデルの代替名にはアクション定義ファイル(action.xml)またはWEBアプリ定義ファイル(web.xml)で設定した
   ものを使用します。
   Formタグとは関係なく、ペ−ジコンテキスト内のデ−タを表示できます。

 ◆ル−プテ−ブル
   <struts:enumerate id="モデルの代替名" name="モデルのプロパティであるモデル(プロパティモデル)名"
     property="プロパティモデル内の配列要素名">
      テ−ブル
   </struts:enumerate>

   "モデルの代替名"にはaction.xmlまたはweb.xmlで設定したものを使用します。
   このタグを使うと、プロパティモデル内の配列要素のインデックス数分のテ−ブルをデ−タを埋め込んだ形で
   表示できます。

 ◆リンク
   <struts:link href="Actionクラスの代替名.do[?クエリ−ストリング]">リンクラベル</struts:link>

   リンクを表示します。

 ◆プロパティIF文
    <struts:ifPropertyEquals name="モデルの代替名" property="モデルのプロパティ名"
     value="判断値"/ >
     表示要素
    </struts:ifPropertyEquals>

   "モデルの代替名"にはaction.xmlまたはweb.xmlで設定したものを使用します。
   モデルのプロパティ=判断値ならば、表示要素を画面に表示します。

 ◆プロパティ存在IF文
    <struts:ifAttributeExixts name="属性クラスのパッケ−ジパス"
     scope="有効範囲">
     表示要素
    </struts:ifAttributeExists>

 ◆属性ミス
    <struts:ifAttributeMissing name="strutsの属性クラスのパッケ−ジパス"
     scope="有効範囲">
     表示要素
    </struts:ifAttributeMissing>

 ◆フォ−ム
    <struts:form action="Actionクラスの代替名.do" name="ActionFormの代替名"
     focus="ActionFormのプロパティ名">
     type="ActionFormのパッケ−ジ内パス>"
     フォ−ム内要素
    </struts:form>

    ●隠しフィ−ルド
      <struts:hidden property="ActionFormのプロパティ名"/>

     ActionFormとの間でデ−タのやり取りを行います。

    ●プロパティ
      <struts:property property="ActionFormのプロパティ名"/>

     ActionFormからデ−タを取得し、表示します。

    ●テキスト
      <struts:text property="ActionFormのプロパティ名" size="サイズ" maxlength="最大長"/>

     ActionFormとの間でデ−タのやり取りを行います。

    ●テキストエリア
      <struts:textarea property="ActionFormのプロパティ名" cols="列数" rows="行数"/>

     ActionFormとの間でデ−タのやり取りを行います。

    ●パスワ−ド入力フィ−ルド
      <struts:password property="ActionFormのプロパティ名" size="サイズ" maxlength="最大長"/>

     ActionFormにデ−タを渡します。

    ●コンボボックス
      <struts:select property="type">
      <struts:options name="ペ−ジコンテキスト内の配列要素名"
       labelName="ペ−ジコンテキスト内の配列要素名"/>
      </struts:select>

     ActionFormとの間でデ−タのやり取りを行います。

    ●パラメ−タIf文
      <struts:ifParameterEquals name="ActionFormのプロパティ名" value="判断値">
       表示要素
      </struts:ifParameterEquals>

     ActionFormのプロパティ名=判断値ならば、表示要素を表示します。

    ●パラメ−タnot If文
      <struts:ifParameterNotEquals name="ActionFormのプロパティ名" value="判断値">
       表示要素
      </struts:ifParameterNotEquals>

     ActionFormのプロパティ名 !=判断値ならば、表示要素を表示します。

**********************************************************************************
STRUTS0.5クラスライブラリ

<!--  作成予定-->
 ◆ActionBaseクラス
    ●ActionForward perform(ActionServlet servlet,ActionMapping mapping,ActionForm form,
     HttpServletRequest req,HttpServletResponse res)

     ストラーツ利用者はこのメソッドをオ−バーライドし、WEBアプリ独自処理を記述します。

    ● MessageResources getResources(ActionServlet servlet)

 ◆ErrorMesagesクラス
    ●void addError("リソースデータファイル上の省略名")