画面遷移図をみてトップページから遷移される入力/更新画面を作成します。 ここではとりあえずエラーチェックは作成してません。 ひととおり作成した後でValidatorで入力チェックを行うようにします。
Input.jsp を Struts カスタムタグを使用して作成します。 Eclipse で Solar Plugin を導入しているので JSP ファイルは 色が変わりながらタグの閉じ忘れをチェックしながら作成すること ができるでしょう。
作成方針
まずは前の Welcome.jsp をコピーして Input.jsp を作成します。 この段階では実際のフォーム部分は単純な HTML です。 ただ、日本語が入力されるテキストボックスの maxlength 属性は 忘れずに実際に DB の最大長/2を適用しておきます。 そうしないと最大長入力させるとエラーになってしまいます。
MessageResources.properties にメッセージを登録します
# -- Input -- input.title=Windows2000 + WebLogic + SQL Server を利用した Web システム開発 input.heading=入力/更新画面
表示してみます。
このフォームに対する FormBean を作成します。
struts-blank.war には FormBean のサンプルがないようですので他のサンプル にテンプレートとなるクラスを求めます。慣例的に xxxxActionForm というクラス 名になっていますのですぐに分かるとおもいます。どうやら struts-examples.war にある CustomActionForm.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 に作成させるもので、クラス単位 でのテストは必要ないとおもわれます。後でロジックを追加するときにテスト を作成することとしてテストは作成しないでおきます。 (この選択が正しいのかはいまの段階では分かりませんが)
実装といっても Instance Variable でテストで考慮したプロパティを用意 してから Eclipse の getter / setter 作成で作成します。
Eclipse で作成したメソットにはコメントが足りませんので追加しておきます
/**
* @return コース名
*/
public String getCourse() {
return course;
}
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 で行うことができそうです。
とはいいながら ServletTestCase でリダイレクトを行ってエラーとならない ことをテストするというのはいかにも無理やりの感がありますが。
TestInput.java を流用するのがすっきりするとおもいますが TestInput はすでに CactusStrutsTestCase を継承していてServletTestCaseを継承させることができません ので別のテストクラスを作成します。
新規作成->クラスでクラス作成ウィザードを起動します
| ソースフォルダ | lab/lab/WEB-INF/src |
| パッケージ | org.flnet.tantau.lab |
| 名前 | TestInputPage |
| スーパークラス | org.apache.cactus.ServletTestCase |
| メソッド・スタブ | すべてなし |
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-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 クラスの完全修飾名 | ボタンを押したときに実行されるクラス |
| name | FormBean の名前 | 上で作成した FormBean の修飾されていないクラス名(と大抵は同じ) |
| scope | よくわからないので変えない | |
| validate | true だと 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 クラスである 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