美文网首页
JavaWeb编程实战宝典(9)___第9章 Struts2的输

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

作者: 岁月静好浅笑安然 | 来源:发表于2019-11-07 15:39 被阅读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

    如下报错,未解决


    浏览器报错

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

    • required
    • requiredstring
    • stringlength
    • regex
    • email
    • url
    • int
    • double

    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为父类,会按如下的顺序来搜索校验文件。

    • ParentAction-validation.xml
    • ParentAction-<ActionAliasName>-validation.xml
    • ChildAction-validation.xml
    • ChildAction-<ActionAliasName>-validation.xml

    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)校验器

    • fieldName 该参数指定了要校验的Action属性名
    • expression 该参数指定了一个逻辑表达式
    <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)校验器

    • fieldName 该参数指定了要校验的Action属性名
    • min 指定整数范围的最小值
    • max 指定整数范围的最大值
    <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)校验器

    • fieldName 该参数指定了要校验的Action属性名
    • expression 该参数指定了正则表达式 ,该参数是必须的
    • caseSensitive 该参数指明在匹配字段时,是否区分大小写。该参数是可选的,默认值是true。
    • trim 该参数指定指明了在匹配字段值之前,是否截取字段前后的空格,该参数是可选的,默认值是true。
    <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)校验器

    • fieldName 该参数指定了要校验的Action属性名

    9.4.11 使用必填(requiredstring)校验器

    必填就表示该字段为非空

    • fieldName 该参数指定了要校验的Action属性名
    • trim 该参数指定指明了在匹配字段值之前,是否截取字段前后的空格,该参数是可选的,默认值是true。

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

    • fieldName 该参数指定了要校验的Action属性名
    • maxLength 字段值的最大长度
    • minLength 字段值的最小长度
    • trim 该参数指定指明了在匹配字段值之前,是否截取字段前后的空格,该参数是可选的,默认值是true。

    9.4.13 使用网址(URL)校验器

    • fieldName 该参数指定了要校验的Action属性名

    9.4.14 使用visitor校验器

    相关文章

      网友评论

          本文标题:JavaWeb编程实战宝典(9)___第9章 Struts2的输

          本文链接:https://www.haomeiwen.com/subject/duymbctx.html