首页 > 代码库 > struts2中服务器端数据校验
struts2中服务器端数据校验
数据校验指对数据合法性进行检查,根据验证数据的位置可以分为客户端验证和服务器端验证,今天随笔主要写的是实现服务器端的数据验证,服务器端数据验证主要特点:
·数据提交后在服务器端验证
·防止绕过客户端验证提交的非法数据
·可以在服务器端处理数据前保证数据的合法性
Struts2中有两种实现服务器端验证的方式。
一、 使用ActionSupport编码实现验证
- 在Action类的方法中直接验证
在Action 类中直接进行校验是一种最为原始的方法,这里作为了解,首先是action 类中的验证代码:
private User user;
@Override
public String execute() throws Exception {
//验证用户名
if(user.getName()==null || "".equals(user.getName())){
this.addFieldError("user.name", "用户名不能为空");
return INPUT;
}
addActionError("用户名或密码错误!");//添加action错误提示
if(this.hasErrors()){
return INPUT;
}
return SUCCESS;
}
然后在JSP页面中使用标签输出错误信息。
<s:fielderror fieldName="user.name"></s:fielderror> //根据字段输出错误信息
<s:actionerror/> //输出action错误信息
- 重写validate()方法验证
Validate()是实现验证的方法,他会在业务方法之前调用,验证不通过则业务处理不执行.
private User user;
@Override
public String execute() throws Exception {
System.out.println("完成注册业务");
addActionError("用户名或密码错误!");
if(this.hasErrors()) return INPUT;
return SUCCESS;
}
@Override
public void validate() {
if(null==user.getName() || "".equals(user.getName())){
this.addFieldError("user.name", "用户名不能为空!");
}
}
- 使用validateXxx()方法实现验证
前面的validate()方法会对所有业务方法进行验证,而我们只需对单个业务类进行验证时就要用到validateXxx()方法,Xxx指被验证的方法名,代码如下.
public String register() throws Exception {
System.out.println("完成注册业务");
addActionError("用户名或密码错误!");
if(this.hasErrors()) returnINPUT;
returnSUCCESS;
}
publicvoid validateRegister() {
if(null==user.getName() || "".equals(user.getName())){
this.addFieldError("user.name", "用户名不能为空!");
}
}
在register()被调用之前会先调用validateRegister()进行数据校验。
二、 使用验证框架实现验证
在实际开发中,很多验证是相同的,对于这些许重复实现的验证,完全可以统一实现,struts2的验证框架就实现了这一功能。使用验证框架时,所有的验证规则是写在配置文件中,便于开发与维护,所以这里详细介绍一下验证框架。
- 编写JSP数据输入页面
表单部分代码:
<form id="register" action="register.action" method="post">
<table >
<caption>注册</s:text></caption>
<tbody>
<tr>
<td>登录名:</s:text></td>
<td><input type="text" name="user.name" value=http://www.mamicode.com/"${user.name }" /></td>
<td><s:fielderror fieldName="user.name"></s:fielderror></td>
</tr>
<tr>
<td>密码:</s:text></td>
<td><input type="password" name="user.pass" /></td>
<td><s:fielderror fieldName="user.pass"></s:fielderror></td>
</tr>
<tr>
<td>重复密码:</s:text></td>
<td><input type="password" name="pass" /></td>
<td><s:fielderror fieldName="pass"></s:fielderror></td>
</tr>
<tr>
<td>年龄:</td>
<td><input type="text" name="user.age" /></td>
<td><s:fielderror fieldName="user.age"></s:fielderror></td>
</tr>
<tr>
<td>收入:</td>
<td><input type="text" name="user.income" /></td>
<td><s:fielderror fieldName="user.income"></s:fielderror></td>
</tr>
<tr>
<td>生日:</td>
<td><input type="text" name="user.birthday" /></td>
<td><s:fielderror fieldName="user.birthday"></s:fielderror></td>
</tr>
<tr>
<td>Email</td>
<td><input type="text" name="user.email" /></td>
<td><s:fielderror fieldName="user.email"></s:fielderror></td>
</tr>
<tr>
<td>个人主页 URL</td>
<td><input type="text" name="user.url" /></td>
<td><s:fielderror fieldName="user.url"></s:fielderror></td>
</tr>
<tr>
<td colspan="3" align="center"><input class="submit" type="submit" value=http://www.mamicode.com/"提交" /></td>
</tr>
</tbody>
</table></form>
- 编写action类和配置文件
首先是配置文件,配置文件的命名必须为Xxx-yyy-validation.xml,Xxx为对应的action类名,这个文件只要与对应action 类放在同一目录下就会被自动识别,这里命名为UserAction-register-validation.xml。
Action 中代码:
配置文件中的代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="user.name" >
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[\w{4,16}]]></param>
<message>用户名长度必须在 4-16 位之间</message>
</field-validator>
</field>
<field name="user.pass">
<field-validator type="requiredstring">
<message >密码不能为空</message>
</field-validator>
<field-validator type="stringlength">
<param name="maxLength">16</param>
<param name="minLength">6</param>
<message>密码长度必须在 ${minLength} - ${maxLength} 之间</message>
</field-validator>
</field>
<field name="pass">
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[pass==user.pass]]></param>
<message>密码和确认密码必须一致</message>
</field-validator>
</field>
<field name="user.age">
<field-validator type="conversion" short-circuit="true">
<message>年龄必须是整数</message>
</field-validator>
<field-validator type="required">
<message>年龄不能为空</message>
</field-validator>
<field-validator type="int">
<param name="max">150</param>
<param name="min">0</param>
<message>年龄必须在 ${min}-${max} 之间</message>
</field-validator>
</field>
<field name="user.income">
<field-validator type="conversion" short-circuit="true">
<message>收入必须是数字</message>
</field-validator>
<field-validator type="required">
<message>收入不能为空</message>
</field-validator>
<field-validator type="double">
<param name="maxInclusive">1000000</param>
<param name="minInclusive">2999.95</param>
<message>收入必须在 ${minInclusive}-${maxInclusive} 之间</message>
</field-validator>
</field>
<field name="user.birthday">
<field-validator type="conversion" short-circuit="true">
<message>生日必须写作:2008-08-08</message>
</field-validator>
<field-validator type="required" >
<message>生日不能为空</message>
</field-validator>
<field-validator type="date">
<param name="min">2000-01-01</param>
<param name="max">2009-12-31</param>
<message>生日必须在 (2000-01-01, 2009-12-31) 之间</message>
</field-validator>
</field>
<field name="user.email">
<field-validator type="requiredstring">
<message>email 不能为空</message>
</field-validator>
<field-validator type="email">
<message>email 格式不合法</message>
</field-validator>
</field>
<field name="user.url">
<field-validator type="requiredstring">
<message>个人主页必填</message>
</field-validator>
<field-validator type="url">
<message>url 地址错误</message>
</field-validator>
</field>
</validators>
至此验证规则也写完了,然后在我们提交表单的时候就可以看到错误提示了。
另外需要注意的是,struts2中内置了类型转换错误提示,所以有可能出现双重提示的状况。
这时候可以通过在struts.xml中设置解决。
<constant name="struts.custom.i18n.resources" value=http://www.mamicode.com/"msg"/> //设置提示资源msg
然后在src目录下简历msg.properties资源文件,添入xwork.default.invalid.fieldvalue=http://www.mamicode.com/。就可以了。
到这里表单数据的后台验证就结束了。
最后附上一张数据验证流程图。
struts2中服务器端数据校验