您的位置:首页 > 编程语言 > Java开发

struts2请求参数的输入校验

2013-07-22 09:17 337 查看
请求参数校验包括,客户端校验、服务器端校验 (服务器端校验必须写)

* 客户端校验,即时报错  jQuery validate 插件 好处是改善用户体验

* 服务器端校验主要为了安全性

 

struts2 支持服务器端校验方式

校验时:指定对Action的所有方法进行校验,也可以指定校验Action的某个方法

第一种 : 手工编程校验

对action的所有方法进行校验

校验使用前,Action类必须继承ActionSupport

在Action中 添加 public void validate() 方法

*validate()方法在其他的业务方法之前执行

                 * 验证出错转向的页面

                         struts.xml配置<resultname="input">/validate/login.jsp</result>  

                         其中input转向是在action中已经定义好的.

                         public static final StringINPUT = "input";

Action 可以有三种信息,回显给JSP页面 ActionError ActionMessageFieldError

*ActionError 代表Action执行中发生错误信息,例如:表单重复提交、用户名或者密码错误

*ActionMessage 不是错误信息,存放Action要传递给JSP的普通信息,例如:添加学生成功,用户注册成功

*FieldError 字段错误例如:类型转换错误、数据校验

例:@Override
public void validate() {
// 学生姓名不能为空
if (student.getName() == null || student.getName().trim().length() == 0) {
// 学习姓名 为空 ,非法
// 跳转回 input 页面,传递一个信息给 input 页面
//addFieldError(filename,message) filename为哪个字段发生错误,message为错误提示消息
this.addFieldError("name", "学生姓名不能为空");
}
// 学生姓名长度 必须2-4位之间
else if (student.getName().length() < 2
|| student.getName().length() > 4) {
this.addFieldError("name", "学生姓名长度必须2到4位之间");
}
}



                   手动指定校验Action的某个方法

格式:在Action中添加 valuedateXxx() 方法 ,就会校验 xxx业务方法

例如: 只想校验Action的add方法 ---------public void validateAdd() {...}  将add方法首字母大写,在前面 添加validate

第二种 : XML配置校验 (重点)

不需要在Action中编写validate 校验方法

使用xml配置方式进行校验,验证的xml文件的规范在xwork-core-2.3.1.1.jar包下的:xwork-validator-1.0.3.dtd

 

对Action中所有业务方法完成校验

在Action类所在包 创建 "Action类名-validation.xml"

在xwork的jar包 内部com.opensymphony.xwork2.validator.validators 包内部default.xml  定义了常用校验器

        


         常用校验器

         requiredstring  校验"",非空输入校验

         stringlength 字符串长度校验器

         regex 正则表达式校验器

         int 输入整数范围校验器

         double 输入浮点数范围校验器

         email 邮箱格式校验

         date 日期格式校验(范围)

         fieldexpression 字段表达式校验,支持ognl表达式 (两次密码一致)

例:
<validators>
<!-- 定义很多校验规则 -->
<!-- field 代表表单 一个字段  name 就是字段的名称-->
<field name="name">
<!-- 对name字段进行校验 -->
<!-- 进行哪些规则的校验,在struts2内部提供一些已经实现校验器 -->
<field-validator type="requiredstring">
注:这里的< param >参数主要看拦截器中有set方法的字段,查看方式如下:
例如<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
在myeclipse中选中类名按住ctrl+shift+T,再回车后就进入了源码,在源码中查看有set方法的字段。
<!-- 可以向校验器 内部 setXXX 方法传递 参数  -->
<param name="trim">true</param>
<!-- 设置校验失败错误信息,错误信息会被addFieldError -->
<message>学生姓名不能为空!</message>
</field-validator>

<!-- 校验长度必须2-4位 -->
<field-validator type="stringlength">
<param name="trim">true</param>
<param name="minLength">2</param>
<param name="maxLength">4</param>
<message>学生姓名长度必须在2到4位之间</message>
</field-validator>
</field>
如果校验失败此处struts会自动调用  addFieldError("name",message);方法进行错误添加
</validators>

校验Action中指定的业务方法
文件命名: Action类名-ActionName(struts.xml 配置 <action> 的name属性)-validation.xml
例如:校验 StudentAction2 中 execute方法
<action name="student2" class="cn.itcast.action.demo4.StudentAction2">
文件名: StudentAction2-student2-validation.xml

<validators>
<field name="age">
<field-validator type="int">
<param name="min">10</param>
<param name="max">100</param>
<message>年龄必须在10到100之间!</message>
</field-validator>
</field>
</validators>

案例: 两次密码一致,比较案例
<field name="repassword">
<!-- 重复密码 必须 两次输入一致 -->
<field-validator type="fieldexpression">
<param name="expression">
<![CDATA[password == repassword]]>
</param>
<message>两次密码输入不一致</message>
</field-validator>
</field>
案例:required  必填校验器
<field-validator type="required">
<message>性别不能为空!</message>
</field-validator>
requiredstring  必填字符串校验器
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空!</message>
</field-validator>
stringlength:字符串长度校验器
<field-validator type="stringlength">
<param name="maxLength">10</param>
<param name="minLength">2</param>
<param name="trim">true</param>
<message><![CDATA[产品名称应在2-10个字符之间]]></message>
</field-validator>
int:整数校验器
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年龄必须在1-150之间</message>
</field-validator>
date: 日期校验器
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<message>生日必须在${min}到${max}之间</message>
</field-validator>
url:  网络路径校验器
<field-validator type="url">
<message>传智播客的主页地址必须是一个有效网址</message>
</field-validator>
email:邮件地址校验器
<field-validator type="email">
<message>电子邮件地址无效</message>
</field-validator>
regex:正则表达式校验器
<field-validator type="regex">
<param name="expression"><![CDATA[^13\d{9}$]]></param>
<message>手机号格式不正确!</message>
</field-validator>
fieldexpression : 字段表达式校验
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[(password==repassword)]]></param>
<message>两次密码输入不一致</message>
</field-validator>

第三种 : 注解配置校验(略)

=============================================================================================

自定义校验规则

实际开发中很少用,由于struts中的规则很全了。

1、 自定义校验器必须 实现 Validator 接口

2、 实现validate方法 校验核心方法, struts2会将校验对象 传递给该方法

制作与多个字段相关校验器 , 可以继承 ValidatorSupport 类

制作与一个字段相关校验器 , 可以继承 FieldValidatorSupport 类 (制作案例)

 

3、 注册校验器在src下创建 validators.xml 

         该xml文件采用的规范在xwork-core-2.1.6.jar包下的xwork-validator-config-1.0.dtd

4、 在校验xml文件中 使用自定义校验器

 

案例: 自定义大于0 校验器 (正数校验器)

在校验器获得字段名称 this.getFieldName(), 字段值 this.getFieldValue() 

@Override
// action 需要被校验的对象 --- Action对象,该对象主要作用 添加错误信息
public void validate(Object action) throws ValidationException {
// 获得字段的名称 ,比如age
String fieldName = this.getFieldName();
// 获得字段的值
Object value = this.getFieldValue(fieldName, action);
// 判断 如果value 小于 0 ,输入非法
if (value instanceof Integer) {
// 输入是一个数字
Integer intVal = (Integer) value;
if (intVal < 0) {
// 非法内容
this.addFieldError(fieldName, action);// 将错误信息,添加到Action,信息来自校验配置文件
}
} else {
throw new RuntimeException("输入字段不是一个数字!");
}
}

在src下创建validators.xml
<validators>
<!-- 注册 校验器 -->
<validator name="age" class="cn.itcast.action.demo5.MyValidator"></validator>
</validators>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息