JavaWeb编程实战宝典(9)___第9章 Struts2的输

2019-11-07  本文已影响0人  岁月静好浅笑安然

第9章 Struts2的输入校验

9.1 了解传统的数据校验方法

9.1.1 用JavaScript进行客户端校验

9.1.2 手工进行服务端校验

9.2 了解Struts2所支持的数据校验

9.2.1 了解使用validate方法校验数据的原理


public class RegisterAction extends ActionSupport {
    @Override
    public void validate() {
    //添加字段错误字和消息
    addFieldError("birthday","出生日期必须输入");
    }
    @Override
    public String execute() throws Exception {
        setResult("注册成功");
        return SUCCESS;
    }
}

9.2.2 实例:使用validate方法进行校验

register_Struts2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
     <%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
        <s:form action="register" namespace="/hwp">
        <s:textfield label="用户名" name="username"/>
        <s:textfield label="密码" name="password"/>
        <s:textfield label="重新输入密码" name="repassword"/>
        <s:textfield label="年龄" name="age"/>
        <s:textfield label="生日" name="birthday"/>
        <s:submit value="注册"/>
        </s:form>
</body>
</html>

RegisterAction.java

//需要继承ActionSupport
public class RegisterAction extends ActionSupport {
        private String username;
        private String password;
        private int age;
        private Date birthday;
        private String result;
        
        
    //省略setter和getter方法
    
    
    //执行方法
    @Override
    public String execute() throws Exception {
        setResult("注册成功");
        return SUCCESS;
    }
    //用于校验数据的validate方法
    @Override
    public void validate() {
        //校验用户名
        if(username==null||username.equals("")||
                !username.matches("^\\w+$")||
                username.length()<4||username.length()>20){
            addFieldError("username", "用户名必须是字母和数字,且长度必须介于4和20之间!");
            
        }
        //校验密码
        if(password==null||password.equals("")
                ||password.length()<4||password.length()>30){
            addFieldError("password", "密码长度必须介于8和30之间!");
        }
        //校验年龄
        if(age<=0&&age<=200){
            addFieldError("age","你必须输入一个有效年龄");
            
        }
        //出生日期不能为空
        if(birthday==null){
            addFieldError("birthday","出生日期必须输入");
            //校验出生日期
        }else{
            Calendar endDate=Calendar.getInstance();
            Calendar startDate=Calendar.getInstance();
            startDate.set(1900, 1,1);
            if(birthday.after(endDate.getTime())||birthday.before(startDate.getTime())){
                addFieldError("birthday","出生日期必须在一个有效范围内!");
            }
            
        }
    }
}

struts.xml

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
    "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
    <!-- 声明包 -->
    <package name="myPackge" namespace="/hwp" extends="struts-default">
        <!-- 配置Action -->
        
        <action name="register" class="com.hwp.RegisterAction">
            <!-- 配置success结果-->
            <result name="success">/success.jsp</result>
            <!-- 配置input结果-->
            <result name="input">/input.jsp</result>
        </action>
    </package>
</struts>


input.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>错误</title>
</head>
<body>
    <!--显示字段错误信息 -->
    <s:fielderror/>
</body>
</html>

什么都不填写,单击注册后浏览器显示如下

●用户名必须是字母和数字,且长度必须介于4和20之间!
●密码长度必须介于8和30之间!
●你必须输入一个有效年龄
●出生日期必须输入

当输入后,点击。浏览器会输出对应的校验不通过的!

9.2.3 实例:使用validateXxx方法进行输入校验

9.2.4 掌握 Struts2的输入校验流程

Strut2的输入校验流程图

9.3 使用Validation框架进行输入校验

9.3.1 实例:服务端校验

RegisterAction.java

public class RegisterAction extends ActionSupport {
    private String username;
    private String password;
    private int age;
    private Date birthday;
    
    ...省略setter和getter方法
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
}

Validation框架需要配置一个校验规则的xml文件,一般将这个文件放到Action同级部落,交完文件命名规则

    <Action文件名>-validation.xml

RegisterAction-validation.xml

<?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="username">
    <field-validator type="requiredstring">
    <message>用户名必须输入</message>
    </field-validator>
    <field-validator type="stringlength">
        <param name="minLength">4</param>
        <param name="maxLength">20</param>
        <param name="trim">true</param>
        <message>用户名长度必须介于4和20之间!</message>
    </field-validator>
    <field-validator type="regex">
    <param name="trim">true</param>
    <param name="expression"> <![CDATA[(^\w*$)]]> </param>
    <message>用户名必须是字母和数字</message>
    </field-validator>
</field>
<field name="password">
    <field-validator type="requiredstring">
    <message>密码必须输入</message>
    </field-validator>
    <field-validator type="stringlength">
        <param name="minLength">8</param>
        <param name="maxLength">30</param>
        <param name="trim">true</param>
        <message>用户名长度必须介于8和30之间!</message>
    </field-validator>
</field>
<field name="age">
    <field-validator type="int">
        <param name="min">1</param>
        <param name="max">200</param>
        <message>你必须输入一个有效的年纪!</message>
    </field-validator>
</field>
<field name="birthday">
    <field-validator type="requiredstring">
    <message>出生年月日必须输入!</message>
    </field-validator>
    <field-validator type="date">
        <param name="min">1900-1-1</param>
        <param name="max">2020-1-1</param>
        <message>出生日期必须介于${min}!和${max}之间!</message>
    </field-validator>
</field>
</validators>

input.jsp
略,同上!
register_Struts2.jsp
略,同上!
struts.xml
略,同上!

9.3.2 使用字段校验器和非字段校验器

修改后RegisterAction-validation.xml,实例代码

<?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>
<validator type="requiredstring">
<param name="fieldName">username</param>
<message>用户名必须输入</message>
</validator>
<validator type="requiredstring">
<param name="fieldName">password</param>
<message>密码必须输入</message>
</validator>
<validator type="requiredstring">
<param name="fieldName">birthday</param>
<message>出生日期必须输入</message>
</validator>
<validator type="stringLength">
    <param name="fieldName">username</param>
    <param name="minLength">4</param>
    <param name="maxLength">20</param>
    <param name="trim">true</param>
    <message>用户名必须介于4到20之间</message>
    
</validator>
<!-- 部分代码,其他的下同 -->
</validators>

9.3.3 实现国际化错误提示消息

9.3.4 实例:客户端校验

此示例代码报错

register_Struts2.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
     <%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
         <!-- 将validate属性设置为true -->
        <s:form action="register" namespace="/hwp" validate="true">
        <s:textfield label="用户名" name="username"/>
        <s:textfield label="密码" name="password"/>
        <s:textfield label="年龄" name="age"/>
        <s:textfield label="生日" name="birthday"/>
        <s:submit value="注册"/>
        </s:form>
</body>
</html>

RegisterAction-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>
<validator  type="requiredstring">
    <param name="fieldName">username</param>
    <message>${getText("username.required")}</message>
</validator>
<validator  type="requiredstring">
    <param name="fieldName">password</param>
    <message>${getText("password.required")}</message>
</validator>
<validator  type="requiredstring">
    <param name="fieldName">birthday</param>
    <message>${getText("birthday.required")}</message>
</validator>

<validator  type="stringlength">
    <param name="fieldName">username</param>
    <param name="minLength">4</param>
    <param name="maxLength">20</param>
    <param name="trim">true</param>
    <message>${getText("username.stringlength")}</message>
</validator>

<validator  type="stringlength">
    <param name="fieldName">password</param>
    <param name="minLength">9</param>
    <param name="maxLength">30</param>
    <param name="trim">true</param>
    <message>${getText("password.stringlength")}</message>
</validator>

<validator  type="regex">
    <param name="fieldName">username</param>
    <param name="expression"><![CDATA[(^\w*$)]]></param>
    <param name="trim">true</param>
    <message>${getText("username.regex")}</message>
</validator>

<validator  type="int">
    <param name="fieldName">age</param>
    <param name="min">1</param>
    <param name="max">200</param>
    <message>${getText("age.int")}</message>
</validator>

<validator  type="date">
    <param name="fieldName">birthday</param>
    <param name="min">1900-1-1</param>
    <param name="max">2020-1-1</param>
    <message>${getText("birthday.date")}</message>
</validator>
</validators>

struts.xml

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
    "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 需要全局变量 -->
<constant name="struts.custom.i18n.resources" value="error"></constant>
    <!-- 声明包 -->
    <package name="myPackge" namespace="/hwp" extends="struts-default">
        <!-- 配置Action -->
        
        <action name="register" class="com.hwp.RegisterAction">
            <result name="success">/success.jsp</result>
            <result name="input">/input.jsp</result>
        </action>
    </package>
</struts>


error.properties,存放在src根目录下


error.properties文件数据内容

部署运行后浏览器输入

http://localhost:8080/Struts2_demo99/register_Struts2.jsp

如下报错,未解决


浏览器报错

客户端校验仅支持如下的校验器

9.3.5 了解建议文件的命名规则

Strut2的Action中可能有多个处理逻辑,也就是说,Action类中可能包含多个类似execute方法,每一个这样的方法否是一个处理逻辑。如果要求每一个处理逻辑有各自的校验规则
,只使用ActionName-validation.xml文件,系统将无法确认每一个处理逻辑要使用哪个校验规则,这样可以使用另外一个校验文件的命名规则,该命名规则如下:

    <ActionName>-<ActionAliasName>-validation.xml

<ActionAliasName>就是<action>标签的name属性值

下面配置两个Action的代码片段

    <!--为同一个Action配置两个动作 -->
    <action name="register" class="com.hwp.RegisterAction">
            <result name="success">/success.jsp</result>
            <result name="input">/input.jsp</result>
    </action>
    <!--该动作处理逻辑的方法是register -->
    <action name="register_method" class="com.hwp.RegisterAction" method="register">
            <result name="success">/success.jsp</result>
            <result name="input">/input.jsp</result>
    </action>

为了使代码配置的两个Action拥有不同的校验逻辑,就需要按照上面的命名规则建立校验文件,如对于register_method来说,校验文件的名称如下:

    RegisterAction-register_method-validation.xml

如果Action类之间是继承关系,Strut2校验框架会先使用父Action的校验文件,然后使用子Action的校验文件,如有两个Action类,ParentAction和ChlidAction,其中ParentAction为父类,会按如下的顺序来搜索校验文件。

9.3.6 了解短路校验器

short-circuit="true"时,当不满足此校验器,其他的校验器就不会执行。当为false时,所有此字段的校验器都会同时执行!

<!-- 将short-circuit属性设置为true -->
<validator  type="stringlength" short-circuit="true">
    <param name="fieldName">username</param>
    <param name="minLength">4</param>
    <param name="maxLength">20</param>
    <param name="trim">true</param>
    <message>${getText("username.stringlength")}</message>
</validator>

9.4 Validation框架的内建校验器

9.4.1 使用注册和引用校验器

9.4.2 使用转换(conversion)校验器

转换校验器的名字是 conversion。该校验器负责校验字段在类型转换过程中是否出错,下面是采用字段校验器风格的配置代码示例。

    <validators>
        <field name="brithday">
            <field-validator type="conversion">
                <message>请输入正确的出生日期</message>
            </field-validator>
        </field>
    </validators>

采用非字段校验器风格的配置代码

    <validators>
        <validator  type="conversion">
            <param name="fieldName">birthday</param>
            <message>请输入正确的出生日期</message>
        </validator>
    </validators>

9.4.3 使用日期(date)校验器

<validators>
    <validator  type="date">
    <param name="fieldName">birthday</param>
    <param name="min">1900-1-1</param>
    <param name="max">2020-1-1</param>
    <message>出生日期必须在一个有效范围内!</message>
    </validator>
</validators>

9.4.4 使用双精度浮点(double)校验器

<validators>
    <validator  type="double">
    <param name="fieldName">price</param>
    <param name="minExclusive">100.5</param>
    <param name="maxExclusive">200.25</param>
    <message>价格必须在${minExclusive}和${maxExclusive}之间(exclusive)!</message>
    </validator>
</validators>

9.4.5 使用邮件(email)地址校验器

<validators>
    <validator  type="email">
    <param name="fieldName">email</param>
    <message>电子邮件地址必须是一个有效的邮件地址!</message>
    </validator>
</validators>

9.4.6 使用表达式(expression)校验器

表达式校验器的名字是expression,它是一个非字段校验器,也就是说,expression校验器不能使用在字段校验器风格的校验规则中。该校验器使用OGNL表达式进行校验。如果OGNL表达式返回true,则校验通过;否则,校验失败。

<validators>
    <validator  type="expression">
    <!-- 指定校验器表达式-->
    <param name="expression">...</param>
    <message>OGNL表达式校验失败!</message>
    </validator>
</validators>

9.4.7 使用字段表达式(fieldexpression)校验器

<validators>
    <validator  type="fieldexpression">
    <!-- 指定校验器表达式-->
    <param name="fieldName">username</param>
    <param name="expression"><![CDATA[username!="system"]]></param>
    <message>用户名不能为system!</message>
    </validator>
</validators>

9.4.8 使用整数(int)校验器

<validators>
    <validator  type="int">
    <!-- 指定校验器表达式-->
    <param name="fieldName">age</param>
    <param name="min">1</param>
    <param name="max">200</param>
    <message>您必须输入一个有效的年龄!</message>
    </validator>
</validators>

9.4.9 使用正则表达式(regex)校验器

<field name="username">
    <field-validator type="requiredstring">
    <message>用户名必须输入</message>
    </field-validator>
    <field-validator type="stringlength">
        <param name="minLength">4</param>
        <param name="maxLength">20</param>
        <param name="trim">true</param>
        <message>用户名长度必须介于4和20之间!</message>
    </field-validator>
    <field-validator type="regex">
    <param name="trim">true</param>
    <param name="expression"> <![CDATA[(^\w*$)]]> </param>
    <message>用户名必须是字母和数字</message>
    </field-validator>
</field>

9.4.10 使用必填(required)校验器

9.4.11 使用必填(requiredstring)校验器

必填就表示该字段为非空

9.4.12 使用字符串长度(stringlength)校验器

9.4.13 使用网址(URL)校验器

9.4.14 使用visitor校验器

上一篇 下一篇

猜你喜欢

热点阅读