入力・更新画面に Validator を適用


入力・更新画面に Validator を適用

入力チェックのために Validator を使うように変更してみます。Validator を 使うためには ActionForm で validate() を使う方法もありますが、ここでは そこまで難しいチェックをしたいのではないので validation.xml に記述する 方法を使ってみます。

ActionFormBean の書き換え

ActionFormBean の継承元を ActionForm から ValidatorForm に書き換えます。

import org.apache.struts.validator.ValidatorForm;
/**
 * 入力/更新画面 の ActionForm
 *
 */
public final class InputActionForm extends ValidatorForm {

validation.xml の書き換え

example form の部分を書き換えて InputActionForm 用のルールを記述します。 name は struts-config.xml の <form-bean> の name にあわせます。 course と division は後で選択形式に変更するため validation 対象に含めていません。

struts-config.xml

<form-beans>
    <form-bean
        name="InputActionForm" <--- これにあわせます
        type="org.flnet.tantau.lab.InputActionForm"/>

validation.xml

<!-- Input/Update form -->
<form name="InputActionForm">  <--- form-bean と同じ name にします
 <field property="name" depends="required, maxlength">
   <arg0 key="input.name.displayname" />
   <arg1 key="${var:maxlength}" name="maxlength" />
   <var>
     <var-name>maxlength</var-name>
     <var-value>30</var-value>
   </var> 
 </field>
 <field property="mailaddress" depends="required, maxlength, email">
   <arg0 key="input.mailaddress.displayname" />
   <arg1 key="${var:maxlength}" name="maxlength" />
   <var>
     <var-name>maxlength</var-name>
     <var-value>40</var-value>
   </var> 
 </field>
</form>

他の標準 Valiation についてはStandard Built In Validationsを参照してください
dependsrequired必須項目
maxlength最大長
emailメールアドレスフォーマット

上記の Validation 名はエラーメッセージを MessageResources.properties から取得するときに も使われます。デフォルトでは英語表記になっているので日本語に書き換えておきましょう。

MessageResources.properties

errors.maxlength=={0}は{1}文字以内で入力してください。
errors.required={0}は必ず入力してください。
errors.email={0}はメールアドレスを入力してください。

{0} は arg0 と置き換えられます。つまり MessageResources.properties の input.name.displayname と input.mailaddress.displayname が対応します。 {1} は arg1 と置き換えられます。 たとえば maxlength を超えていたら以下のようにメッセージが表示されます。

名前は40文字以内で入力してください。

JavaScript でチェックすることでサーバに余計な負荷をかけずに入力をチェックする ことができます。とはいえ JavaScript はブラウザの設定で簡単に OFF にできるため サーバ側のチェックを省略することはできませんでした。Struts などの Framework が登場する前は両方手動でコーディングしていたのですが Struts では validation.xml に記述しておけばクライアントサイドとサーバサイドのチェックルーチンを自動的に 作成してくれるため非常に便利です。これだけのために Struts を使う価値がある といえるでしょう。

JSP に生成する JavaScript の場所を指定します。<html:errors/> はエラーメッセージ と置き換わります。

<html:javascript> の formName は struts-config.xml に記述した <form-bean> と同じ name にします

Input.jsp

<h1 class="header"><bean:message key="input.title"/></h1>

<logic:messagesPresent>
 <html:errors/>
</logic:messagesPresent>

<html:javascript formName="InputActionForm" /> <--- form-bean と同じ name にします

<%
/*************************************************************************
 * フォーム
 ************************************************************************/
%>
<html:form action="/Confirm" onsubmit="return validateInputActionForm(this);">
       onsubmit を追加します ~~~~~~~~~~~~~~~~~ validate + formName を呼び出します
<bean:define id="in" name="InputActionForm" />

また、struts-config.xml での validate プロパティが true になっているか確認 しておきましょう。

struts-config.xml

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

maxlength について

いささかしつこいようですが、SQLServer2000 における character データタイプ と文字数の注意事項です。maxlength validator は Java の String.length() メソットを使ってチェックしています。Java の String.length() は文字数を返す メソットのため2バイト文字に対して実行するとバイト数の半分が返ります。 一方 SQLServer2000 では言語を日本語にしたとしても char データタイプ は文字数ではなくバイト数で長さを指定するためカラムの長さを 2倍見積もって おかなければならないでしょう。 PostgreSQL 7.x の場合は char がバイト数ではなく、文字数をあらわすため 同じ数値を使うことができます。 このような微妙な条件を調査するためにソースがあることは非常に重要です。 Struts 1.2.4 では commons validatorのGenericValidator.maxLength() メソット を使ってチェックしているようです。GenericValidator.maxLength() メソットは String.length() によって長さを得ていることが分かります。このあたりを テストのみで調査するのは非常に手間がかかるものです。

テストの作成

StrutsTestSuite ではこの種のテストが一番書きやすいでしょう。 テストケースとしては以下のようなものがあるでしょう。

同様に mailaddress のチェックも行いますが以下が追加になります。

これらを TestInput.java に追加してテストします。

TestInput.java

関連書籍

関連リンク

ValidatorForm/ValidatorActionForm



Return to TOP