目次 > 第2章 Server(Web)版チュートリアル > 2.9 入力チェック(相関) > 2.9.1 相関チェックの設定
2.9.1 相関チェックの設定
相関チェックのチェック処理は相関チェッククラスに実装する。作成した相関チェッククラスをバリデーション設定ファイルに定義することで、サーバー側で相関チェックを実施することができる。
本項では、相関チェッククラスの実装方法と、バリデーション設定ファイルの記述方法について説明する。
手順
本項では以下の作業が必要になる。
(1) 相関チェッククラスの作成
チェック処理を実装するクラスを作成する。
- “terasoluna-spring-thin-blank\sources”を右クリックする。
- 「新規」→「クラス」を選択する。
- 以下の通り入力し、「終了」ボタンを押下する。
- パッケージ:jp.terasoluna.thin.tutorial.web.usermanager.form
- 名前:AgeValidator
- インターフェース:jp.terasoluna.fw.web.struts.form.MultiFieldValidator
- 生成されたAgeValidatorクラスを以下のように編集する。
package jp.terasoluna.thin.tutorial.web.usermanager.form; import java.text.SimpleDateFormat; import jp.terasoluna.fw.util.DateUtil; import jp.terasoluna.fw.web.struts.form.MultiFieldValidator; /** * 入力された年齢と、生年月日の相関入力チェックを行う。 * */ public class AgeValidator implements MultiFieldValidator { /** * 入力された年齢と、生年月日の相関入力チェックを行う。 * * @param birth 生年月日 * @param fields 関連する入力フィールド値 * @return チェック結果 */ public boolean validate(String birth, String[] fields) { String age = fields[0]; if (birth == null || "".equals(birth)) { return true; } return checkBirthAndAge(birth, Integer.parseInt(age)); } /** * 入力された生年月日から計算した年齢と入力された年齢を比較する。 * 同一の場合はtrueを返却、異なっている場合は、falseを返却する。 * * @param birth 入力された誕生日 * @param age 入力された年齢 * @return 比較結果 */ private boolean checkBirthAndAge(String birth, int age) { //現在日付の取得 SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); String temp = format.format(DateUtil.getSystemTime()); //年月日を配列に変換。 String[] old = birth.split("/"); String[] now = temp.split("/"); //単純に現在の年から、入力された年を引く。 int minus = Integer.parseInt(now[0]) - Integer.parseInt(old[0]); //入力された月が現在の月以下の場合、且つ //入力された日が現在の日よりも小さい場合は、マイナス1する。 if ((Integer.parseInt(now[1]) < Integer.parseInt(old[1])) || (Integer.parseInt(now[1]) == Integer.parseInt(old[1]) && Integer.parseInt(now[2]) < Integer.parseInt(old[2]))) { minus--; } //入力された年齢と比較する。 if (age == minus) { return true; } return false; } }
相関チェッククラスは、必ずMultiFieldValidatorインタフェースを実装する。
(2) メッセージリソースファイルの編集
入力チェックのエラーメッセージで利用するメッセージを設定する。
- “terasoluna-spring-thin-blank\sources\application-messages.properties”を開き、以下のメッセージを追加する。
errors.multiField=[{0}]から計算した[{1}]が入力された[{1}]と一致しません。
(3) バリデーション設定ファイルの編集
入力チェックの定義を設定する。
- “terasoluna-spring-thin-blank\webapps\WEB-INF\userManager\validation-userManager.xml”を開き、以下の箇所に設定を追加する。
<form-validation> <formset> <!-- 登録情報確認 --> <form name="/userManager/insertBL"> ・・・略・・・ <field property="birth" depends="multiField"> <msg key="errors.multiField" name="multiField"/> <arg key="insert.birth" position="0" /> <arg key="insert.age" position="1" /> <var> <var-name>fields</var-name> <var-value>age</var-value> </var> <var> <var-name>multiFieldValidator</var-name> <var-value> jp.terasoluna.thin.tutorial.web.usermanager.form.AgeValidator </var-value> </var> </field> </form> </formset> </form-validation>
(4) Struts設定ファイルの編集
相関チェックはサーバー側でのチェックとなるため、アクション設定に入力チェックを実施する設定を追加する。
- “terasoluna-spring-thin-blank\webapps\WEB-INF\userManager\struts-userManager-config.xml”を開き、validate属性とinput属性を追加する。
<!-- ======================================== アクションマッピング定義 --> <action-mappings type="jp.terasoluna.fw.web.struts.action.ActionMappingEx"> ・・・略・・・ <!-- 登録処理用アクション --> <action path="/userManager/insertBL" name="_userManagerForm" scope="session" validate="true" input="/userManager/insertSCR.do"> <forward name="success" path="/userManager/resultSCR.do" /> <forward name="failure" path="/userManager/insertSCR.do" /> </action> ・・・略・・・ </action-mappings>