簡單驗證從本質上說就是在服務端來驗證客戶端提交的form中的數據這種驗證只是對form中的數據規則進行檢查如必須輸入用戶ID價格不能小於或是對email格式的驗證在這個驗證過程中並不需要訪問數據庫因此簡單驗證需要在用戶提交form後並且在服務器處理form中的數據之前進行
在進行完簡單驗證後如果form中的數據不合法程序就會forward到指定的JSP頁(一般是包含form的頁面)並顯示相應的錯誤信息如果form中的數據完全正確程序就會繼續執行
一在validate方法中進行簡單驗證
在上一篇文章中我們知道Strutsx通過ActionForm的子類來封裝了客戶端提交的form中的數據而服務端程序只需要通過ActionForm的子類的對象實例就可以訪問form中的數據而如果不使用ActionForm類就必須通過request對象來獲得form中的數據通過這種封裝機制可以使代碼更容易理解然而ActionForm類不僅可以封裝form中的數據還可以通過ActionForm類的validate方法來驗證form中的數據validate方法的定義如下
public ActionErrors validate(ActionMapping mapping HttpServletRequest request)
當客戶端向服務端提交form後Servlet引擎首先通過ActionForm的子類的對象實例裝載form中的數據然後再調用validate方法進行驗證validate方法返回了一個ActionErrors對象這個對象相當於一個Map如果ActionErrors中沒有錯誤信息Servlet引擎就認為form中的數據是正確的這時服務端程序就會繼續執行如果ActionErrors中有錯誤信息程序就會跳轉到指定的錯誤頁面下面讓我們通過一個完整的例子來演示一下如何通過validate方法來驗證form中的數據實現這個例子需要如下五步
「第步」建立JSP頁面
在這一步將建立一個叫simpleValidationjsp的頁面這個JSP頁面用於采集用戶的輸入信息在<samples工程目錄>中建立一個simpleValidationjsp文件並編寫如下的代碼
<%@ page pageEncoding=GBK%>
<%@ taglib uri=html prefix=html%>
<html>
<head>
<title>注冊信息(測試簡單驗證)</title>
<style type=text/css>
text {
height: px;
width: px;
}
</style>
</head>
<body>
<html:form action=simpleValidation>
<table width=%>
<tr>
<td align=right width=%> 用戶名</td>
<td width=%>
<html:text property=user styleClass=text />
<font color=red><html:errors property=errorUser /></font>
</td>
</tr><tr /><tr />
<tr>
<td align=right>登錄密碼</td>
<td>
<html:password property=password styleClass=text />
<font color=red><html:errors property=errorPassword /></font>
</td>
</tr><tr /><tr />
<tr>
<td align=right>重復登錄密碼</td>
<td>
<html:password property=password styleClass=text />
<font color=red><html:errors property=errorPassword /></font>
</td>
</tr><tr /><tr />
<tr>
<td align=right>電子郵件</td>
<td>
<html:text property=email styleClass=text />
<font color=red><html:errors property=errorEmail /></font>
</td>
</tr><tr /><tr />
<tr>
<td align=right> <br> ${requestScopesuccess } </td>
<td align=left> <br> <html:submit value= 提交 /> </td>
</tr>
</table>
</html:form>
</body>
</html>
在啟動Tomcat後在IE的地址欄中輸入如下的URL
當通過上面的URL訪問simpleValidationjsp時並不能正確顯示用戶信息采集界面原因是<htmlform>標簽使用了一個simpleValidation當JSP轉換成Servlet時這個動作必須在strutsconfigxml文件中正確定義否則將拋出一個javaxservletjspJspException異常
「第步」建立simpleValidation動作
由於本例的著重點是簡單驗證因此simpleValidation動作並不需要處理更多的工作一個動作對應於一個動作類這個動作類一般是orgapachestrutsactionAction類的子類simpleValidation動作只做如下兩項工作
設置驗證成功後在目標頁中顯示的信息字符串(保存在request的屬性中)
跳轉到目標頁
simpleValidation動作對應的動作類是SimpleValidationAction在<samples工程目錄>srcaction目錄中建立一個SimpleValidationActionjava文件並輸入如下的代碼
package action;
import javaxservlethttp*;
import orgapachestrutsaction*;
public class SimpleValidationAction extends Action
{
public ActionForward execute(ActionMapping mapping ActionForm form
HttpServletRequest request HttpServletResponse response)
throws Exception
{
requestsetAttribute(success 提交成功!); // 設置在目標頁中顯示的信息字符串
return mappingfindForward(simple); // 跳轉到目錄頁(simple所指的JSP頁)
}
}
在編寫SimpleValidationAction類時應注意如下八點
要想在ActionForm類中進行驗證必須在ActionForm類的子類中覆蓋validate方法
validate方法在ActionForm類的對象實例裝載完用戶提交的數據後調用因此在調用validate方法時ActionForm類的屬性值已經是用戶提交的信息了所以可以直接使用這些屬性值進行驗證
在validate方法中驗證用戶提交的數據時要使用ActionErrors類的實例對象返回錯誤信息 ActionErrors類的構造方法的第二個參是一個ActionMessage類的對象實例而不是錯誤描述信息
ActionMessage類的構造方法的參數並不是錯誤描述信息而是錯誤描述信息的key具體的信息在Java屬性文件中(將在下一步實現)
使用ActionForm的屬性可以非常好地驗證字符串類型但對於其他的數據類型(如整型)的某些驗證卻不太適合如當用戶提交數據時本該提交一個整數但用戶卻提交了一個非整數信息對於這種情況在ActionForm類的對象實例中這個用戶提交的數據的值為雖然使用ActionForm類的屬性無法准確驗證這種情況但我們可以使用validate方法的第二個參數request的getParameter方法直接獲得客戶端提交的數據來進行驗證
如果ActionErrors對象中有錯誤信息在JSP中需要使用<htmlerrors>標簽顯示錯誤信息
Struts實際上是將ActionErrors對象以orgapachestrutsactionERROR作為鍵值保存在了request的屬性中因此<htmlerrors>標簽實際上是從request的屬性中獲得的錯誤信息描述如我們也可以通過如下的Java代碼來獲得produceID屬性的錯誤描述信息
<%
javautilIterator<orgapachestrutsactionActionMessage> it =
((orgapachestrutsactionActionErrors)request
getAttribute(orgapachestrutsactionERROR))get(productID);
outprintln(((orgapachestrutsutilPropertyMessageResources )request
getAttribute(orgapachestrutsactionMESSAGE))getMessage(errorproductIDblanknull));
%>
「第步」建立Java屬性文件
Java屬性文件相當於資源文件以key = value形式保存了在程序中需要的字符串信息Java屬性文件的擴展名為properties在<samples工程目錄>src目錄中建立一個struts目錄在struts目錄中建立一個ErrorDescriptionproperties文件並輸入如下的內容
ErrorDescriptionproperties
erroruserblank = User cant be null
errorpasswordblank = Password cant be null
nfirmation = Password doesnt match confirmation
erroremailblank = Email cant be null
erroremailinvalid = It is not a valid email address
「第步」配置strutsconfigxml文件
在本例中需要配置strutsconfigxml文件的三個標簽<formbean><action>和<messageresources>
配置<formbean>標簽
這個標簽用來定義ActionForm在<formbeans>標簽中加入如下所示的<formbean>標簽
<formbean name=simpleValidationForm type=actionformSimpleValidationForm />
配置<action>標簽
這個標簽用來定義Struts中的動作類在<actionmappings>標簽中加入如下所示的<action>標簽
<action name=simpleValidationForm path=/simpleValidation scope=request type=actionSimpleValidationAction
input=simpleValidationjsp>
<forward name=simple path=simpleValidationjsp />
</action>
<action>標簽中的屬性含義描述如下
name表示ActionForm的名稱也就是<formbean>標簽中的name屬性的值
path表示Struts動作必須以/開頭
scope表示ActionForm類的對象實例(在本例中是SimpleValidationForm類的對
象實例)保存的范圍這個屬性值只能取request和session默認值是session如果scope的值為request表示將SimpleValidationForm類的對象實例以simpleValidationForm作為鍵值保存到了request的屬性中如果scope的值為session表示不將SimpleValidationForm類的對象實例保存到request的屬性中但不管scope的值是request還是sessionStruts都會將SimpleValidationForm類的對象實例保存到session的屬性中
type表示SimpleValidationAction類的全名
input表示如果客戶端提交的數據未通過簡單驗證後要跳轉到的頁面也就是在
SimpleValidationForm類的validate方法中返回的ActionErrors對象中含有錯誤描述信息Struts會自動跳轉到input屬性所指的JSP頁面
<action>標簽中的子標簽<forward>定義了可以在動作類(在本例中就是SimpleValidationAction類)中讀取的forward頁的URL
配置<messageresources>標簽
這個標簽用來定義程序中所使用的屬性文件在strutsconfigxml文件的<strutsconfig>根節點中加入如下內容
<messageresources parameter=strutsErrorDescription />
其中parameter屬性表示屬性文件的路徑在本例中屬性文件ErrorDescriptionproperties位於struts目錄中因此parameter屬性的值為strutsErrorDescription擴展名properties不用寫其中也可以使用/或代替
下面我們測試一下這個例子程序首先啟動Tomcat然後在IE中輸入如下的URL
訪問上面的URL後的界面如圖所示
圖
在不輸入任何信息的情況下點擊確定按鈕後的界面如圖所示
圖
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28922.html