【Web开发】Struts2输入校验

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>

valiate测试测试结果
在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>

stringlength测试stringlength测试结果
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代码懒得放了,就是之前的代码稍微改一改。
int校验测试1int校验测试2int校验测试结果

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就在之前的基础上稍微改改就行了
date校验器设置date校验器测试结果

剩下的校验器还有表达式校验器、字段表达式校验器、邮件地址校验器(可能无法完全覆盖)、网址校验器等,由于不常用或不推荐使用,所以在此不多介绍,有兴趣可以自行搜索。

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>

自定义校验器测试自定义校验器测试结果

猜你喜欢

转载自blog.csdn.net/tjj1998/article/details/80558541
今日推荐