struts2的数据验证

数据验证

用户的输入验证,必须做,且工作量巨大。

1、验证的方式

客户端验证:javascript

服务端验证:逻辑验证(我们的代码)

注意:如果客户端和服务端二选一的话,服务器端的不能省。

实际开发中:客户端+服务端

2、Struts2的服务端验证

2.1、编程式验证

前提:

动作类必须继承ActionSupport

在代码中编写验证规则。

a、针对动作类中的所有动作方法进行验证:

在动作类中覆盖public void validate()方法。

 但是当我们再写一个动作方法时:

b、针对动作类中的某个动作方法进行验证

针对上面的问题,解决办法1:给不需要验证的动作方法添加一个@SkipValidation注解。

 

解决办法2:validate方法遵守书写规范

解决办法1和解决办法2的使用时机:需要验证的动作方法少,用解决办法2。需要验证的方法多,用解决方式1。(简单一点:挑少的写)

validate()方法发现错误默认返回INPUT    有这几种常量SUCCESS + ERROR + INPUT + LOGIN + NONE

	<result name="input">/regist.jsp</result>

在regist.jsp页面使用struts特有的标签库

<%@ taglib uri="/struts-tags" prefix="s"%>
<s:fielderror> </s:fielderror>

用<s:fielderror></s:fielderror>取出封装了的错误信息

如果需要跳回页面的时候信息还在(回写)struts自带功能

<s:form action="user/userRegist" method="post">
		<s:textfield name="user.username" label="用户名" requiredLabel="true"
			requiredPosition="left"></s:textfield>
		<s:password name="user.password" label="密码" showPassword="true"></s:password>
		<s:password name="user.rePassword" label="重复密码" showPassword="true"> 
        </s:password>
		<s:textfield name="user.birthday" label="生日"></s:textfield>
		<s:checkboxlist name="user.hobby" label="爱好" list="{'吃','喝','玩'}"> 
        </s:checkboxlist>
		<s:radio list="#{'m':'男','f':'女'} " name="user.sex" label="性别"></s:radio>
		<s:textfield name="user.age" label="年龄"></s:textfield>
		<s:textfield name="user.email" label="邮箱"></s:textfield>
		<s:textfield name="user.score" label="分数"></s:textfield>
		<s:textfield name="user.url" label="个人主页"></s:textfield>
		<s:submit value="submit"></s:submit>
</s:form>

所有编程式验证的弊端:硬编码。

2.2、声明式验证(推荐)

通过编写验证规则的xml文件。需要验证时,编写xml文件,不要验证,就不写。

优势:解决了2.1编程式验证的弊端

a、针对动作类中的所有动作进行验证:在动作类所在的包中,建立一个UserAction-validation.xml的文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC  "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>

	<field name="user.username">
		<field-validator type="stringlength">
			<param name="maxLength">32</param>
			<param name="minLength">2</param>
			<param name="trim">true</param>
			<message><![CDATA[用户名必须在2到32位之间]]></message>
		</field-validator>
	</field>

	<field name="user.age">
		<field-validator type="int">
			<param name="min">18</param>
			<param name="max">100</param>
			<message>年龄必须在${min}到${max}之间</message>
		</field-validator>
	</field>

	<field name="user.sex">
		<field-validator type="required">
			<message>必须选择性别</message>
		</field-validator>
	</field>

	<field name="user.email">
		<field-validator type="email">
			<message>请输入正确的邮箱地址</message>
		</field-validator>
	</field>

	<field name="user.password">
		<field-validator type="requiredstring">
			<param name="trim">true</param>
			<message>请输入正确密码</message>
		</field-validator>
		<field-validator type="stringlength">
			<param name="maxLength">32</param>
			<param name="minLength">6</param>
			<param name="trim">true</param>
			<message>密码必须在${minLength}到${maxLength}位之间</message>
		</field-validator>
	</field>

	<validator type="fieldexpression">
		<param name="fieldName">user.rePassword</param>
		<param name="expression"><![CDATA[user.password==user.rePassword]]></param>
		<message>两次密码输入不一致</message>
	</validator>

	<field name="user.score">
		<field-validator type="regex">
			<param name="regex"><![CDATA[\d+]]></param>
			<message>分数必须是数字</message>
		</field-validator>
	</field>

	<field name="user.url">
		<field-validator type="url">
			<message>请输入正确的网址</message>
		</field-validator>
	</field> 

</validators>

xwork-core-2.3.15.3.jar\com\opensymphony\xwork2\validator\validator\default.xml

Struts2内置的常用声明式验证器

自己写个验证器

新建一个类,仿struts自带的验证器

public class AgeValidator extends FieldValidatorSupport {

	/**
	 * object 指的是当前action类
	 */
	public void validate(Object object) throws ValidationException {
		// TODO Auto-generated method stub
		String fieldName = this.getFieldName();
		Object fieldValue = this.getFieldValue(fieldName, object);
		System.out.println("fieldName:" + fieldName + " fieldValue: " + fieldValue);

		if (fieldValue instanceof Integer) {
			int age = (Integer) fieldValue;
			if (age < 20) {
				addFieldError(fieldName, this.getMessage(object));
			}
		}
	}

}

在resource文件夹中建validators.xml,注册验证器

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator Definition 1.0//EN"
        "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">
<validators>
	<validator name="ageValidator" class="net.seehope.ssh.struts.web.validator.AgeValidator"></validator>
</validators>

就可以在UserAction-validation.xml中使用我们自己定义的验证器

<field name="user.age">
		<field-validator type="ageValidator">
			<message>年龄必须大于20岁</message>
		</field-validator>
</field>

猜你喜欢

转载自blog.csdn.net/weixin_36328444/article/details/81266085