Struts中Validator验证框架简单示例
- 格式:pdf
- 大小:661.73 KB
- 文档页数:7
《Struts1.x系列教程(10):Validator验证框架入门》一文中给出的例子中的name、age和email都是简单的属性,如果是嵌套的属性(也就是一个属性的数据类型是另外一个带有属性的类),可以使用圆点(.)符号来访问。
如我们可以通过设置<field>元素的 property属性值为“employee.salary”来验证employee属性中的salary属性。
如果要验证的索引属性,我们可以使用<field>元素的indexedListProperty属性来指定这个索引属性,如下面代码如示:<field indexedListProperty="items" depends=></field>在使用上述配置代码后,Validator框架将会按着depends属性中的约束来验证items属性的每一个值。
我们还可以将property和 indexedListProperty 配合使用,如下面代码所示:<field indexedListProperty="items" property="employee.age" depends=></field>Validator框架将根据上述的配置代码来验证items属性中的每一项的employee.age属性。
二、使用常量和变量1. 常量在《Struts1.x系列教程(10):Validator验证框架入门》一文中的name 属性使用了mask进行验证。
这个mask实际上代表了一个正则表达式。
但如果在validator.xml文件中有很多个地方需要用到这个正则表达式,那就它就会在很多地方重复。
为此,我们可以使用常量来避免这种事情发生。
常量分为全局常量和局部常量。
(1)全局常量全局常量可以被用在validator.xml中定义的所有form中。
在Struts 2.0中实现表单数据校验(Validation)/max/category/16130.htmlAll Input Is Evil!-Writing secure code在写前几篇文章的时候,有些朋友建议我的写一篇关于表单数据校验的文章。
正如文章的开头所引用的《Writing Secure Code》的名言:“所有的输入都是罪恶的”,所以我们应该对所有的外部输入进行校验。
而表单是应用程序最简单的入口,对其传进来的数据,我们必须进行校验。
转换与校验(Conversion & Validation)其实上篇文章,我本来是打算写表单数据校验的内容,但是经过再三思考后,还是决定先写Struts 2.0转换器的内容。
原因是我认为转换是校验的基础,只有在数据被正确地转换成其对应的类型后,我们才可以对其取值范围进行校验。
看个例子相信大家可以更清楚。
现在我们就来改造一下《转换器(Converter)——Struts 2.0中的魔术师》的第一个例子。
首先,从Action开始,修改后的代码如下:package tutorial;import java.util.Locale;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.util.LocalizedTextUtil;public class HelloWorld extends ActionSupport {private String msg;private Locale loc = ;public String getMsg() {return msg;}public Locale getLoc() {return loc;}public void setLoc(Locale loc) {this .loc = loc;}@Overridepublic void validate() {System.out.println( " Calling validate() " );if ( ! (loc.equals() || loc.equals(Locale.CHINA))) {addFieldError( " loc " , getText( " validation.loc " ));}}public void validateExecute() {System.out.println( " Calling validateExecute() by reflection " );}@Overridepublic String execute() {System.out.println( " Calling execute() " );//LocalizedTextUtil是Struts 2.0中国际化的工具类,<s:text>标志就是通过调用它实现国际化的msg = LocalizedTextUtil.findDefaultText( " HelloWorld " , loc);return SUCCESS;}}然后,修改Struts.xml中Action的定义指明输入地址:<action name="HelloWorld"class="tutorial.HelloWorld"><result> /HelloWorld.jsp </result><result name="input"> /HelloWorld.jsp </result></action>接着,在HelloWorld.jsp中加入错误提示:<% @ page contentType = " text/html; charset=UTF-8 " %><% @taglib prefix = " s " uri = " /struts-tags " %><html><head><title> Hello World </title></head><body><div style="color:red;"><s:fielderror /></div><s:form action="HelloWorld"theme="simple">Locale: <s:textfield name="loc"/> <s:submit /></s:form><h2><s:property value="msg"/></h2></body></html>再修改LocaleConverter.java文件,将内容改为:package tutorial;import java.util.Locale;import java.util.Map;import java.util.regex.Pattern;public class LocaleConverter extends ognl.DefaultTypeConverter {@Overridepublic Object convertValue(Map context, Object value, Class toType) {if (toType == Locale. class ) {System.out.println( " Converting String to Locale " );String locale = ((String[]) value)[ 0 ];return new Locale(locale.substring( 0 , 2 ), locale.substring( 3 ));} else if (toType == String. class ) {System.out.println( " Converting Locale to String " );Locale locale = (Locale) value;return locale.toString();}return null ;}}之后,修改国际化资源文件,内容为:HelloWorld = 你好,世界!invalid.fieldvalue.loc = Locale必须为\ " xx_XX\ " 的格式validation.loc = 区域必须为中国或美国globalMessages_zh_CN.propertiesHelloWorld = Hello World!invalid.fieldvalue.loc = Locale must like \ " xx_XX\ "validation.loc = Locale must be China or USAglobalMessages_en_US.properties发布运行应用程序,在浏览器中键入LocaleConverting String to Locale...Calling validateExecute() by reflection...Calling validate()...Calling execute()...Converting Locale to String...上述的输出说明了Struts 2.0的数据校验工作方式,它需要经过下面几个步骤:1.通过转换器将请求参数转换成相应的Bean属性;2.判断转换过程是否出现异常。
STRUTS+validate+配置简介STRUTS validate 配置简介一、验证字段不为空先从一个简单的验证字段hh(户号)不为空的例子入手:Step 1 建立FormBean:要使FormBean有自动验证功能,首先要建立一个继承于ValidatorForm的FormBean。
Step 2 修改配置文件struts-config.xml:加入FormBean配置信息:加入Action配置信息,加入validate="true"属性,实现服务器端FormBean 中自动验证,加入input属性,当出现验证错误时struts 会跳转到input对应的url 显示错误:Step 3 修改配置文件validation.xml:在validation.xml文件中加入要验证的字段信息,和要采用的验证规则:在form标记的name属性中写入FormBean类名。
field标记中,property属性写入要验证的字段名称(与FormBean中的变量同名)。
depends属性required 值表示不能为空。
arg0标记表示输出的错误信息字符串中{0}占位符用bel对应的字符串来代替(见setp 4 配置)。
Step 4 建立ApplicationResources.properties 资源文件:内容如下:当验证器发现depends属性中required的验证出现错误时(也就是出现为空的错误),他会用bel对应的字符串“户号”,来代替e rrors.required(验证器默认的为空验证的错误字段)错误字符串中的{0}占位符,也就是step3中的arg0标记设置的作用。
Step 5 将ApplicationResources.properties中的字符转化为ascii格式:我们可以应用JDK中提供的工具来实现转化,在命令行中输入native2ascii -encoding GBK d:\ApplicationResources.properties >d:\ApplicationRe sources_zh_CN.properties假设资源文件被放置在d:\下。
Struts2验证框架的基本用法防止不正确或不符合业务需求的数据进入应用程序是必不可少的,服务器端的验证是防止不正确的数据进入应用程序之前的最后一道屏障。
在真实的业务逻辑被调用之前,应验证用户提交的数据是否满足需求,若数据不符合需求,应告知用户发生了什么错误及如何修正输入。
示例:validator,利用Struts2的验证框架在服务器端验证用户的输入。
●效果:●实现步骤(1)完成index.jsp → register →show.jsp(2)为register添加验证规则,在StudentAction同包下创建名为:StudentAction-register-validation.xml的配置文件,struts2的验证框架会自动读取该文件中定义的验证规则进行校验工作。
其中register是action的名称,若Action类中仅有名为execute的默认执行方法,则该文件命名模式为:Action类名-validation.xml。
其中,DOCTYPE的定义代码可到xwork-core-x.x.x.jar包中的xwork-validator-x.x.x.dtd 文档中去复制。
requiredstring :必填字符串>0stringlength :检查字符串长度是否在指定的范围内,其范围使用<param>来指定maxLength和minLength。
int :检查整数是否在指定的范围内,其范围使用<param>来指定min和max值。
date :检查日期是否在指定的范围内,其范围使用<param>来指定min和max值。
【注】类型转换在验证框架之前进行!(3)为register增加一个名为input的result定义,该result代表了验证框架验证失败后的转向页面,一般是返回至之前的表单页。
课堂练习:自己动手实现validator示例,体会struts2验证框架的一般用法。
1.1Struts Validator验证器应用示例(第1部分)1.1.1在Eclipse中实现Validator验证器应用示例-----构建出项目中的ActionForm和Action类1、在项目中新建validatorPage目录2、在该目录下新增加一个实现用户登陆的页面validatorUserLogin.jsp设计其内容<%@ page language="java" pageEncoding="gb2312"%><%@ taglib uri="/tags-bean" prefix="bean" %> <%@ taglib uri="/tags-html" prefix="html" %> <%@ taglib uri="/tags-logic" prefix="logic" %><%@ taglib uri="/tags-tiles" prefix="tiles" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html:html lang="true"><head><html:base /><title><bean:message key="strutsweb.title"/></title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"></head><body><html:form action="/validatorUserInfoURL.do?action=goUserLogin" method="post" > <html:hidden property="formType" value="1"/><table border="0"><tr><td><bean:message key="ername"/></td><td><html:text property="userName" /></td></tr><tr><td><bean:message key="erpassword"/></td><td><html:password property="userPassWord" /></td></tr><tr><td colspan="2" align="center"><html:submit ><bean:message key="strutsweb.login.submitbutton"/></html:submit></td></tr></table></html:form></body></html:html>3、为该页面提供对应的ActionForm组件(1)validatorUserInfoActionForm、org.apache.struts.validator.ValidatorForm、包名称和类名称为com.px1987.sshproject.form.ValidatorUserInfoActionForm并添加各个属性private String userName;private String userImage;private String departAdminLevel;private String userPassWord;private String confirmPassWord;private String userAdminLevel;private String userDepartment;private String formType;(2)并除掉下面的两个方法(validate和reset)将自动地产生出下面的配置项目并且产生出下面的代码package com.px1987.sshproject.form;import org.apache.struts.validator.ValidatorForm;public class ValidatorUserInfoActionForm extends ValidatorForm { private String userName;private String userImage;private String userPassWord;private String departAdminLevel;private String formType;private String confirmPassWord;private String userAdminLevel;private String userDepartment;public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}public String getUserImage() {return userImage;}public void setUserImage(String userImage) {erImage = userImage;}public String getUserPassWord() {return userPassWord;}public void setUserPassWord(String userPassWord) { erPassWord = userPassWord;}public String getDepartAdminLevel() {return departAdminLevel;}public void setDepartAdminLevel(String departAdminLevel) { this.departAdminLevel = departAdminLevel;}public String getFormType() {return formType;}public void setFormType(String formType) {this.formType = formType;}public String getConfirmPassWord() {return confirmPassWord;}public void setConfirmPassWord(String confirmPassWord) {this.confirmPassWord = confirmPassWord;}public String getUserAdminLevel() {return userAdminLevel;}public void setUserAdminLevel(String userAdminLevel) {erAdminLevel = userAdminLevel;}public String getUserDepartment() {return userDepartment;}public void setUserDepartment(String userDepartment) {erDepartment = userDepartment;}}注意:1)这个类不提供ActionForm的reset( )和validate( )方法的实施过程,因为ValidatorForm提供了相应过程;2)如果写了validate( )这个方法,就会屏蔽掉在Validation.xml中定义的验证部分,换句话说就是系统运行时,Validation.xml里对应此ActionForm的定义的错误验证部分不实行。
struts-1.2的效验问题(框架验证)1.⾸先在stuts-config中配置,加⼊下⾯。
<plug-in className="org.apache.struts.validator.ValidatorPlugIn"><set-property property="pathnames"value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" /></plug-in>value值是validator-rules.xml和validation.xml⽂件的路径2.同时actionform继承ValidatorActionForm3.在资源⽂件中写好键值,同时资源⽂件放在hibernate.xml同级⽬录即src下⾯并在struts-config中配置如下<message-resources parameter="ApplicationResources" />4.配置validation.xml⽂件<form-validation><formset><form name="/login"><field property="email" depends="required"><arg0 key="user.email" /></field><field property="password" depends="required"><arg0 key="user.password" /></field></form></formset></form-validation>其中 <form name="/login">对应需要验证的form对应的action,要提交表单的那个action。
Action配置中一定要设置input返回页面添加验证只要创建验证的xml文件1.创建xml文件名验证Action中全部方法在Action同包下,创建:Action类名-validation.xml如:ValidateAction创建ValidateAction-validation.xml验证Action中单个方法<!-- 每个方法单独配置一个Action --><!-- 在Action同包下,创建:Action类名-action方法配置名称-validation.xml --><action name="validateAdd"class="com.struts2.validator.ValidateAction" method="add"><!-- 要创建ValidateAction-validateAdd-validation.xml --><!-- 使用通配符配置 --><!-- 在Action同包下,创建:Action类名-action方法对应的名称-validation.xml --><action name="validate_*"class="com.struts2.validator.ValidateAction" method="{1}"><!-- 要创建ValidateAction-validate_add-validation.xml,validate_add为访问这个action方法的路径 -->注意事项注意:1.要验证的方法不能叫input.2.这样配置在form表单中要在<s:form action="validate_add">中action写好名称,不能写action="validate_",然后<s:submit value="提交"method="add"/>这样会找不到对应的配置文件,跳过验证.3.如果验证出错,返回input页面时,那些存在ValueStack中的值会丢失,可以将Action实现Preparable接口,然后prepare()方法里初始化添加页面需要的值.4.如果使用Preparable接口,必须在action配置中添加<interceptor-refname="paramsPrepareParamsStack"/>.这样prepare()才能得到form提交的参数.2.创建xml内容<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator1.0.2//EN" "/xwork/xwork-validator-1.0.2.dtd"><validators><!-- 要验证的字段名称 --><!-- 要验证Action中UserBean的id字段,name="userBean.id"(userBean为Action中的变量名) --><field name="mail"><!-- type要验证的类型,short-circuit(默认false),true含义,如果当前验证失败了,下面的验证就不执行了.如requiredstring失败了,email就不验证了. --><!-- field-validator下面可以有多个param元素,但是最多只能有一个message --><field-validator type="requiredstring"><param name="trim">true</param><message>Please enter a mail</message></field-validator><field-validator type="email"><message>Invalid MAIL</message></field-validator></field></validators>Struts内建验证程序(type的值)required保证字段的值不是空值null.空字符串不是空值null.<field name="userName"><field-validator type="required"><message>Please enter a user name</message></field-validator></field>requiredstring保证字段不是空值null,也不是空白(empty).param:trim(boolean) ->true->去除前后空格<field name="userName"><field-validator type="requiredstring"><param name="trim">true</param><message>Please enter a user name</message></field-validator></field><field name="password"><field-validator type="requiredstring"><param name="trim">false</param><message>Please enter a password</message> </field-validator></field>int验证字段值是否可以转换为一个整数.param: min(int);max(int)<field name="yeaar"><field-validator type="int"><param name="min">1999</param><param name="max">2010</param><message>year:1999-2010</message></field-validator></field>date验证给定日期字段的值是否在一个给定的范围内.param:max(date);min(date)<field name="borthday"><field-validator type="int"><!-- 格式取决于当前地理时区 --><param name="min">1999-01-01</param><param name="max">2010-01-01</param><message>birthday:1999-2010</message> </field-validator></field>email给定的String值是否是一个电子邮件地址<field name="email"><field-validator type="email"><message>Invalid email</message></field-validator></field>url给定的String值是否是一个合法的URL(要有前缀)<field name="url"><field-validator type="url"><message>Invalid URL</message></field-validator></field>expression,fieldexpression验证给定字段是否满足一个OGNL表达式.区别:expression 不是一个字段验证程序,失败时将生成一个动作错误.(JSP中调用<actionerror></actionerror>才显示出错信息)fieldexpression 是一个字段验证程序,失败时将抛出一个字段错误.(对字段验证) param:expression(String)OGNL表达式expression:public class ExpressionTestAction{//属性生成get,setprivate int min;private int max;}<validator type="expression"><param name="expression">max > min</param><message>Maximum temperature must be greater than Minimum temperature </message></validator><!-- jsp --><s:actionerror/>fieldexpression:public class FieldExpressionTestAction{//属性生成get,setprivate int min;private int max;}<!--对字段验证--><field name="max"><field-validator type="fieldexpression"><param name="expression">max > min</param><message>Maximum temperature must be greater than Minimum temperature</message></field-validator></field>visitor把同一个验证程序配置文件用于多个动作(对一个Bean写验证文件,每个使用的Action只要引用)//UserBeanpublic class UserBean{//属性get,setprivate String name;private int age;}//UserBean-validation.xml(和UserBean放在同一个包中)<field name="name"><field-validator type="requiredstring"><message>用户名必须</message></field-validator></field><field name="age"><field-validator type="int"><param name="min">18</param><param name="max">99</param><message>Age must be between 18and99</message></field-validator></field>//Action的validation.xml<!-- userBean变量名--><field name="userBean"><field-validator type="visitor"><!-- message会和UserBean验证中的message一起显示--><message>用户:</message></field-validator></field>如果另一个Action对UserBean使用另一个标准的验证,可以创建新的验证文件//UserBean-specific-validation.xml<!--和之前的验证不同--><field name="age"><field-validator type="int"><param name="min">30</param><param name="max">50</param><message>Age must be between 30and50</message></field-validator></field>//另一个Action的validation.xml<field name="userBean"><field-validator type="visitor"><!-- xml中扩展的名字,执行UserBean-specific-validation.xml的验证--><param name="context">specific</param><message>用户1: </message></field-validator></field>conversion检查对某个属性进行类型转换是否会导致一个转换错误<field name="age"><field-validator type="conversion"><message>An age must be an integer.</message></field-validator></field>stringlength验证一个非空的字段值是不是足够的长度param:minLength(int);maxLength(int);trim(boolean)<field name="password"><field-validator type="requiredstring"><param name="minLength">6</param><param name="maxLength">14</param><message>length:6-14</message></field-validator></field>regex给定的值是否与一个给定的正则表达式匹配param:expression(String)正则表达式;caseSensitive(boolean)是否区别大小写,默认为true;trim(boolean)是否去除前后空格<field name="phone"><field-validator type="regex"><param name="expression"><![CDATA[\d\d\d\-\d\d\d\-\d\d\d\d]]></param><message>Invalid phone number or invalid format</message></field-validator></field>3.在action中验证利用Validateable接口实现验证,实现void validate()方法.ActionSupport类已经实现了这个接口//继承ActionSupportpublic class User extends ActionSupport{//属性get,setprivate String userName;private String password;private static List<String> userNames =new ArrayList<String>();static{userNames.add("harry");userNames.add("sally");}//验证方法public void validate(){if(userNames.contains(userName)){//添加出错信息addFieldError("userName","'"+ userName +"' has been taken.");}}}4.自定义验证类要创建一个普通的验证程序(非字段验证程序),扩展ValidatorSupport类.验证失败要从validate 方法调用addActionError方法.要创建一个字段验证程序,扩展FieldValidatorSupport类.验证失败要从validate方法调用addFieldError方法.如果要能接受参数,要在类中定义一个相应的属性,并生成get,set.编写类public class StrongPasswordValidator extends FieldValidatorSupport{ //属性private int minLength =-1;public void setMinLength(int minLength){this.minLength = minLength;}public int getMinLength(){return minLength;}//验证方法public void validate(Object object)throws ValidationException{ String fieldName = getFieldName();String value =(String) getFieldValue(fieldName,object);if(value ==null|| value.length()<=0){// use a required validator for thesereturn;}if((minLength >-1)&&(value.length()< minLength)){addFieldError(fieldName,object);}else if(!isPasswordStrong(value)){addFieldError(fieldName,object);}}private static final String GROUP_1 ="abcdefghijklmnopqrstuvwxyz";private static final String GROUP_2 ="ABCDEFGHIJKLMNOPQRSTUVWXYZ";private static final String GROUP_3 ="0123456789";protected boolean isPasswordStrong(String password){boolean ok1 =false;boolean ok2 =false;boolean ok3 =false;int length = password.length();for(int i =0; i < length; i++){if(ok1 && ok2 && ok3){break;}String character = password.substring(i, i +1);System.out.println("character:"+ character);if(GROUP_1.contains(character)){ok1 =true;continue;}if(GROUP_2.contains(character)){ok2 =true;continue;}if(GROUP_3.contains(character)){ok3 =true;}}return(ok1 && ok2 && ok3);}}注册xml在src下创建validators.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator Config 1.0//EN" "/xwork/xwork-validator-config-1.0.dtd" ><validators><!-- 名称(type对应值),类路径 --><validatorname="strongpassword"class="com.validator.StrongPasswordValidator"/></validators>使用验证<field name="password"><field-validator type="strongpassword"><param name="minLength">8</param><message>Password must be at least 8 characters longand contains at least one lower case character,one upper case character, and a digit.</message></field-validator></field>。
使用Struts2 校验器校验用户注册信息的例子简介:基于验证框架的输入校验一、创建一个struts2项目testValidators。
Struts2初体验:1.jsp页面:注册页,register.jsp:使用<%@tagliburi="/str...基于验证框架的输入校验一、创建一个struts2项目testValidators。
Struts2 初体验:1.jsp页面:注册页,register.jsp:使用<%@ taglib uri="/struts-tags" prefix="s"%>加载struts2标签库。
使用<s:fielderror/>标签输出相应的字段错误信息,fieldName属性为出错字段的名字。
注册成功页,success.jsp2.RegisterAction类。
需要校验的字段必需在类中提供相应的字段和相应的get,set方法。
3.strruts2配置文件,struts.xml:添加name为input的result标签,校验失败时struts2会自动把页面转到名为"input"的页面中二、编写校验器配置文件1. 命名规则:action类名-validation.xml.2. 一个action对应多个逻辑处理方法:指定校验某个特定方法的方式:action类名-name 属性值-validation.xml.(name属性名:在strtus配置文件中对应的action 标签的name 属性值)3. 配置文件存放位置:放在与Action相同的文件夹内。
4. 验证规则:先加载action类名-validation.xml,然后加载action类名-name属性名-validation.xml文件。
校验器配置文件,RegisterAction-register-validation.xml:上面写法为字段校验风格:先指定校验的属性:我来校验谁,由谁来校验!下面是非字段校验风格:先指定校验器:由谁来校验,来校验谁!struts2提供了大量的内置校验器:你可以在xwork-core-2.1.6.jar的com.opensymphony.xwork2.validator.validators下找到如下配置文件:default.xml。