Validateの例


seasarのSuper Agile Struts - Feature Referenceを参考に 新しいアクションの追加で作成した exsample1に、Validateの機能を追加してみる。
メッセージリソースも修正するので、ついでにJSPページの表示項目名もメッセージリソースから取得するよう修正した。

入力ページの修正

入力ページindex.jspをsrc/main/webapp/WEB-INF/view/exsample3にコピーし<html:errors>タグを追加する。

<%@page pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>exsample3入力フォーム</title>
</head>
<body>
<h1>exsample3入力フォーム</h1>
バリデータの追加
<hr />
<html:errors />
<s:form>
	<table>
		<tr>
			<td><bean:message key="labels.name" /></td>
			<td><html:text property="name" /></td>
		</tr>
		<tr>
			<td><bean:message key="labels.departmentName" /></td>
			<td><html:select property="departmentName">
				<html:option value="営業">営業</html:option>
				<html:option value="開発">開発</html:option>
				<html:option value="製造">製造</html:option>
			</html:select></td>
		</tr>
		<tr>
			<td><bean:message key="labels.salary" /></td>
			<td><html:text property="salary" /></td>
		</tr>
	</table>
	<input type="submit" name="result" value="送信" />
</s:form>
</body>
</html>

Formの修正

mySAStruts.form.Exsample1FormクラスをExsample1Formクラスにコピーして以下のソースの10,12,14,15,18,19,20~26行の部分を追加。
nameプロパティとsalaryプロパティは必須入力,salaryプロパティはInteger型のチェックをおこなうようにした。
注意すべき点としてsalaryプロパティの型そのものはString型のままにしておく。

また、独自の検証メソッドvalidateを追加して、「給料は3の倍数でなければならない」というわけのわからないチェックを追加した。

package mySAStruts.form;

import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.seasar.struts.annotation.IntegerType;
import org.seasar.struts.annotation.Required;

public class Exsample3Form {

	@Required
	public String name;
	@Required
	public String departmentName;
	@Required
	@IntegerType
	public String salary;

	public ActionMessages validate() {
		ActionMessages errors = new ActionMessages();
		int result = Integer.parseInt(salary);
		if (result % 3 != 0) {
			errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
					"errors.custom.salary"));
		}
		return errors;
	}
}

Actionの修正

mySAStrumySAStruts.action.Exsample1FormクラスをExsample3Actionクラスにコピーして、以下のようにソースの20行を修正。
独自の検証メソッドにvalidateを指定,検証結果がNGのときの遷移先にindex.jspを指定。

package mySAStruts.action;

import javax.annotation.Resource;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;

import mySAStruts.form.Exsample3Form;

public class Exsample3Action {

	@ActionForm
	@Resource
    protected Exsample3Form exsample3Form;

    @Execute(validator = false)
	public String index() {
        return "index.jsp";
	}

    @Execute(validate = "validate", input = "index.jsp")
    public String result() {
        return "result.jsp";
    }
}

結果出力ページの修正

結果出力ページresult.jspは特に修正の必要は無いが、salaryに数値フォーマットを適用するよう22行目を修正,index.jspに合わせて表示項目名も、メッセージリソースから取得するようにした。

fmt:formatNumberタグについては@IT:Java TIPS -- JSTLを使って数値データを加工するを, f:numberについては EL式を拡張したSAStrutsタグ-ファンクションは超便利 (2-2) - @ITを参考。

<%@page pageEncoding="UTF-8"%>
<html>
<head>
<title>exsample3出力フォーム</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>exsample3出力フォーム</h1>
バリデータの追加
<hr />
<table border="1">
	<tr>
		<td><bean:message key="labels.name" /></td>
		<td>${f:h(name)}</td>
	</tr>
	<tr>
		<td><bean:message key="labels.departmentName" /></td>
		<td>${f:h(departmentName)}</td>
	</tr>
	<tr>
		<td><bean:message key="labels.salary" /></td>
		<td><fmt:formatNumber value="${f:number(salary, '####')}" pattern="#,###"/></td>
	</tr>
</table>
</body>
</html>

メッセージリソースの修正

メッセージリソース「src/main/resources/application.properties」に、フォームのプロパティに対応した表示名と独自の検証メソッドvalidateで、指定したエラーメッセージを追加。

application.properties

labels.name=Name
labels.departmentName=DepartmentName
labels.salary=Salary
errors.custom.salary=Please make the salary three multiples.

application_ja.properties

labels.name=名前
labels.departmentName=部署
labels.salary=給料
errors.custom.salary=給料は3の倍数にしてください。

動作確認

アノテーションによる検証の確認

名前と給料欄が未入力の時のエラーメッセージが表示される。

SAStruts_ValidateAction1

 

検証メソッドによる動作の確認

給料入力値が3の倍数でない場合にエラーメッセージが表示される。

SAStruts_ValidateAction2

クライアントサイドバリデータ

JavaScriptを使ったクライアントサイドの検証をおこなうにはindex.jspを以下のように6行目と32行目を修正する。

<%@page pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>exsample1入力フォーム</title>
<html:javascript formName="exsample3ActionForm_result"/>
</head>
<body>
<h1>exsample3入力フォーム</h1>
バリデータの追加
<hr />
<html:errors />
<s:form>
	<table>
		<tr>
			<td><bean:message key="labels.name" /></td>
			<td><html:text property="name" /></td>
		</tr>
		<tr>
			<td><bean:message key="labels.departmentName" /></td>
			<td><html:select property="departmentName">
				<html:option value="営業">営業</html:option>
				<html:option value="開発">開発</html:option>
				<html:option value="製造">製造</html:option>
			</html:select></td>
		</tr>
		<tr>
			<td><bean:message key="labels.salary" /></td>
			<td><html:text property="salary" /></td>
		</tr>
	</table>
	<s:submit property="result" clientValidate="true">送信</s:submit>
</s:form>
</body>
</html>

SAStruts_ValidateAction3

 

ページのトップへ戻る