入力・更新画面 と Action Bean の作成


入力・更新画面 と Action Bean の作成

画面遷移図をみてトップページから遷移される入力/更新画面を作成します。 ここではとりあえずエラーチェックは作成してません。 ひととおり作成した後でValidatorで入力チェックを行うようにします。

Input.jsp の作成

Input.jsp を Struts カスタムタグを使用して作成します。 Eclipse で Solar Plugin を導入しているので JSP ファイルは 色が変わりながらタグの閉じ忘れをチェックしながら作成すること ができるでしょう。

作成方針

まずは前の Welcome.jsp をコピーして Input.jsp を作成します。 この段階では実際のフォーム部分は単純な HTML です。 ただ、日本語が入力されるテキストボックスの maxlength 属性は 忘れずに実際に DB の最大長/2を適用しておきます。 そうしないと最大長入力させるとエラーになってしまいます。

MessageResources.properties にメッセージを登録します

MessageResources.properties

# -- Input --
input.title=Windows2000 + WebLogic + SQL Server を利用した Web システム開発
input.heading=入力/更新画面

表示してみます。

  

ソース

FormBean の用意

このフォームに対する FormBean を作成します。

FormBean
フォームのパラメータが含まれたクラスのこと、ActionForm を継承して実装される

struts-blank.war には FormBean のサンプルがないようですので他のサンプル にテンプレートとなるクラスを求めます。慣例的に xxxxActionForm というクラス 名になっていますのですぐに分かるとおもいます。どうやら struts-examples.war にある CustomActionForm.java を展開してファイル名、クラス名を変えて使うこと にします。変更後は InputActionForm.java というファイル名にします。

InputActionForm.java

/*
 * Title : InputActionForm.java
 * Desc:
 * Notes:
 * 
 * Create: 2004/12/01 Tantau
 * Update:
 * 
 */
package org.flnet.tantau.lab;

import org.apache.struts.action.*;


/**
 * 入力/更新画面 の ActionForm
 *
 */

public final class InputActionForm extends ActionForm {
    // --------------------------------------------------- Instance Variables
    /**
     * An example String property.
     */
    private String example = "";


    // ----------------------------------------------------------- Properties
    /**
     * Return the example String.
     */
    public String getExample() {

    return (this.example);

    }
    /**
     * Set the example String.
     *
     * @param example The new example String.
     */
    public void setExample(String example) {

        this.example = example;

    }
}

テストの作成

クラスに対してテストを作成します。 いつもどおり仕様を考えます

ただ、このクラスにテストは必要でしょうか? 基本的にプロパティを設定 して実際の getter と setter は Eclipse に作成させるもので、クラス単位 でのテストは必要ないとおもわれます。後でロジックを追加するときにテスト を作成することとしてテストは作成しないでおきます。 (この選択が正しいのかはいまの段階では分かりませんが)

TestInput.java

FormBean の実装

実装といっても Instance Variable でテストで考慮したプロパティを用意 してから Eclipse の getter / setter 作成で作成します。

  

Eclipse で作成したメソットにはコメントが足りませんので追加しておきます

/**
 * @return コース名
 */
public String getCourse() {
    return course;
}

Input.jsp の修正

Struts カスタムタグを利用して最初の Input.jsp で FormBean を使うように 修正してます。サンプルから探してみると validator/registration.jsp がよさそうですのでこれを参考に Input.jsp を書き換えます

画面を表示させると HTTP Status 500 になります。これは struts-config.xml に /Confirm の定義が書いていないためですので正常です。 この段階でとにかく JSP のシンタックスエラーがなくなるようにしてください。

javax.servlet.ServletException: アクション /Input のフォームbean null に 対する定義が見つかりません

できあがった ソース

テストの作成

これから struts-config.xml を修正し、ActionBean を作成するため仕様を 考えてテストを作成します。

テストを作成します。

ただ、StrutsTestCase では struts-config.xml の設定に基づいて画面名や パスのテストはできますが、 /pages/Input.jsp が正常に表示できることは テストできません。しらべてみると Cactus で行うことができそうです。

Type 1: verifying JSP result

とはいいながら ServletTestCase でリダイレクトを行ってエラーとならない ことをテストするというのはいかにも無理やりの感がありますが。

TestInput.java を流用するのがすっきりするとおもいますが TestInput はすでに CactusStrutsTestCase を継承していてServletTestCaseを継承させることができません ので別のテストクラスを作成します。

新規作成->クラスでクラス作成ウィザードを起動します

ソースフォルダlab/lab/WEB-INF/src
パッケージorg.flnet.tantau.lab
名前TestInputPage
スーパークラスorg.apache.cactus.ServletTestCase
メソッド・スタブすべてなし

TestInputPage.java

public class TestInputPage extends ServletTestCase {
   // --------------------------------------------------------- Instance Variables
   // --------------------------------------------------------- Constructor
   //---------------------------------------------------------- Properties
   // --------------------------------------------------------- Methods
   /**
    * 入力画面が表示されるかをテスト
    */
   public void testStart() throws ServletException, IOException {
       RequestDispatcher rd = config.getServletContext().
       // テストするリクエストのパス
       getRequestDispatcher("/pages/Input.jsp");
       // アクションを呼び出す
       rd.forward(request, response);
   }
   public void endStart(WebResponse theResponse) {
       // エラーがないことだけを確認するためチェックなし
       
   }
}

struts-config.xml の修正

struts-blank.war 内の struts-config.xml には もともと以下のようなエントリがあります。

<action
   path="/InputSubmit"
   type="app.InputAction"
   name="inputForm"
   scope="request"
   validate="true"
   input="/pages/Input.jsp"/>

これをコメントの外に出してから書き換えます。このときそれぞれの属性を ドキュメントで調べます。

4.7 ActionMapping Implementation に載っているようです。

pathアクションに対するアプリケーションの相対パスForm の action="" に書かれているパス
typeこのマッピングによって使用される Action クラスの完全修飾名ボタンを押したときに実行されるクラス
nameFormBean の名前上で作成した FormBean の修飾されていないクラス名(と大抵は同じ)
scopeよくわからないので変えない
validatetrue だと validator を使用する
inputこのアクションマッピングを使用する jsp ファイルのパス

<action
   path="/Confirm"
   type="org.flnet.tantau.lab.ConfirmAction"
   name="InputActionForm"
   scope="request"
   validate="false"
   input="/pages/Input.jsp"/>

あと、以下の記述もあり、InputActionForm の設定も必要のようです。

<!-- sample form bean descriptor for an ActionForm
    <form-bean
        name="inputForm"
        type="app.InputForm"/>
end sample -->

こんな感じでしょうか。

<form-bean
    name="InputActionForm"
    type="org.flnet.tantau.lab.InputActionForm"/>

テストを実行して fail することを確認します。

Action クラスの作成

Action クラスである ConfirmAction クラスも作成します。チェックはしないので すから必ず成功するはずです。そんなクラスを探していたら struts-examples.war に SuccessAction.java というクラスを見つけました。まずはこれがそのまま使え そうです。

新規作成->クラスでクラス作成ウィザードを起動します

ソースフォルダlab/lab/WEB-INF/src
パッケージorg.flnet.tantau.lab
名前ConfirmAction
スーパークラスorg.apache.struts.action.Action
メソッド・スタブすべてなし

名前などを変えながらクラスを作成します。

できあがった ConfirmAction.java

テスト

テストを実行してみると testSccess() で以下のようなエラーがでていました。

junit.framework.AssertionFailedError: Cannot find forward 'success'  - it is possible that it is not mapped correctly.
at servletunit.struts.Common.verifyForwardPath(Common.java:284)
at servletunit.struts.CactusStrutsTestCase.verifyForward(CactusStrutsTestCase.java:493)
at org.flnet.tantau.testlab.TestInput.testSuccess(TestInput.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

パスが間違っているということですね。パスは struts-config.xml に 定義しますので struts-config.xml に定義をしていないのが原因でしょう。

struts-config.xml への定義方法を探します。そういえば以前以下の記述がありました。

<action path="/Input"
        type="org.flnet.tantau.lab.InputAction">
        <forward name="input" path="/pages/Input.jsp"/>
</action>

これを応用して以下のように設定しました。

<action
    path="/Confirm"
    type="org.flnet.tantau.lab.ConfirmAction"
    name="InputActionForm"
    scope="request"
    validate="true"
    input="/pages/Input.jsp">
    <forward name="success" path="/pages/Confirm.jsp"/>
    <forward name="fail" path="/pages/Input.jsp"/>
</action>

通ったみたいです。 現在は /pages/Confirm.jsp がないわけですがテストにパスしてしまっています。 この画面のパスは次のフェーズで Cactus テストによって確認することにしましょう。

できあがった struts-config.xml

関連書籍

関連リンク



Return to TOP