1.Struts2手动完成输入校验
1.在execute()方法中编写校验代码,不推荐
2.Struts2会在执行action前调用validate()方法,也就是专门用来校验数据的方法,开发者可以通过继承ActionSupport类并重写validate方法来完成输入校验。
validate.jsp
<div style="font_size:14px;font_weight:bold">用户登录</div>
<div>
<s:form action="validate" namespace="/user">
<s:textfield name="name" style="font_size:12px;width: 120px;" label="登录名称" />
<s:password name="pass" style="font_size:12px;width: 120px;" label="登录密码" />
<s:submit value="登录" />
<s:reset value="重填" />
</s:form>
</div>
succ.jsp
<h1>恭喜您!登录成功</h1>
姓名:<s:property value="name"/>
密码:<s:property value="pass"/>
ValidateAction方法
public class ValidateAction extends ActionSupport{
private String name;
private String pass;
/* 省略get()和set()方法 */
public void validate(){
if(name==null||name.length()<6||name.length()>15){
addFieldError("name","用户姓名长度不合要求!");
}
if(pass==null||pass.length()<8||pass.length()>20){
addFieldError("pass","用户密码长度不合要求!");
}
}
}
struts.xml
<package name="user" extends="struts-default" namespace="/user">
<action name="validate" class="ch5.ValidateAction">
<result name="input">/validate.jsp</result>
<result name="success">/succ.jsp</result>
</action>
</package>
在validate()方法中发现有非法输入时会调用其父类的addFieldError()方法,记录一个fieldError错误。在执行execute()方法前,系统会检查是否存在fieldError,如果有,则不再执行execute()方法,而返回input逻辑视图。
由于action可以选择method,那么validate也可以对单独的method进行数据校验。比如method为login(),那么validate方法为validateLogin()。注意:validate()方法对所有的action都有效。
2.使用Struts2内置校验器
1.校验器配置方式
命名规则为<ActionName>-validation.xml
,例如LoginAction,则为LoginAction-validation.xml。
Requiredstring.java
public class Requiredstring extends ActionSupport{
private String name;
private String pass;
/* 省略get()和set()方法 */
public String execute(){
return SUCCESS;
}
}
struts.xml
<action name="requiredstring" class="ch5.Requiredstring">
<result name="input">/requiredstring.jsp</result>
<result name="success">/succ.jsp</result>
</action>
requiredstring.jsp
<s:form action="requiredstring" namespace="/user">
<s:textfield name="name" style="font_size:12px;width: 120px;" label="登录名称" />
<s:password name="pass" style="font_size:12px;width: 120px;" label="登录密码" />
<s:submit value="登录" />
<s:reset value="重填" />
</s:form>
到目前为止都没有什么注意的
RequiredString-validation.xml 放在对应Action的文件夹下,开头的内容直接复制即可
<?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="name">
<field-validator type="requiredstring">
<message>姓名不能为空!</message>
</field-validator>
</field>
<field name="pass">
<field-validator type="requiredstring">
<message>密码不能为空!</message>
</field-validator>
</field>
</validators>
2.校验器配置风格:
字段校验器配置风格
<validators>
<field name="被校验字段">
<field-validator type="校验类型名">
<param name="参数名">参数值</param>
<!-- 可有多个param -->
<message>校验失败时的提示信息</message>
</field-validator>
</field>
<!-- 可有多个field -->
</validators>
非字段校验器配置风格 (个人感觉不如字段校验器)
<validators>
<validator type="校验类型名">
<param name="fieldname">需要被校验的字段</param>
<param name="参数名">参数值</param>
<!-- 可有多个param -->
<message>校验失败时的提示信息</message>
</validator>
<!-- 可有多个validator -->
</validators>
例如之前的字段优先校验器,可以改为:
<validators>
<validator type="requiredstring">
<param name="fieldName">name</param>
<message>姓名不能为空!</message>
</validator>
<validator type="requiredstring">
<param name="fieldName">pass</param>
<message>密码不能为空!</message>
</validator>
</validators>
3.常用内置校验器
1.必填校验器
requiredstring 用于判断所填字段是否为空
前面所用的范例就是这个,就不多介绍了
2.字符串长度校验器
stringlength 用于判断字段是否满足指定长度
fieldname:用于指定被校验的Action属性,采用字段校验器则无需配置
maxLength:用于指定字符串最大长度,不写表示不限。
minLength:用于指定字符串最小长度,不写表示不限。
trim:表示在校验该字符串前,截掉字符串的前后空格,默认为true,可不写。
Requiredstring-validation.xml
<validators>
<field name="name">
<field-validator type="stringlength">
<param name="maxLength">15</param>
<param name="minLength">6</param>
<message>姓名长度为${minLength}到${maxLength}个字符!</message>
</field-validator>
</field>
<field name="pass">
<field-validator type="stringlength">
<param name="maxLength">20</param>
<param name="minLength">8</param>
<message>密码长度为${minLength}到${maxLength}个字符!</message>
</field-validator>
</field>
</validators>
3.整数校验器(double校验器用法相同)
int 用于判断被检验的整数是否在指定整数范围内
fieldname:同上
max:用于指定属性的最大整数值,不写表示不限
min:用于指定属性的最小整数值,不写表示不限
IntAction.java
public class IntAction extends ActionSupport{
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String execute(){
return SUCCESS;
}
}
IntAction-validation.xml
<validators>
<field name="age">
<field-validator type="int">
<param name="max">120</param>
<param name="min">1</param>
<message>年龄在${min}到${max}之间!</message>
</field-validator>
</field>
</validators>
jsp代码懒得放了,就是之前的代码稍微改一改。
4.日期验证器
date 用于判断校验日期字段值是否在指定范围内
fieldname:同上
max:用于指定被校验的日期的最大值,不写表示不限
min:用于指定被校验的日期的最小值,不写表示不限
<validators>
<field name="birthday">
<field-validator type="date">
<param name="max">2008-12-30</param>
<param name="min">1900-01-01</param>
<message>日期在1900-01-01到2008-12-30之间!</message>
</field-validator>
</field>
</validators>
datetimepicker的设置可以参考我的【Web开发】Struts2标签使用——表单UI标签
<s:form action="int" namespace="/user">
<sx:datetimepicker name="birthday" label="出生日期" displayFormat="yyyy/MM/dd"
language="UTF-8" toggleType="wipe" weekStartsOn="0"/>
<s:submit value="登录" />
</s:form>
action和结果jsp就在之前的基础上稍微改改就行了
剩下的校验器还有表达式校验器、字段表达式校验器、邮件地址校验器(可能无法完全覆盖)、网址校验器等,由于不常用或不推荐使用,所以在此不多介绍,有兴趣可以自行搜索。
4.自定义校验器
1.通过com.opensymphony.xwork2.validator接口或其子类来实现一个校验类
2.在src文件夹下新建validators.xml文件,注册验证器。
测试案例:编写一个字段校验器,检测一个字段的值是否为某个字符串。
1.编写Myvalidator.java
package ch5;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
public class Myvalidator extends FieldValidatorSupport{
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
@Override
public void validate(Object arg0) throws ValidationException {
// TODO Auto-generated method stub
String name=super.getFieldName();
String value=super.getFieldValue(name,arg0).toString();
if(!str.equals(value)){
super.addFieldError(name, arg0);
}
}
}
2.在src文件夹下添加validators.xml 开头直接复制,注意是xwork-validator-config-1.0.dtd
<?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-config-1.0.dtd">
<validators>
<validator name="test" class="ch5.Myvalidator"></validator>
</validators>
3.配置validator
<validators>
<field name="name">
<field-validator type="test">
<param name="str">whm</param>
<message>用户名必须为%{str}!</message>
</field-validator>
</field>
</validators>