入力チェックのために Validator を使うように変更してみます。Validator を 使うためには ActionForm で validate() を使う方法もありますが、ここでは そこまで難しいチェックをしたいのではないので validation.xml に記述する 方法を使ってみます。
ActionFormBean の継承元を ActionForm から ValidatorForm に書き換えます。
import org.apache.struts.validator.ValidatorForm; /** * 入力/更新画面 の ActionForm * */ public final class InputActionForm extends ValidatorForm {
example form の部分を書き換えて InputActionForm 用のルールを記述します。 name は struts-config.xml の <form-bean> の name にあわせます。 course と division は後で選択形式に変更するため validation 対象に含めていません。
<form-beans> <form-bean name="InputActionForm" <--- これにあわせます type="org.flnet.tantau.lab.InputActionForm"/>
<!-- 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>
depends | required | 必須項目 |
maxlength | 最大長 | |
メールアドレスフォーマット |
上記の Validation 名はエラーメッセージを 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 に追加してテストします。
ValidatorForm/ValidatorActionForm