[摘]Struts 学习笔记之ActionForm

版权所有:(xiaodaoxiaodao)蓝小刀    [email protected] <o:p></o:p>

http://www.blogjava.net/xiaodaoxiaodao/archive/2007/05/31/121264.html        <o:p></o:p>

转载请注明来源/作者<o:p></o:p>

Struts 学习笔记之ActionForm<o:p></o:p>

<o:p> </o:p>

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

<o:p> </o:p>

<o:p></o:p>

<o:p>actionform.JPG </o:p>

org.apache.struts.action包中<o:p></o:p>

public abstract class ActionForm implements Serializable<o:p></o:p>

public class DynaActionForm extends ActionForm implements DynaBean<o:p></o:p>

<o:p> </o:p>

org.apache.struts.validator包中<o:p></o:p>

public class ValidatorForm extends ActionForm implements Serializable<o:p></o:p>

public class DynaValidatorForm extends DynaActionForm<o:p></o:p>

implements DynaBean, Serializable<o:p></o:p>

<o:p> </o:p>

org.apache.struts.validator包中<o:p></o:p>

public class ValidatorActionForm extends ValidatorForm implements Serializable<o:p></o:p>

public class DynaValidatorActionForm extends DynaValidatorForm<o:p></o:p>

    implements DynaBean, Serializable<o:p></o:p>

<o:p> </o:p>

1 ActionForm中比较常用的两个方法是reset()validator()<o:p></o:p>

// 恢复ActionForm属性的默认值,如把boolean型设为true/false,字符串设为null<o:p></o:p>

public void reset( ActionMapping mapping, HttpServletRequest request ) { }<o:p></o:p>

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

public ActionErrors validate( ActionMapping mapping, HttpServletRequest request ) { return (null); }<o:p></o:p>

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

<o:p> </o:p>

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

<o:p> </o:p>

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

<o:p> </o:p>

2 . 其中,ActionForm需要我们创建一个formbean类继承ActionForm,在ActionForm中可以定义一些propertyget/set方法。<o:p></o:p>

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

public class MapForm extends ActionForm {<o:p></o:p>

    private Map map = null;<o:p></o:p>

    public void setMap(Map map) {<o:p></o:p>

        this.map = map;<o:p></o:p>

    }<o:p></o:p>

    public Map getMap() {<o:p></o:p>

        return this.map;<o:p></o:p>

    }<o:p></o:p>

    // 增加查询条件(property)的get/set方法,并把数据放到Map<o:p></o:p>

    public void setAttribute(String attributeKey, Object attributeValue) {<o:p></o:p>

        map.put(attributeKey, attributeValue);<o:p></o:p>

    }<o:p></o:p>

    public Object getAttribute(String attributeKey) {<o:p></o:p>

        Object keyValue = map.get(attributeKey);<o:p></o:p>

        return keyValue;<o:p></o:p>

    }<o:p></o:p>

} <o:p></o:p>

<o:p> </o:p>

在页面上可以通过<o:p></o:p>

<html:text property="attribute(id)"> </html:text> <o:p></o:p>

来获取表单数据,这会调用getAttribute("id")方法。<o:p></o:p>

<o:p> </o:p>

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

<form-bean type="org.apache.struts.action.&amp;lt;strong style=" name="optionsForm"> </form-bean> DynaActionForm"><o:p></o:p>

    <form-property type="java.lang.String" name="fruit1" initial="Pear"> </form-property> <o:p></o:p>

    <form-property type="java.lang.String" name="fruit2" initial="Apple"> </form-property> <o:p></o:p>

<o:p></o:p>

<o:p> </o:p>

4 . 其中,含有validatorActionForm用来进行表单验证,验证方法有两种。<o:p></o:p>

<o:p> </o:p>

struts-config.xml中设置actionvalidate属性为"true"(默认为"true"),<o:p></o:p>

<action path="/updateUser"></action>

        type="com.cn.lively.action.UpdateUserAction"<o:p></o:p>

        name="userForm"<o:p></o:p>

        scope="request"<o:p></o:p>

        input="/jsp/updateUser.jsp"<o:p></o:p>

        cancellable="true"<o:p></o:p>

        validate="true" ><o:p></o:p>

    <forward name="success" path="/jsp/validator/updateUserResults.jsp"></forward><o:p></o:p>

<o:p></o:p>

<o:p> </o:p>

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

<o:p> </o:p>

通过validation框架进行验证,这分为两步:<o:p></o:p>

struts-config.xml中配置validation插件,<o:p></o:p>

<plug-in classname="org.apache.struts.validator.ValidatorPlugIn"></plug-in> <o:p></o:p>

    <set-property property="pathnames"></set-property>

                  value="/org/apache/struts/validator/validator-rules.xml,<o:p></o:p>

                         /WEB-INF/validation.xml" /><o:p></o:p>

<o:p></o:p>

<o:p> </o:p>

配置formbean,有下面两种方法:<o:p></o:p>

<o:p> </o:p>

使自己的formbean类继承含有validatorActionForm<o:p></o:p>

public class UserForm extends ValidatorForm{<o:p></o:p>

    private String userName;<o:p></o:p>

    public String getUserName() {<o:p></o:p>

        return userName;<o:p></o:p>

    }<o:p></o:p>

    public void setUserName(String userName) {<o:p></o:p>

        this.userName = userName;<o:p></o:p>

    }<o:p></o:p>

} <o:p></o:p>

并配置struts-config.xml文件:<o:p></o:p>

<form-bean name="&amp;lt;strong style="> </form-bean> userForm" type="com.cn.lively.formbean.UserForm"><o:p></o:p>

<o:p></o:p>

<o:p> </o:p>

使自己的formbean类继承含有validatorDynaValidatorForm<o:p></o:p>

<form-bean name="&amp;lt;strong style="> </form-bean> userForm" type="org.apache.struts.validator.DynaValidatorForm"><o:p></o:p>

    <form-property type="java.lang.String" name="userName"> </form-property> <o:p></o:p>

<o:p></o:p>

<o:p> </o:p>

配置validation.xml文件:<o:p></o:p>

<formset> </formset> <o:p></o:p>

   

userForm"><o:p></o:p> <o:p></o:p>

        <field property="userName" depends="required"></field><o:p></o:p>

            <arg key="userForm.userName"></arg><o:p></o:p>

        <o:p></o:p>

   

<o:p></o:p>

<o:p> </o:p>

注: 注意 validation.xml文件中的userFormstruts-config.xml文件中formbean的名字。<o:p></o:p>

<o:p> </o:p>

关于arg的几个属性如下:<o:p></o:p>

bundle :指定资源文件名,如不指定,则从默认资源文件中读取<o:p></o:p>

key :从资源文件 ActionResources.properties 中得到的值<o:p></o:p>

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

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

<o:p> </o:p>

5 . 关于ValidatorForm/DynaValidatorFormValidatorActionForm/DynaValidatorActionForm之间的区别<o:p></o:p>

<o:p> </o:p>

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

<o:p></o:p>)是对这个 formbean进行的 .<o:p></o:p>

<o:p> </o:p>

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

使自己的formbean类继承含有validatorActionForm<o:p></o:p>

public class UserForm extends ValidatorActionForm{<o:p></o:p>

    ……<o:p></o:p>

} <o:p></o:p>

并配置struts-config.xml文件:<o:p></o:p>

<form-bean name="&amp;lt;strong style="> </form-bean> userForm" type="com.cn.lively.formbean.UserForm"><o:p></o:p>

<o:p></o:p>

<o:p> </o:p>

<action-mappings></action-mappings><o:p></o:p>

    <action path="&amp;lt;strong style="></action>/createUser"<o:p></o:p>

            type="com.cn.lively.action.CreateUserAction"<o:p></o:p>

            name="userForm"/><o:p></o:p>

    <action path="&amp;lt;strong style="></action>/updateUser"<o:p></o:p>

            type="com.cn.lively.action.UpdateUserAction"<o:p></o:p>

            name="userForm"/><o:p></o:p>

<o:p></o:p>

<o:p> </o:p>

使自己的formbean类继承含有validatorDynaValidatorActionForm<o:p></o:p>

<form-bean name="&amp;lt;strong style="> </form-bean> userForm" type="org.apache.struts.validator.DynaValidatorActionForm"><o:p></o:p>

    <form-property type="java.lang.String" name="userName"> </form-property> <o:p></o:p>

<o:p></o:p>

<o:p> </o:p>

<action-mappings></action-mappings><o:p></o:p>

    <action path="&amp;lt;strong style="></action>/createUser"<o:p></o:p>

            type="com.cn.lively.action.CreateUserAction"<o:p></o:p>

            name="userForm"/><o:p></o:p>

    <action path="&amp;lt;strong style="></action>/updateUser"<o:p></o:p>

            type="com.cn.lively.action.UpdateUserAction"<o:p></o:p>

            name="userForm"/><o:p></o:p>

<o:p></o:p>

<o:p> </o:p>

配置validation.xml文件:<o:p></o:p>

<formset> </formset> <o:p></o:p>

   

/createUser"><o:p></o:p>

        <field property="userName" depends="required"></field><o:p></o:p>

            <arg key="userForm.userName"></arg><o:p></o:p>

        <o:p></o:p>

   

   

/updateUser"><o:p></o:p> <o:p></o:p>

        <field property="userName" depends="maxlength"></field><o:p></o:p>

            <arg key="userForm.userName"></arg><o:p></o:p>

            <arg position="0" key="prompt.max"></arg><o:p></o:p>

            <arg style="mso-tab-count: 5" name="maxlength" key="${var:maxlength}" resource="false"></arg>                      position="1" /><o:p></o:p>

            <o:p></o:p><o:p></o:p>

                <var-name></var-name>maxlength<o:p></o:p>

                <var-value></var-value>10<o:p></o:p>

           

        <o:p></o:p>

   

<o:p></o:p>

<o:p> </o:p>

注: 注意validation.xml文件中的/createUser/updateUserstruts-config.xml文件中actionpath路径。<o:p></o:p>

<o:p> </o:p>

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

ValidatorForm 中的方法<o:p></o:p>

* @return validation key - the form element's name in this case <o:p></o:p>

public String getValidationKey(ActionMapping mapping, <o:p></o:p>

        HttpServletRequest request) { <o:p></o:p>

        return mapping.getAttribute();  // 返回formbean的名字<o:p></o:p>

} <o:p></o:p>

<o:p> </o:p>

ValidatorActionForm 中的方法<o:p></o:p>

* @return validation key - the action element's

你可能感兴趣的:(apache,xml,bean,jsp,struts)