已經轉移到 好·色之徒--我的博客、我的生活
(說明)這里采用了最新版本
struts-1.2.7
,是在
struts-blank
的基礎上演示的,為了以后的學習和參考用。
?
一、
在對應的
Form Baens
中重載
validate
方法
在
struts-config.xml
文件中,
action
節點下有“
validate
”這樣一個屬性。在
struts
框架中,默認屬性是
validate=”true”
。所以如果想通過
Form Baens
的重載
validate
方法來驗證數據的話,可以不用理會這一點。題外話:如果你在
struts-config.xml
文件中,設置
validate="false"
的話,
validate
方法將不起作用。這一點同樣對
Validate
框架來驗證數據起作用。
?
二、
通過
Validate
框架來驗證數據
1
、
首先在
struts-config.xml
文件中,追加如下代碼:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
? <set-property property="pathnames"
??
?
?????value="/WEB-INF/validator-rules.xml,/WEB-INF/validations.xml"/>
? <set-property property="stopOnFirstError" value="false"/>
</plug-in>
?
2
、然后編寫自己的
Form Baens
,有兩種方式可供選擇:
①
寫的
formBaen
需要繼承
ValidatorForm
,而不是第一種方法中的
ActionForm
public class UserForm extends ValidatorForm {
??????
????????????? private String userId = "";
??????
????????????? private String password = "";
??????
????????????? public void setUserId(String userId) {
????????????????????
????????????? this.userId = userId;
??????
????????????? }
??????
????????????? public String getUserId() {
????????????????????
????????????? return userId;
??????
????????????? }
????????????????????
。。。。。。
??????
??
然后配置
struts-config
文件
??????? <form-bean? name="userForm"
???????
????type="com.wxhx.presentation.UserForm"/>
②
配置
struts-config
文件
<form-beans>
?
??????<form-bean name=" userForm"
??????????? type="org.apache.struts.validator.DynaValidatorForm">
??
????????
?
???<form-property name=" userId" type="java.lang.String"/>
??
????????
?
???<form-property name="password" type="java.lang.String"/>
?
??????????? </form-bean>
</form-beans>
3
、配置
validation.xml
文件
?????? <formset>
??????
??? <form name="userForm">? ----
這里的
userForm
是
Form Beans
的名字
??????????? <field
??????????????? property="userId"
??????????????? depends="required">
??????????????????? <arg key="userForm.userId"/>
??????????? </field>
??????????? <field
??????????????? property="password"
??????????????? depends="required,mask">
??????????????????? <arg key="userForm.password"/>
??????????????????? <var>
???????
????????????????<var-name>mask</var-name>
??????????????????????? <var-value>^[0-9a-zA-Z]*$</var-value>
??????????????????? </var>
??????????? </field>
??????? </form>
?????? </formset>
??????
其中
key="userForm.userId"
和
key="userForm.password"
需要在資源文件中配置
??????
這里需要說明一點,例如:
<arg key="userForm.password" resource="false"/>
如果多了
resource="false"
這句話,那么它不會再從資源文件中去取,而是直接用
key
值來表示。
?
以上是通過
validatorForm- or DynaValidatorForm
來實現
Validate
驗證的
?
(附)
現在有這樣一個問題,
Form Beans
可以被多個
Action
應用,而每個
Action
可能需要的驗證字段都不一樣。而在
validation.xml
中配置的驗證方式(如
<form name="userForm">
)是對這個
Form Beans
進行的。這樣的話,如何來驗證呢?
你的
Form Beans
可以繼承
ValidatorActionForm
(當然可以直接配置
DynaValidatorActionForm
)。如下所示:
public class UserForm extends ValidatorActionForm {
? ...
}
或是
<form-bean name=" userForm "
????????? type="org.apache.struts.validator.DynaValidatorActionForm">
? ...
</form-bean>
?
struts-config
文件配置如下:
<action-mappings>
? <action path="/technology/createUser"
???????? type="com.wxhx.minihr.CreateUserAction"
???????? name="userForm"/>
?
? <action path="/technology/editUser"
???????? type="com.wxhx.minihr.EditUserAction"
???????? name="userForm"/>
</action-mappings>
?
validation.xml
文件配置如下:
<formset>
? <form name="/technology/ createUser ">
----
這里的采用的是
action
的
path
路徑
??? <field property="city"
????????? depends="required">
????? <arg0 key="prompt.city"/>
??? </field>
? </form>
? <form name="/technology/editUser ">
??? <field property="state"
????????? depends="required">
????? <arg0 key="prompt.state"/>
??? </field>
? </form>
</formset>
?
關于
validator-rules.xml
,定義了常用的一些規則,當然也可以自己追加新的規則。
這里經常會看到
msg="errors.required"
字樣,也是通過資源文件中配置的,默認的資源如下:
# -- validator --
errors.invalid={0} is invalid.
errors.maxlength={0} can not be greater than {1} characters.
errors.minlength={0} can not be less than {1} characters.
errors.range={0} is not in the range {1} through {2}.
errors.required={0} is required.
errors.byte={0} must be an byte.
errors.date={0} is not a date.
errors.double={0} must be an double.
errors.float={0} must be an float.
errors.integer={0} must be an integer.
errors.long={0} must be an long.
errors.short={0} must be an short.
errors.creditcard={0} is not a valid credit card number.
errors.email={0} is an invalid e-mail address.
這在
struts-blank
的例子中會有,在開發項目的時候,注意這些默認資源
關于自己定義規則,以后再作研究
?
三、
結合上面的兩種驗證
如果即在
Form Beans
中重載了
validate
方法,又啟用了
Validate
框架,那會是什么效果呢?
由于要啟用
Validate
框架,
Form Beans
需要繼承
ValidatorForm
,查看
ValidatorForm
的源代碼,發現
validate
方法已經作了處理(真是為
Validate
框架所服務的)。
那么在
Form Beans
中重載了
validate
方法的話,就會覆蓋原有
ValidatorForm
中對應的功能,所以如果想一起用的話,需要在
Form Beans
的
validate
方法中調用
errors = super.validate(mapping, request);
這句代碼是啟用
Validate
框架所要做的工作,然后可以判斷
errors
再作下一步的處理。
當然也可以先做
Form Beans
中的
validate
方法,然后啟用
Validate
框架,要看具體情況而定。
?
四、
啟用客戶端驗證
也是結合
validation.xml
來驗證的,我把
validation.xml
相關的內容在復制下來,便于看清楚:
?????? <formset>
??????
??? <form name="userForm">? ----
這里的
userForm
是
Form Beans
的名字
??????????? <field
??????????????? property="userId"
??????????????? depends="required">
??????????????????? <arg key="userForm.userId"/>
??????????? </field>
??????????? <field
??????????????? property="password"
??????????????? depends="required,mask">
??????????????????? <arg key="userForm.password"/>
??????????????????? <var>
??????????????????????? <var-name>mask</var-name>
??????????????????????? <var-value>^[0-9a-zA-Z]*$</var-value>
??????????????????? </var>
??????????? </field>
??????? </form>
</formset>
?
①
在需要
客戶端驗證的
jsp
中加上這么一句
<html:javascript formName="
userForm
"/>
其中
formName
就是
validation.xml
中
<form name="userForm">
所對應的內容
②在
<html:form
中追加一個屬性
onsubmit="return validateUserForm(this);"
它的語法為:
return validate + struts-config.xml
中定義的
form-bean
名稱
+ (this);
③追加
<scriptlanguage="Javascript1.1"? src="staticJavascript.jsp"></script>
staticJavascript.jsp
的內容為:
<%@ page language="java" %>
<%-- set document type to Javascript(addresses a bug in Netscape according
to a web resource --%>
<%@ page contentType="application/x-javascript" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html:javascript dynamicJavascript="false" staticJavascript="true"/>
這只是一種方式,還有其他簡潔的(具體為啥這樣,不是很明白,希望得到高人指點)
比如:追加
onsubmit="return validateUserForm(this);"
<html:javascript formName="userForm" ?staticJavascript="true"/>