数据验证
用户的输入验证,必须做,且工作量巨大。
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>