Struts 中定義了一些JavaBeans,主要是以ActionForm爲父類擴展開來的,以下圖:javascript
① 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,控制器都會先調用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;
}
}
在頁面上能夠經過
<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 . 其中,含有validator的ActionForm用來進行表單驗證,驗證方法有兩種。
① 在struts-config.xml中設置action的validate屬性爲"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類繼承含有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文件:
<form-bean name="userForm" type="com.cn.lively.formbean.UserForm">
</form-bean>
㈡ 使本身的formbean類繼承含有validator的DynaValidatorForm
<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文件中的userForm是struts-config.xml文件中formbean的名字。
關於arg的幾個屬性以下:
bundle :指定資源文件名,如不指定,則從默認資源文件中讀取
key :從資源文件 ActionResources.properties 中獲得的值
resource :key所指定的信息是否來自外部的資源文件,默認爲true。若是爲true,則表明key爲buddle屬性所指定的資源文件中的key。
position ,這個arg中的值用來替換信息中的哪一部分, 須要替換的部分以{n}標誌。
5 . 關於ValidatorForm/DynaValidatorForm與ValidatorActionForm/DynaValidatorActionForm之間的區別
對於一個actionform,能夠被多個action所使用,而每一個action可能須要的驗證字段都不同,而validation.xml中配置的驗證方式(如<form name="userForm">)是對這個formbean進行的.
① 若是須要針對每一個action來驗證,則必須使formbean繼承ValidatorActionForm(或者直接配置DynaValidatorActionForm)。以下兩種方法:
㈠ 使本身的formbean類繼承含有validator的ActionForm
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類繼承含有validator的DynaValidatorActionForm
<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和/updateUser是struts-config.xml文件中action的path路徑。
若是咱們查看struts源碼,能夠很清楚的看到ValidatorForm/DynaValidatorForm與ValidatorActionForm/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/staticJavascript在JavascriptValidatorTag.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 表示是否在頁面內生成動態的js,staticJavascript屬性表明是否在頁面內生成靜態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.jsp中staticJavascript="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 ()
// ……
}