Struts2学习之表单验证
1、前言
web应用程序,在很多地方都需要对数据进行验证,验证后,给用户一些提示的信息,尽量让用户知道那些信息有误,对输入信息的认证,可以在前台,也可以在后台,在前台可以用js来实现,在后台呢,也可以,如果要自己学验证方法的话
写是可以写出来,但是很繁琐,都一些if和else语句,基于这种考虑,struts提供了很一套很好的验证体系。
这个验证功能要用到上一篇编写的代码,只是修改部分代码,和添加必需的代码。
2、strut验证的种类
strut验证的方式可以说是挺多中的,下面是一些常用的方法。
(1)在继承ActionSupport的动作类中重写validate()方法,至于如何验证,那就是自己编写代码的事情了,由于
承了ActionSupport这个类,而这个类中有几个处理动作错误的方法。如下:
1)addActionError(String anErrorMessage),当动作请求错误时,可以把需要显示给用户的信息添加进去,
在前台则采用struts内置的标签<s:actionerror/>就可以把在后台添加进来的信息实现给用户了。
2)addActionMessage(String aMessage),这个方法可以将需要显示的信息显示给用户,在前台采用标签
<s:actionmessage/>来显示相关的信息。
3)addFieldError(String fieldName,String errorMessage),这个方法是在字段类型输入不正确时候用到,
在前台用<s:fielderror/>就可以将我们在后台添加的错误信息显示给用户看了。
(2)如果表单使用的标签都是struts内置的话,那么当用户输入的数据类型不合法时,在后台无法进行自动转换时,
它会自动提示给用户Invalid field value for field "fieldName",虽然可以提示,但是总感觉这个提示太过于笼
统,用户可能也不理解。这很好解决,struts程序员也想到了这点,这时,我们只要编写一个properties文件就
可以改变显示的内容信息了,它的格式是,名字actionName.properities,这个文件要和对应的动作类在同一个
目录下,其中的actionName就是动作类的名字,这个文件的内容也有特定的格式,invlid.fieldvalue.字段名
="自己想显示的内容", 例如,在前台有个name="age"的输入框,那么就应该写
invalid.fieldvalue.age="请输入整数类型".
(3)由于struts内嵌了xwork框架,所以它支持xwork提供的专业的数据验证体系,其实我们需要做的很事情很少
只需要编写一个xml文件,xwork会自动调用内部的方法为我们验证。命名规则是:ActionName-validation
.xml,也要把这个文件放到对应的动作类目录下。
3、用实例来说话,源码和上一篇的博客一样,下面是需要修改的。
(1)对应上边的第一种方法。
在RegisteAction类中重写ActionSupport的validate()方法,如下
public void validate(){
if(username==null||username.length()<6||username.length()>12){
this.addActionError("用户名无效");
}
if(password==null){
this.addActionError("密码不能为空");
}
if(repassword==null){
this.addActionError("确认密码不能为空");
}
if(password!=null&&repassword!=null&&password.equals(repassword)){
this.addActionError("两次输入的密码不一致");
}
if(birthday!=null&&graduated!=null){
if(graduated.before(birthday)){
this.addActionError("毕业日期不能在出生日期之前");
}
}
if(point==null){
this.addActionError("坐标不能为空,输入的两个数字要以逗号隔开");
}
}
在registe2.jsp中输入如下:
提交后,显示如下:
说明:可以看到,在顶部有黑点的提示信息就是在RegisteAction2类中的validate方法中编写的,在前台用了
<s:actionerror/>标签显示出来,由于这个表单的标签都是采用struts内置的,所以当输入的类型与后
台不匹配时,它会自动提示错误信息,但是这样的信息用户是很难看懂的。
(2)对应上边的第二种方法,改变显示的内容,显示一些用户容易看懂的信息。
创建一个properties文件,文件名为RegistAction.properties,由于采用的编码不一样,所以在可视化界面
时是如下:
点击源码设计时如下:
invalid.fieldvalue.username=\u7528\u6237\u540D\u4E0D\u53EF\u7528 invalid.fieldvalue.password=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A invalid.fieldvalue.birthday=\u51FA\u751F\u65E5\u671F\u4E0D\u53EF\u7528\uFF0C\u683C\u5F0F\u5982\uFF1A2011-03-05 invalid.fieldvalue.graduate=\u6BD5\u4E1A\u65E5\u671F\u4E0D\u53EF\u7528\uFF0C\u683C\u5F0F\uFF1A2011-04-05 invalid.fieldvalue.point=\u5750\u6807\u4E0D\u53EF\u7528\uFF0C\u683C\u5F0F\u5982\uFF1A3\uFF0C4
都是一些我们看不懂的信息,但是没有关系,添加了这个文件后,
现在再看看效果:
提示的信息确实改变了,这就是RegisteAction.properties文件起到的效果。
(3) 采用xwork框架内置的验证机制
RegisteAction-validation.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd"> <validators> <field name="username"> <field-validator type="requiredstring"> <param name="trim"></param> <message>请填写字符类型</message> </field-validator> <field-validator type="stringlength"> <param name="maxLength">6</param> <param name="minLength">20</param> <message>长度在6到20个字符之间</message> </field-validator> <field-validator type="required"> <param name=""></param> <message>用户名不能为空</message> </field-validator> </field> <field name="birthday"> <field-validator type="date"> <param name="min">1900-01-01</param> <param name="max">2012-12-12</param> <message>出生时间在${min}和${max}之间</message> </field-validator> </field> </validators>
说明:这个文件的标签有很多,不可能把它全都背下来,学习得有技巧,我们可以查看xwork类库下的源码,里面有
很详细的属性,它的位置如下图所示:
点击default.xml这个文件,显示的内容如下:
说明:这个文件一目了然,name属性对应于ActionName-validation.xml中的
<field-validator type="requiredstring">的type值,而<param name="trim"></param>中的
name属性从哪里来呢,那就得找到上边对应的类,里面有什么属性,这个name类里面就可以填写什么。
好了,看看效果吧,在看效果前,我先把自己在RegisteAction中的validate方法中编写的验证方法注释掉。
效果如下:
一样可以验证,当然xwork还提供了很多类型数据的验证,比如邮件,url等的验证,如果要我们自己编写的话,
考虑的可能不是很周到,但是利用内置的验证,则可以很好得给用户提示信息。
4、小结一下:
strut的验证方法有很多,也很全面,各种验证方法可以同时存在,在适当的时候适当的地方选择适当的验证才是最好
的方法。