• Struts 学习笔记之ActionForm


    Struts 学习笔记之ActionForm

    Struts 中定义了一些JavaBeans,主要是以ActionForm为父类扩展开来的,如下图:

    ① org.apache.struts.action包中

    public abstract class ActionForm implements Serializable

    public class DynaActionForm extends ActionForm implements DynaBean

    ② org.apache.struts.validator包中

    public class ValidatorForm extends ActionForm implements Serializable

    public class DynaValidatorForm extends DynaActionForm

    implements DynaBean, Serializable

    ③ org.apache.struts.validator包中

    public class ValidatorActionForm extends ValidatorForm implements Serializable

    public class DynaValidatorActionForm extends DynaValidatorForm

        implements DynaBean, Serializable

    1 . ActionForm中比较常用的两个方法是reset()和validator():

    // 恢复ActionForm属性的默认值,如把boolean型设为true/false,字符串设为null。

    public void reset( ActionMapping mapping, HttpServletRequest request ) { }

    // validate 只检查数据格式和语法,不检查数据是否符合业务逻辑。

    public ActionErrors validate( ActionMapping mapping, HttpServletRequest request ) { return (null); }

    这两个方法的默认实现是不执行任何操作,我们可以重写这两个方法来实现相关逻辑。

    注: 对于每个request,控制器都会先调用ActionForm的reset()方法,然后表单数据组装到ActionForm中。如ActionForm在request范围内,那么对于每个新的request请求都会创建新的ActionForm实例。新实例创建后,如果它的属性已经被初始化为默认值,那么接着再在reset()方法中把属性设为默认值不是很有必要,这时可以让reset()方法为空。

    对于session范围内的ActionForm,同一ActionForm实例会被多个请求共享,reset()方法在这种情况下极为有用。

    2 . 其中,ActionForm需要我们创建一个formbean类继承ActionForm,在ActionForm中可以定义一些property和get/set方法。

    ActionForm 的property必须声明然后才可以使用,不过在查询时我们常常需要输入一些查询条件,这些查询条件(property)其实不需要在formbean中声明,这时可以使用Map对象来封装整个查询表单提交的数据,如下:

    public class MapForm extends ActionForm {

        private Map map = null;

        public void setMap(Map map) {

            this.map = map;

        }

        public Map getMap() {

            return this.map;

        }

        // 增加查询条件(property)的get/set方法,并把数据放到Map中

        public void setAttribute(String attributeKey, Object attributeValue) {

            map.put(attributeKey, attributeValue);

        }

        public Object getAttribute(String attributeKey) {

            Object keyValue = map.get(attributeKey);

            return keyValue;

        }

    }

    在页面上可以通过

    来获取表单数据,这会调用getAttribute("id")方法。

    3 . 其中,Dyna开头的动态ActionForm不需要创建具体的ActionForm类,只需通过Struts的配置文件就可以完成ActionForm的全部配置,如:

    DynaActionForm">

       

       

    4 . 其中,含有validator的ActionForm用来进行表单验证,验证方法有两种。

    ① 在struts-config.xml中设置action的validate属性为"true"(默认为"true"),

            type="com.cn.lively.action.UpdateUserAction"

            name="userForm"

            scope="request"

            input="/jsp/updateUser.jsp"

            cancellable="true"

            validate="true" >

       

    并且在相应的formbean中重写其中的validate方法,在validate方法中实现自己的数据验证逻辑。

    ② 通过validation框架进行验证,这分为两步:

    ⑴ 在struts-config.xml中配置validation插件,

       

                      value="/org/apache/struts/validator/validator-rules.xml,

                             /WEB-INF/validation.xml" />

    ⑵ 配置formbean,有下面两种方法:

    ㈠ 使自己的formbean类继承含有validator的ActionForm

    public class UserForm extends ValidatorForm{

        private String userName;

        public String getUserName() {

            return userName;

        }

        public void setUserName(String userName) {

            this.userName = userName;

        }

    }

    并配置struts-config.xml文件:

    userForm" type="com.cn.lively.formbean.UserForm">

    ㈡ 使自己的formbean类继承含有validatorDynaValidatorForm

    userForm" type="org.apache.struts.validator.DynaValidatorForm">

       

    ⑶ 配置validation.xml文件:

       

    userForm">

           

               

           

       

    注: 注意 validation.xml文件中的userForm是struts-config.xml文件中formbean的名字。

    关于arg的几个属性如下:

    bundle :指定资源文件名,如不指定,则从默认资源文件中读取

    key :从资源文件 ActionResources.properties 中得到的值

    resource :key所指定的信息是否来自外部的资源文件,默认为true。如果为true,则代表key为buddle属性所指定的资源文件中的key。

    position ,这个arg中的值用来替换信息中的哪一部分, 需要替换的部分以{n}标志。

    5 . 关于ValidatorForm/DynaValidatorFormValidatorActionForm/DynaValidatorActionForm之间的区别

    对于一个actionform,可以被多个action所使用,而每个action可能需要的验证字段都不一样,而validation.xml中配置的验证方式(如

    )是对这个formbean进行的.

    ① 如果需要针对每个action来验证,则必须使formbean继承ValidatorActionForm(或者直接配置DynaValidatorActionForm)。如下两种方法:

    ㈠ 使自己的formbean类继承含有validator的ActionForm

    public class UserForm extends ValidatorActionForm{

        ……

    }

    并配置struts-config.xml文件:

    userForm" type="com.cn.lively.formbean.UserForm">

        /createUser"

                type="com.cn.lively.action.CreateUserAction"

                name="userForm"/>

        /updateUser"

                type="com.cn.lively.action.UpdateUserAction"

                name="userForm"/>

    ㈡ 使自己的formbean类继承含有validatorDynaValidatorActionForm

    userForm" type="org.apache.struts.validator.DynaValidatorActionForm">

       

        /createUser"

                type="com.cn.lively.action.CreateUserAction"

                name="userForm"/>

        /updateUser"

                type="com.cn.lively.action.UpdateUserAction"

                name="userForm"/>

    ② 配置validation.xml文件:

       

    /createUser">

           

               

           

       

       

    /updateUser">

           

               

               

                                      position="1" />

               

                    maxlength

                    10

               

           

       

    注: 注意validation.xml文件中的/createUser/updateUser是struts-config.xml文件中action的path路径。

    如果我们查看struts源码,可以很清楚的看到ValidatorForm/DynaValidatorFormValidatorActionForm/DynaValidatorActionForm之间的区别

    ValidatorForm 中的方法

    @return validation key - the form element's name in this case

    public String getValidationKey(ActionMapping mapping,

            HttpServletRequest request) {

            return mapping.getAttribute();  // 返回formbean的名字

    }

    原帖地址:http://wangyu.iteye.com/blog/194566

  • 相关阅读:
    C# Net 合并int集合为字符串,如:输入1,2,3,4,8 输出1~4,8
    sql server 安装出现需要sqlncli.msi文件,错误为 microsoft sql server 2012 native client
    C# Form 实现桌面弹幕
    C# Net 去除图片白边
    SQL common keywords examples and tricks
    Excel formula and tricks
    HIghcharts cheatsheet
    CSS common keywords examples and tricks
    小白终于弄懂了:c#从async/await到Task再到Thread
    LeetCode 2: single-number II
  • 原文地址:https://www.cnblogs.com/Overbord/p/2605287.html
Copyright © 2020-2023  润新知