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 ()

    // ……

}

相關文章
相關標籤/搜索