Struts 学习笔记之ActionForm

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

 

actionform.JPG 

 org.apache.struts.action包中html

public abstract class ActionForm implements Serializablejava

public class DynaActionForm extends ActionForm implements DynaBeanapache

 

 org.apache.struts.validator包中服务器

public class ValidatorForm extends ActionForm implements Serializablesession

public class DynaValidatorForm extends DynaActionFormapp

implements DynaBean, Serializable框架

 

 org.apache.struts.validator包中jsp

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,控制器都会先调用ActionFormreset()方法,而后表单数据组装到ActionForm中。如ActionFormrequest范围内,那么对于每一个新的request请求都会建立新的ActionForm实例。新实例建立后,若是它的属性已经被初始化为默认值,那么接着再在reset()方法中把属性设为默认值不是颇有必要,这时可让reset()方法为空。

 

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

 

2 . 其中,ActionForm须要咱们建立一个formbean类继承ActionForm,在ActionForm中能够定义一些propertyget/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;

    }

}

 

在页面上能够经过

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

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

 

3 . 其中,Dyna开头的动态ActionForm不须要建立具体的ActionForm类,只需经过Struts的配置文件就能够完成ActionForm的所有配置,如:

<form-bean name="optionsForm" type="org.apache.struts.action.DynaActionForm">

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

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

</form-bean>

 

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

 

 struts-config.xml中设置actionvalidate属性为"true"(默认为"true"),

<action path="/updateUser"

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

        name="userForm"

        scope="request"

        input="/jsp/updateUser.jsp"

        cancellable="true"

        validate="true" >

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

</action>

 

而且在相应的formbean中重写其中的validate方法,在validate方法中实现本身的数据验证逻辑。

 

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

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

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">

    <set-property property="pathnames"

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

                         /WEB-INF/validation.xml" />

</plug-in>

 

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

 

 使本身的formbean类继承含有validatorActionForm

public class UserForm extends ValidatorForm{

    private String userName;

    public String getUserName() {

        return userName;

    }

    public void setUserName(String userName) {

        this.userName = userName;

    }

}

并配置struts-config.xml文件:

<form-bean name="userForm" type="com.cn.lively.formbean.UserForm">

</form-bean>

 

㈡ 使本身的formbean类继承含有validatorDynaValidatorForm

<form-bean name="userForm" type="org.apache.struts.validator.DynaValidatorForm">

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

</form-bean>

 

 配置validation.xml文件:

<formset>

    <form name="userForm">

        <field property="userName" depends="required">

            <arg key="userForm.userName" />

        </field>

    </form>

</formset>

 

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

 

关于arg的几个属性以下:

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

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

resource key所指定的信息是否来自外部的资源文件,默认为true。若是为true,则表明keybuddle属性所指定的资源文件中的key

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

 

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

 

对于一个actionform,能够被多个action所使用,而每一个action可能须要的验证字段都不同,而validation.xml中配置的验证方式(如<form name="userForm">)是对这个formbean进行的.

 

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

 使本身的formbean类继承含有validatorActionForm

public class UserForm extends ValidatorActionForm{

    ……

}

并配置struts-config.xml文件:

<form-bean name="userForm" type="com.cn.lively.formbean.UserForm">

</form-bean>

 

<action-mappings>

    <action path="/createUser"

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

            name="userForm"/>

    <action path="/updateUser"

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

            name="userForm"/>

</action-mappings>

 

 使本身的formbean类继承含有validatorDynaValidatorActionForm

<form-bean name="userForm" type="org.apache.struts.validator.DynaValidatorActionForm">

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

</form-bean>

 

<action-mappings>

    <action path="/createUser"

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

            name="userForm"/>

    <action path="/updateUser"

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

            name="userForm"/>

</action-mappings>

 

② 配置validation.xml文件:

<formset>

    <form name="/createUser">

        <field property="userName" depends="required">

            <arg key="userForm.userName" />

        </field>

    </form>

    <form name="/updateUser">

        <field property="userName" depends="maxlength">

            <arg key="userForm.userName" />

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

            <arg name="maxlength" key="${var:maxlength}" resource="false"                       position="1" />

            <var>

                <var-name>maxlength</var-name>

                <var-value>10</var-value>

            </var>

        </field>

    </form>

</formset>

 

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

 

若是咱们查看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的名字

}

 

ValidatorActionForm 中的方法

* @return  validation key - the action element's 'path' attribute in this * case

public String getValidationKey(ActionMapping mapping,

        HttpServletRequest request) {

        return mapping.getPath();  // 返回action的路径

}


7 . 上面的验证是在服务器端进行,如须要在客户端进行js验证,须要在页面上配置:

 <html:form action="/ createUser" onsubmit="return validateUserForm(this);">

格式为 return validate + formbean名称(首字母大写) + (this)

用来在提交本页面时执行相应的js验证代码。

 

② 用来生成本页面的 js 验证代码。 有两种方法

 一是 在页面上声明

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

<html:javascript formName="userForm" dynamicJavascript="true" staticJavascript="true"/>

由于dynamicJavascript/staticJavascriptJavascriptValidatorTag.java默认为true,因此上面也能够直接写:<html:javascript formName="userForm"/>

struts-html.tld

<tag>

<name>javascript</name>

<tag-class>org.apache.struts.taglib.html.JavascriptValidatorTag</tag-class>

</tag>

 

注: 在客户端执行的js验证若是不经过,会alert出对话框进行提示,服务器 端 的验证(在页面上能够用<html:errors/>来显示出错信息)就不会执行。

注意只有dynamicJavascript="true" + staticJavascript="true才能生成完整的 js 验证代码 ,若是把任何一个设为"false"提交页面时都会产生js错误,除非咱们采用下面的方法进行声明。

 

 在本页面上声明

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

<html:javascript formName="userForm" dynamicJavascript="true" staticJavascript="false"/>

<script language="Javascript1.1" src="staticJavascript.jsp"/></script>

 定义staticJavascript.jsp的内容为

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

<html:javascript dynamicJavascript="false" staticJavascript="true"/>

 

注: dynamicJavascript 表示是否在页面内生成动态的jsstaticJavascript属性表明是否在页面内生成静态js。 如staticJavascript设为"true",则validator-rules.xml文件中的规则检查生成的js代码都会生成到本页面内。这样本页面会愈来愈大,通常最好是将staticJavascript设为"false", 将validator-rules.xml生成的js代码填充到一个指定的jsp页面(staticJavascript.jsp)中去。

 

 

 

附:

只有 dynamicJavascript="true" + staticJavascript="true才能生成完整的 js 验证代码 ,下面是  中dynamicJavascript="true"生成的参考代码:

var bCancel = false;

function validateUserForm(form) {

    if (bCancel) {

        return true;

    } else {

        var formValidationResult;

        // 调用staticJavascript.jspstaticJavascript="true"生成的js代码

        formValidationResult = validateByte(form) && validateEmail(form);

        return (formValidationResult);

    }

}

// validator-rules.xml 中定义了<validator name="byte"

// jsFunctionName=" ByteValidations "/>

// 则生成js函数名称为 formbean 名称 + 下划线 + jsFunctionName

function userForm_ByteValidations() {

    this.a0 = new Array("byteValue", "Byte must be a byte.", new Function ("varName", " return this[varName];"));

}

// validator-rules.xml 文件中没有定义jsFunctionName<validator name=" email "/>

// 则生成js函数名称为 formbean 名称 + 下划线 + validator name

function userForm_email() {

    this.a0 = new Array("email", "Email is an invalid e-mail address.", new Function ("varName", " return this[varName];"));

}

 

下面 是  中 staticJavascript.jsp 中 staticJavascript="true" 生成的参考代码:

function validateByte(form) {

    // ……

    // 调用 userForm_ ByteValidations ()

    // ……

}

function validateEmail(form) {

    // ……

    // 调用 userForm_ email ()

    // ……

}

相关文章
相关标签/搜索