版權(quán)所有:(xiaodaoxiaodao)藍(lán)小刀
??
xiaodaoxiaodao@gmail.com
http://www.aygfsteel.com/xiaodaoxiaodao/archive/2007/05/31/121264.html
???
??
轉(zhuǎn)載請(qǐng)注明來(lái)源/作者
Struts
學(xué)習(xí)筆記之ActionForm
Struts
中定義了一些JavaBeans,主要是以ActionForm為父類擴(kuò)展開(kāi)來(lái)的,如下圖:
?
①
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中比較常用的兩個(gè)方法是reset()和validator():
//
恢復(fù)ActionForm屬性的默認(rèn)值,如把boolean型設(shè)為true/false,字符串設(shè)為null。
public void reset( ActionMapping mapping, HttpServletRequest request ) { }
// validate
只檢查數(shù)據(jù)格式和語(yǔ)法,不檢查數(shù)據(jù)是否符合業(yè)務(wù)邏輯。
public ActionErrors validate( ActionMapping mapping, HttpServletRequest request ) { return (null); }
這兩個(gè)方法的默認(rèn)實(shí)現(xiàn)是不執(zhí)行任何操作,我們可以重寫這兩個(gè)方法來(lái)實(shí)現(xiàn)相關(guān)邏輯。
注:
對(duì)于每個(gè)request,控制器都會(huì)先調(diào)用ActionForm的reset()方法,然后表單數(shù)據(jù)組裝到ActionForm中。如ActionForm在request范圍內(nèi),那么對(duì)于每個(gè)新的request請(qǐng)求都會(huì)創(chuàng)建新的ActionForm實(shí)例。新實(shí)例創(chuàng)建后,如果它的屬性已經(jīng)被初始化為默認(rèn)值,那么接著再在reset()方法中把屬性設(shè)為默認(rèn)值不是很有必要,這時(shí)可以讓reset()方法為空。
對(duì)于session范圍內(nèi)的ActionForm,同一ActionForm實(shí)例會(huì)被多個(gè)請(qǐng)求共享,reset()方法在這種情況下極為有用。
2
. 其中,ActionForm需要我們創(chuàng)建一個(gè)formbean類繼承ActionForm,在ActionForm中可以定義一些property和get/set方法。
ActionForm
的property必須聲明然后才可以使用,不過(guò)在查詢時(shí)我們常常需要輸入一些查詢條件,這些查詢條件(property)其實(shí)不需要在formbean中聲明,這時(shí)可以使用Map對(duì)象來(lái)封裝整個(gè)查詢表單提交的數(shù)據(jù),如下:
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方法,并把數(shù)據(jù)放到Map中
??? public void setAttribute(String attributeKey, Object attributeValue) {
??????? map.put(attributeKey, attributeValue);
??? }
??? public Object getAttribute(String attributeKey) {
??????? Object keyValue = map.get(attributeKey);
??????? return keyValue;
??? }
}
在頁(yè)面上可以通過(guò)
<html:text property="attribute(id)"/>
來(lái)獲取表單數(shù)據(jù),這會(huì)調(diào)用getAttribute("id")方法。
3
. 其中,Dyna開(kāi)頭的動(dòng)態(tài)ActionForm不需要?jiǎng)?chuàng)建具體的ActionForm類,只需通過(guò)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用來(lái)進(jìn)行表單驗(yàn)證,驗(yàn)證方法有兩種。
①
在struts-config.xml中設(shè)置action的validate屬性為"true"(默認(rèn)為"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>
并且在相應(yīng)的formbean中重寫其中的validate方法,在validate方法中實(shí)現(xiàn)自己的數(shù)據(jù)驗(yàn)證邏輯。
②
通過(guò)validation框架進(jìn)行驗(yàn)證,這分為兩步:
⑴
在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的名字。
關(guān)于arg的幾個(gè)屬性如下:
bundle
:指定資源文件名,如不指定,則從默認(rèn)資源文件中讀取
key
:從資源文件
ActionResources.properties
中得到的值
resource
:key所指定的信息是否來(lái)自外部的資源文件,默認(rèn)為true。如果為true,則代表key為buddle屬性所指定的資源文件中的key。
position
,這個(gè)arg中的值用來(lái)替換信息中的哪一部分,
需要替換的部分以{n}標(biāo)志。
5
. 關(guān)于ValidatorForm/DynaValidatorForm與ValidatorActionForm/DynaValidatorActionForm之間的區(qū)別
對(duì)于一個(gè)actionform,可以被多個(gè)action所使用,而每個(gè)action可能需要的驗(yàn)證字段都不一樣,而validation.xml中配置的驗(yàn)證方式(如<form name="userForm">)是對(duì)這個(gè)formbean進(jìn)行的.
①
如果需要針對(duì)每個(gè)action來(lái)驗(yàn)證,則必須使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之間的區(qū)別
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
. 上面的驗(yàn)證是在服務(wù)器端進(jìn)行,如需要在客戶端進(jìn)行js驗(yàn)證,需要在頁(yè)面上配置:
①
<html:form action="/
createUser" onsubmit="return validateUserForm(this);">
格式為 return validate + formbean名稱(首字母大寫) + (this)
用來(lái)在提交本頁(yè)面時(shí)執(zhí)行相應(yīng)的js驗(yàn)證代碼。
②
用來(lái)生成本頁(yè)面的
js
驗(yàn)證代碼。
有兩種方法:
⑴
一是
在頁(yè)面上聲明
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html:javascript formName="userForm" dynamicJavascript="true" staticJavascript="true"/>
因?yàn)?span lang="EN-US">dynamicJavascript/staticJavascript在JavascriptValidatorTag.java中默認(rèn)為true,所以上面也可以直接寫:<html:javascript formName="userForm"/>
struts-html.tld
<tag>
<name>javascript</name>
<tag-class>org.apache.struts.taglib.html.JavascriptValidatorTag</tag-class>
</tag>
注:
在客戶端執(zhí)行的js驗(yàn)證如果不通過(guò),會(huì)alert出對(duì)話框進(jìn)行提示,服務(wù)器
端
的驗(yàn)證(在頁(yè)面上可以用<html:errors/>來(lái)顯示出錯(cuò)信息)就不會(huì)執(zhí)行。
注意只有dynamicJavascript="true" + staticJavascript="true" 才能生成完整的
js
驗(yàn)證代碼
,如果把任何一個(gè)設(shè)為"false"提交頁(yè)面時(shí)都會(huì)產(chǎn)生js錯(cuò)誤,除非我們采用下面⑵的方法進(jìn)行聲明。
⑵
Ⅰ
在本頁(yè)面上聲明
<%@ 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的內(nèi)容為
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html:javascript dynamicJavascript="false" staticJavascript="true"/>
注:
dynamicJavascript
表示是否在頁(yè)面內(nèi)生成動(dòng)態(tài)的js,staticJavascript屬性代表是否在頁(yè)面內(nèi)生成靜態(tài)js。 如staticJavascript設(shè)為"true",則validator-rules.xml文件中的規(guī)則檢查生成的js代碼都會(huì)生成到本頁(yè)面內(nèi)。這樣本頁(yè)面會(huì)越來(lái)越大,一般最好是將staticJavascript設(shè)為"false", 將validator-rules.xml生成的js代碼填充到一個(gè)指定的jsp頁(yè)面(staticJavascript.jsp)中去。
附:
只有
dynamicJavascript="true" + staticJavascript="true"
才能生成完整的
js
驗(yàn)證代碼
,下面是⑵
Ⅰ
中dynamicJavascript="true"生成的參考代碼:
var bCancel = false;
function validateUserForm(form) {
??? if (bCancel) {
??????? return true;
??? } else {
??????? var formValidationResult;
??????? //
調(diào)用staticJavascript.jsp中staticJavascript="true"生成的js代碼
??????? formValidationResult = validateByte(form) && validateEmail(form);
??????? return (formValidationResult);
??? }
}
// validator-rules.xml
中定義了<validator name="byte"
// jsFunctionName="
ByteValidations
"/>
//
則生成js函數(shù)名稱為
formbean
名稱 + 下劃線 + jsFunctionName
function userForm_ByteValidations() {
??? this.a0 = new Array("byteValue", "Byte must be a byte.", new Function ("varName", " return this[varName];"));
}
// validator-rules.xml
文件中沒(méi)有定義jsFunctionName,<validator name="
email
"/>
//
則生成js函數(shù)名稱為
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) {
??? // ……
???
//
調(diào)用
userForm_
ByteValidations
()
??? // ……
}
function validateEmail(form) {
??? // ……
???
//
調(diào)用
userForm_
email
()
??? // ……
}
?
?
版權(quán)所有:(xiaodaoxiaodao)藍(lán)小刀?? xiaodaoxiaodao@gmail.com
不過(guò)struts這些東西,用到的時(shí)候再學(xué)也不遲,好生把面向?qū)ο蟛糠值膐oad,還有領(lǐng)域模型學(xué)好才是正道
主要是學(xué)到hibernate、spring的時(shí)候感覺(jué)遇到了不少瓶頸,對(duì)其中的流程了解不是很深刻,于是打算從基礎(chǔ)從頭開(kāi)始學(xué),先看struts,做個(gè)了解之后再看看基本的JDK,再了解一下java的內(nèi)部結(jié)構(gòu)~
一邊向上生長(zhǎng),一邊尋找樹(shù)的根~
Object Orient Analysis & Design,面向?qū)ο蟮姆治龊驮O(shè)計(jì)~
廈門民眾今天大游行,請(qǐng)看
廈門的消息請(qǐng)看:
http://news.google.cn/news?q=%E5%8E%A6%E9%97%A8+%E6%B8%B8%E8%A1%8C&complete=1&hl=zh-CN&newwindow=1&um=1&sa=X&oi=news&ct=title
代碼如下:
-----------------jsp中------------------------------
<%@ page language="java"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>
<html>
<head>
<title>JSP for DynaValidatorForm form</title>
</head>
<body>
<html:form action="/login">
name : <html:text property="name"/><html:errors property="loginForm.name"/><br/>
password : <html:password property="password"/><html:errors property="password"/><br/>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>
----------------------Action中------------------------
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
DynaValidatorForm loginForm = (DynaValidatorForm) form;
String forward=null;
if(loginForm.getString("name").equals("aaa")&&loginForm.getString("password").equals("111"))
forward="success";
else
forward="failed";
return mapping.findForward(forward);
}
}
-------------------------struts-config.xml----------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans >
<form-bean name="loginForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="name" type="java.lang.String" />
<form-property name="password" type="java.lang.String" />
</form-bean>
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="loginForm"
input="/form/login.jsp"
name="loginForm"
path="/login"
scope="request"
type="com.my.struts.action.LoginAction"
validate="true">
<forward name="success" path="/form/success.jsp" />
<forward name="failed" path="/form/login.jsp" />
</action>
</action-mappings>
<message-resources parameter="com.my.struts.ApplicationResources" />
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>
</struts-config>
------------------------ApplicationResources------------------
# Resources for parameter 'com.my.struts.ApplicationResources'
# Project P/Test
loginForm.name=name is required
我在頁(yè)面上不填任何數(shù)據(jù),報(bào)錯(cuò)信息沒(méi)有。
直接使用
<html:errors/>嘗試一下,如果不顯示任何錯(cuò)誤,則可能問(wèn)題出在配置文件里~~