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の倍数にしてください。
動作確認
アノテーションによる検証の確認
名前と給料欄が未入力の時のエラーメッセージが表示される。
検証メソッドによる動作の確認
給料入力値が3の倍数でない場合にエラーメッセージが表示される。
クライアントサイドバリデータ
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>