一、 引言
校驗框架的根本目的是實現域校驗。在Web應用程序中有許多方法可以實現域校驗,總體上可以分為兩類:服務器端和客戶端。其中,Struts校驗框架是適合於基於Java的Web應用程序環境最好的框架之一。它可以使用服務器端校驗來配置應用程序並且使用在校驗過程(在請求處理期間激活)中生成的錯誤消息;而且它也可以通過在請求頁面上生成的JavaScript來實現客戶端校驗。
AJAX是一種能異步地調用服務器並返回XML文檔的技術,近來十分流行。它的重要優點之一是能夠實現數據的實時校驗。
本文將主要探討如何使用AJAX技術進一步增強現有Struts校驗框架的功能。為此,我們必須開發幾個組件來實現選擇校驗框架並且為客戶端生成指定格式的消息,還要開發一個處理錯誤消息生成的標簽庫。
二、 前提
你需要使用Windows操作系統,並安裝Eclipse集成開發環境和Tomcat應用程序服務器,還要確保在你的操作系統上已經注冊了MSXML 3.0 ActiveX對象。另外,你還需要Struts庫(http://struts.apache.org)和JDOM庫(www.jdom.org,用於XML開發),請分別參考下面的圖1和圖2。
圖1.AjaxForm類層次圖
StrustsActionServlet
首先,我們必須用這個類擴展org.apache.struts.action.ActionServlet類以創建一個servletMapping變量,並用此變量來存儲有關浏覽器地址的action路徑的信息。當添加代碼時,我們必須把web.xml配置為一個用於應用程序服務器的Web應用程序描述器。
web.xml的配置如下:
...相應的StrutsActionServlet代碼看上去具有如下形式:
public class StrutsActionServlet extends the ActionServlet.AjaxValidationRequestProcessor
為了支持現有的Struts框架,我們必須擴展Struts包中的RequestProcessor類。為此,我們必須定制請求處理器,其一是因為我們必須區分怎樣實現校驗-使用現有的Struts框架還是使用基於AJAX的方案;其二是因為我們將在服務器和客戶端之間在有關如何攔截消息方面簽訂一種協約。在消息生成過程中,我們使用的是XML格式-這是一種很好的媒體消息發送格式。我們所使用的XML格式的定義如下:
XML Format
<?xml version="1.0" encoding="UTF-8"?>描述
TilesRequestProcessor中的校驗過程將調用所有基於Struts校驗框架的校驗並且把action錯誤保存到請求中。我們需要把action錯誤分析成片斷並生成將被發送到客戶端的XML消息校驗。既然我們想改變校驗方式,那麼在校驗過程中,我們應該檢查我們使用的是哪一種校驗框架(見圖3)。
圖3.控制器處理流程
在此,我們把JDOM作為處理引擎並使用它生成XML消息。如圖4所示,當開始校驗並且所用校驗框架是AJAX校驗框架時,接下來要進行填充錯誤消息並且構建XML消息校驗。
圖4.過濾和XML校驗生成過程
ErrorMessageHandler
這個類具有XML消息構建器的功能,它基於identity和description屬性來構建XML消息。在調用buildXMLMessage後,調用者就會准備文檔並設置XML消息的根元素。這個類還有一個addNextXMLMessage函數,這個函數負責把其它校驗消息添加進XML(見源代碼中的列表1)。
AjaxValidationRequestProcessor類中的process方法負責把響應的content type設置為"text/xml"並且以字符串形式發送XML消息。該方法的代碼如列表2(見所附源碼)所示。
AjaxValidationRequestProcessor類中的processValidation方法負責填充action錯誤並且基於XML格式約定為客戶端構建消息。此函數的代碼如下所示:
ActionErrors errors = (ActionErrors) request.getAttribute(Globals.ERROR_KEY);四、 客戶端
構建Taglib組件
配置Taglib定義
在開發完taglib組件後,我們需要使用如列表3(見所附源碼)的方式來配置taglib的tld文件。
五、 構建JSP和Struts配置
為了模仿校驗處理的結果,我們首先需要構建描述層-這可以通過加入我們已經構建的taglib來實現。在本文實例中,我將盡力使用Struts提供的校驗規則組件和表單本身的校驗功能來給出一個校驗的實例。現在,我們在JSP頁面中准備5個文本框。第一到第四個文本框使用校驗規則配置,第5個文本框使用來自action表單的校驗過程。此外,我們還需要一個提交按鈕來實現提交表單後對此的模仿。注意,至此,現有的Struts校驗仍然沒有使用AJAX。用戶接口如圖5所示。
圖5.JSP校驗頁面
六、 構建Action和Action表單
對於Struts action,我們只需把它轉發到我們已經構建的JSP即可,相應的action代碼具有如下類似形式:
public ActionForward execute(...) {如果輸入為空,那麼Action表單代碼就對requiredText屬性進行校驗。記住,要從AjaxForm類中派生此表單類。此Action表單的validate方法看上去如下:
public ActionErrors validate(...) {
七、 應用Struts校驗規則
接下來要配置Struts校驗規則,例如最小長度,最大長度,電子郵件和模式文本,等等。然後,把這些數據應用於客戶端的輸入對象。這一部分相應的配置類見列表4(詳見所附源碼)。
八、 校驗處理流程
首先,客戶端初始化XMLHTTP組件以實現對服務器的請求。然後,一旦開始構建用戶激活的事件,URL的參數就被發送給服務器。在結束構建參數後,客戶端將依附oneadystatechange XMLHTTP事件來聽取(listen)來自服務器端的響應。在接收響應後,客戶端開始分析XML校驗消息並且把該消息存放到適當的地方(見圖6)。
當服務器接收請求時,它就開始檢查AJAX校驗的參數並且進行校驗。一旦完成校驗,生成的對象就被過濾到與用戶輸入對象相聯系的特定的錯誤中。在過濾操作完成後,即刻生成XML消息並把該消息發送回客戶端(見圖7)。
圖7.服務器端處理流程
九、 總結
在本文中,我們構建了一個控制器,它能夠接收來自客戶端的異步請求並且加入Struts校驗過程來生成action錯誤對象。在生成錯誤對象和XML消息(見圖8和圖9)之後,對於即將被校驗的特定輸入對象的過濾操作立即執行。
圖8.在Struts校驗框架內使用AJAX實現應用程序校驗測試
圖9.Struts校驗框架用例