struts2--表单校验_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > struts2--表单校验

struts2--表单校验

 2011/11/21 7:54:49  coolxing  http://coolxing.iteye.com  我要评论(0)
  • 摘要:[coolxing按:转载请注明作者和出处,如有谬误,欢迎在评论中指正.]准备工作1.登陆页面的表单:<s:fielderror/><s:formid="loginForm"name="loginForm"method="post"namespace="/validate"action="validateAction_login.action"theme="simple">用户名:<s:textfieldname="username"/><br>
  • 标签:表单 struts

[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]

?

准备工作

1. 登陆页面的表单:

<s:fielderror />
<s:form id="loginForm" name="loginForm" method="post" namespace="/validate" action="validateAction_login.action" theme="simple">
 	用户名: <s:textfield name="username" /><br>
	密&nbsp;&nbsp;码: <s:textfield name="password" /><br>
	年&nbsp;&nbsp;龄: <s:textfield name="age" /><br>
	<s:submit value="login" /><br>
</s:form>

2. 定义校验规则:

用户名不能为null, ?或者空字符串;

密码不能为null或者空字符串, ?密码中只能包含[0-9a-zA-Z], ?不能存在非法字符, ?且长度在6-8位之间;

年龄必须为整型, ?且不能为负数.


采用基本验证的方式校验表单

1. 创建ValidateAction类, ?继承ActionSupport并实现Validateable接口.

public class ValidateAction extends ActionSupport implements Validateable {
	private String username;
	private String password;
	private Integer age;

	public String login() {
		return "success";
	}

	@Override
	public void validate() {
		if (username == null || "".equals(username.trim())) {
			this.addFieldError("username",  "用户名不能为空");
		}
		if (password == null || "".equals(password.trim())) {
			this.addFieldError("password",  "密码不能为空");
		} else if (!password.matches("[0-9a-zA-Z]{6, 8}")) {
			this.addFieldError("password",  "密码的长度应该在6-8位之间");
		}
		if (age < 0 ) {
			this.addFieldError("age",  "年龄不能为负数");
		}
	}
	// 省略getter和setter方法
}

validate()方法在业务方法之前执行. 通过查看底层源代码可以获知, ?this.addFieldError(String fieldName, ?String errorMessage)方法最终将在ValidationAwareSupport类的fieldErrors成员中添加一条记录(fieldErrors是一个Map<String, ?List<String>>集合). validate()方法执行完成之后, ?如果fieldErrors集合中不包含错误信息, ?表示校验通过, ?接下来将执行login方法. 否则表示校验没有通过, ?不再执行login()方法.

默认情况下, ?validate()方法将对所有的业务方法进行验证, ?如果只想验证login()方法, ?将validate()改名为validateLogin()即可.

2. 配置ValidateAction:

<action name="validateAction_*" class="cn.xing.validate.ValidateAction" method="{1}">
	<result name="success">/validate/success.jsp</result>
	<result name="input">/validate/login.jsp</result>
</action>

?

表单校验的执行流程

1. 类型转换器对请求参数执行类型转换, 并把转换后的值赋给action中的属性.?

2. 如果在执行类型转换的过程中出现异常, 系统会将异常信息保存到ActionContext, conversionError拦截器将异常信息封装到fieldErrors里, 然后执行第3步. 如果类型转换没有出现异常, 则直接进入第3步.?

3. 系统通过反射技术调用action中的validateXxx()方法, Xxx为方法名.?

4. 调用action中的validate()方法.?

5. 经过上面4步, 如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0), 系统自动将请求转发至名称为input的视图. 如果系统中的fieldErrors没有任何错误信息, 系统将执行action中的业务方法.?

?

基于XML配置方式实现输入校验

1. 创建Action类, 继承ActionSupport或实现Validateable接口:

public class ValidateXmlAction extends ActionSupport implements Validateable {
	private String username;
	private String password;
	private Integer age;

	public String login() {
		System.out.println("login");
		return "success";
	}

	// 省略getter和setter方法
}

2. 配置ValidateXmlAction:

<action name="validateXmlAction_*" class="cn.xing.validate.ValidateXmlAction" method="{1}">
			<result name="success">/validate/success.jsp</result>
			<result name="input">/validate/loginxml.jsp</result>
</action>

3. 在ValidateXmlAction的同级目录中创建用于校验表单的xml文件, 文件名为ValidateXmlAction-validation.xml(用于校验表单的xml文件的文件名规定为ActionClassName-validation.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
  		"-//OpenSymphony Group//XWork Validator 1.0.3//EN"
  		"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
	<!--
		field:表示验证的字段名称, 对应的值是访问的action中的属性. 这里是ValidateXmlAction中的username属性
	-->
	<field name="username">
		<!--
			field-validator表示字段校验器, type属性指定使用的校验规则
		-->
		<field-validator type="requiredstring">
			<!-- 调用RequiredStringValidator中setTrim(true) -->
			<param name="trim">true</param>
			<!-- 给出错误提示信息 -->
			<message><![CDATA[用户名不能为空!!!]]></message>
		</field-validator>
	</field>

	<field name="password">
		<field-validator type="requiredstring">
			<param name="trim">true</param>
			<message><![CDATA[密码不能为空!!!]]></message>
		</field-validator>
		<field-validator type="regex">
			<param name="expression"><![CDATA[^[a-zA-Z0-9]+$]]></param>
			<message><![CDATA[密码中不能包含非法字符]]></message>
		</field-validator>
		<field-validator type="regex">
			<param name="expression"><![CDATA[^[a-zA-Z0-9]{6,8}$]]></param>
			<message><![CDATA[密码的长度应该在6-8位之间]]></message>
		</field-validator>
	</field>

	<field name="age">
		<field-validator type="ageValidate">
			<message><![CDATA[年龄不能为负数!!!]]></message>
		</field-validator>
	</field>
</validators>?

4. 上述xml文件中使用名称为ageValidate的校验规则对age字段进行校验. ageValidate是一个自定义的校验规则.

自定义校验规则首先需要创建一个类, 继承FieldValidatorSupport类:

public class AgeValidate extends FieldValidatorSupport {
	/**
	 * @param object: 是Action对象, 其中封装了待验证的字段. 此例中object为ValidateXmlAction对象
	 */
	public void validate(Object object) throws ValidationException {
		// 获取需要验证的字段的名称
		String fielsName = this.getFieldName();
		// 获取该字段的值
		Object value = this.getFieldValue(fielsName, object);
		// 判断表单提交的该字段的值是否为整型
		if (value instanceof Integer) {
			Integer ivalue = (Integer) value;
			if (ivalue < 0) {
				// 增加错误信息到fieldError集合中
				this.addFieldError(fielsName, object);
			}
		}
	}
}

接下来需要注册上述自定义的校验规则. 在src下创建 validators.xml文件(文件名称固定):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
	"-//OpenSymphony Group//XWork Validator Config 1.0//EN"
	"http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
	<validators>
	<!-- 注册自定义的验证器 -->
	<validator name="ageValidate" class="cn.xing.validate.AgeValidate"></validator>
</validators> 

5. 默认情况下将对Action中的所有业务方法进行校验. 如果只想对Action中的某个业务方法进行校验, 可以将用于校验的xml文件命名为ActionClassName-ActionName_methodName-validation.xml. 本例中只对login()方法进行校验, 只需将ValidateXmlAction-validation.xml文件更名为ValidateXmlAction-validateXmlAction_login-validation.xml即可.?

?

?

发表评论
用户名: 匿名