一、 引言
校驗(yàn)框架的根本目的是實(shí)現(xiàn)域校驗(yàn)。在Web應(yīng)用程序中有許多方法可以實(shí)現(xiàn)域校驗(yàn),總體上可以分為兩類:服務(wù)器端和客戶端。其中,Struts校驗(yàn)框架是適合于基于Java的Web應(yīng)用程序環(huán)境最好的框架之一。它可以使用服務(wù)器端校驗(yàn)來配置應(yīng)用程序并且使用在校驗(yàn)過程(在請(qǐng)求處理期間激活)中生成的錯(cuò)誤消息;而且它也可以通過在請(qǐng)求頁(yè)面上生成的JavaScript來實(shí)現(xiàn)客戶端校驗(yàn)。
AJAX是一種能異步地調(diào)用服務(wù)器并返回XML文檔的技術(shù),近來十分流行。它的重要優(yōu)點(diǎn)之一是能夠?qū)崿F(xiàn)數(shù)據(jù)的實(shí)時(shí)校驗(yàn)。
本文將主要探討如何使用AJAX技術(shù)進(jìn)一步增強(qiáng)現(xiàn)有Struts校驗(yàn)框架的功能。為此,我們必須開發(fā)幾個(gè)組件來實(shí)現(xiàn)選擇校驗(yàn)框架并且為客戶端生成指定格式的消息,還要開發(fā)一個(gè)處理錯(cuò)誤消息生成的標(biāo)簽庫(kù)。
二、 前提
你需要使用Windows操作系統(tǒng),并安裝Eclipse集成開發(fā)環(huán)境和Tomcat應(yīng)用程序服務(wù)器,還要確保在你的操作系統(tǒng)上已經(jīng)注冊(cè)了MSXML 3.0 ActiveX對(duì)象。另外,你還需要Struts庫(kù)(http://struts.apache.org)和JDOM庫(kù)(www.jdom.org,用于XML開發(fā)),請(qǐng)分別參考下面的圖1和圖2。
三、 服務(wù)器端
StrustsActionServlet
首先,我們必須用這個(gè)類擴(kuò)展org.apache.struts.action.ActionServlet類以創(chuàng)建一個(gè)servletMapping變量,并用此變量來存儲(chǔ)有關(guān)瀏覽器地址的action路徑的信息。當(dāng)添加代碼時(shí),我們必須把web.xml配置為一個(gè)用于應(yīng)用程序服務(wù)器的Web應(yīng)用程序描述器。
web.xml的配置如下:
相應(yīng)的StrutsActionServlet代碼看上去具有如下形式:
AjaxValidationRequestProcessor
為了支持現(xiàn)有的Struts框架,我們必須擴(kuò)展Struts包中的RequestProcessor類。為此,我們必須定制請(qǐng)求處理器,其一是因?yàn)槲覀儽仨殔^(qū)分怎樣實(shí)現(xiàn)校驗(yàn)-使用現(xiàn)有的Struts框架還是使用基于AJAX的方案;其二是因?yàn)槲覀儗⒃诜?wù)器和客戶端之間在有關(guān)如何攔截消息方面簽訂一種協(xié)約。在消息生成過程中,我們使用的是XML格式-這是一種很好的媒體消息發(fā)送格式。我們所使用的XML格式的定義如下:
XML Format
描述
· Identity是客戶端JavaScript的ID,用于指明消息應(yīng)該放置的位置。
· Description是服務(wù)器端生成錯(cuò)誤消息以后的結(jié)果。
首先,在處理映射前,我們需要從Web描述符中得到servlet映射配置信息。激活該過程后,應(yīng)用程序就著手準(zhǔn)備繼承自AjaxForm類的表單實(shí)例。接下來的處理將管理AJAX校驗(yàn)并且應(yīng)該進(jìn)行檢查以確保來自客戶端的請(qǐng)求沒有使用Struts校驗(yàn)框架。在請(qǐng)求期間另外要實(shí)現(xiàn),其一是處理收集的由客戶端發(fā)送到action表單的信息的填充問題;其二是通過使用已經(jīng)存在于父類AjaxValidationRequestProcessor(TilesRequestProcessor)中的現(xiàn)有Struts校驗(yàn)框架中的方法來處理校驗(yàn)問題。
TilesRequestProcessor中的校驗(yàn)過程將調(diào)用所有基于Struts校驗(yàn)框架的校驗(yàn)并且把a(bǔ)ction錯(cuò)誤保存到請(qǐng)求中。我們需要把a(bǔ)ction錯(cuò)誤分析成片斷并生成將被發(fā)送到客戶端的XML消息校驗(yàn)。既然我們想改變校驗(yàn)方式,那么在校驗(yàn)過程中,我們應(yīng)該檢查我們使用的是哪一種校驗(yàn)框架(見圖3)。
在此,我們把JDOM作為處理引擎并使用它生成XML消息。如圖4所示,當(dāng)開始校驗(yàn)并且所用校驗(yàn)框架是AJAX校驗(yàn)框架時(shí),接下來要進(jìn)行填充錯(cuò)誤消息并且構(gòu)建XML消息校驗(yàn)。
ErrorMessageHandler
這個(gè)類具有XML消息構(gòu)建器的功能,它基于identity和description屬性來構(gòu)建XML消息。在調(diào)用buildXMLMessage后,調(diào)用者就會(huì)準(zhǔn)備文檔并設(shè)置XML消息的根元素。這個(gè)類還有一個(gè)addNextXMLMessage函數(shù),這個(gè)函數(shù)負(fù)責(zé)把其它校驗(yàn)消息添加進(jìn)XML(見源代碼中的列表1)。
AjaxValidationRequestProcessor類中的process方法負(fù)責(zé)把響應(yīng)的content type設(shè)置為"text/xml"并且以字符串形式發(fā)送XML消息。該方法的代碼如列表2(見所附源碼)所示。
AjaxValidationRequestProcessor類中的processValidation方法負(fù)責(zé)填充action錯(cuò)誤并且基于XML格式約定為客戶端構(gòu)建消息。此函數(shù)的代碼如下所示:
構(gòu)建Taglib組件
· AjaxJavaScriptLibraryTag:該taglib組件負(fù)責(zé)生成客戶端基本的XMLHTTP控制器函數(shù)的JavaScript函數(shù)部分。
· AjaxErrorHtmlRenderTag:該taglib組件負(fù)責(zé)在JSP頁(yè)面上生成顯示錯(cuò)誤消息的區(qū)域。
配置Taglib定義
在開發(fā)完taglib組件后,我們需要使用如列表3(見所附源碼)的方式來配置taglib的tld文件。
五、 構(gòu)建JSP和Struts配置
為了模仿校驗(yàn)處理的結(jié)果,我們首先需要構(gòu)建描述層-這可以通過加入我們已經(jīng)構(gòu)建的taglib來實(shí)現(xiàn)。在本文實(shí)例中,我將盡力使用Struts提供的校驗(yàn)規(guī)則組件和表單本身的校驗(yàn)功能來給出一個(gè)校驗(yàn)的實(shí)例。現(xiàn)在,我們?cè)贘SP頁(yè)面中準(zhǔn)備5個(gè)文本框。第一到第四個(gè)文本框使用校驗(yàn)規(guī)則配置,第5個(gè)文本框使用來自action表單的校驗(yàn)過程。此外,我們還需要一個(gè)提交按鈕來實(shí)現(xiàn)提交表單后對(duì)此的模仿。注意,至此,現(xiàn)有的Struts校驗(yàn)仍然沒有使用AJAX。用戶接口如圖5所示。
六、 構(gòu)建Action和Action表單
對(duì)于Struts action,我們只需把它轉(zhuǎn)發(fā)到我們已經(jīng)構(gòu)建的JSP即可,相應(yīng)的action代碼具有如下類似形式:
如果輸入為空,那么Action表單代碼就對(duì)requiredText屬性進(jìn)行校驗(yàn)。記住,要從AjaxForm類中派生此表單類。此Action表單的validate方法看上去如下:
七、 應(yīng)用Struts校驗(yàn)規(guī)則
接下來要配置Struts校驗(yàn)規(guī)則,例如最小長(zhǎng)度,最大長(zhǎng)度,電子郵件和模式文本,等等。然后,把這些數(shù)據(jù)應(yīng)用于客戶端的輸入對(duì)象。這一部分相應(yīng)的配置類見列表4(詳見所附源碼)。
八、 校驗(yàn)處理流程
首先,客戶端初始化XMLHTTP組件以實(shí)現(xiàn)對(duì)服務(wù)器的請(qǐng)求。然后,一旦開始構(gòu)建用戶激活的事件,URL的參數(shù)就被發(fā)送給服務(wù)器。在結(jié)束構(gòu)建參數(shù)后,客戶端將依附oneadystatechange XMLHTTP事件來聽取(listen)來自服務(wù)器端的響應(yīng)。在接收響應(yīng)后,客戶端開始分析XML校驗(yàn)消息并且把該消息存放到適當(dāng)?shù)牡胤剑ㄒ妶D6)。
當(dāng)服務(wù)器接收請(qǐng)求時(shí),它就開始檢查AJAX校驗(yàn)的參數(shù)并且進(jìn)行校驗(yàn)。一旦完成校驗(yàn),生成的對(duì)象就被過濾到與用戶輸入對(duì)象相聯(lián)系的特定的錯(cuò)誤中。在過濾操作完成后,即刻生成XML消息并把該消息發(fā)送回客戶端(見圖7)。
九、 總結(jié)
在本文中,我們構(gòu)建了一個(gè)控制器,它能夠接收來自客戶端的異步請(qǐng)求并且加入Struts校驗(yàn)過程來生成action錯(cuò)誤對(duì)象。在生成錯(cuò)誤對(duì)象和XML消息(見圖8和圖9)之后,對(duì)于即將被校驗(yàn)的特定輸入對(duì)象的過濾操作立即執(zhí)行。
凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
、轉(zhuǎn)載請(qǐng)注明來處和原文作者。非常感謝。
校驗(yàn)框架的根本目的是實(shí)現(xiàn)域校驗(yàn)。在Web應(yīng)用程序中有許多方法可以實(shí)現(xiàn)域校驗(yàn),總體上可以分為兩類:服務(wù)器端和客戶端。其中,Struts校驗(yàn)框架是適合于基于Java的Web應(yīng)用程序環(huán)境最好的框架之一。它可以使用服務(wù)器端校驗(yàn)來配置應(yīng)用程序并且使用在校驗(yàn)過程(在請(qǐng)求處理期間激活)中生成的錯(cuò)誤消息;而且它也可以通過在請(qǐng)求頁(yè)面上生成的JavaScript來實(shí)現(xiàn)客戶端校驗(yàn)。
AJAX是一種能異步地調(diào)用服務(wù)器并返回XML文檔的技術(shù),近來十分流行。它的重要優(yōu)點(diǎn)之一是能夠?qū)崿F(xiàn)數(shù)據(jù)的實(shí)時(shí)校驗(yàn)。
本文將主要探討如何使用AJAX技術(shù)進(jìn)一步增強(qiáng)現(xiàn)有Struts校驗(yàn)框架的功能。為此,我們必須開發(fā)幾個(gè)組件來實(shí)現(xiàn)選擇校驗(yàn)框架并且為客戶端生成指定格式的消息,還要開發(fā)一個(gè)處理錯(cuò)誤消息生成的標(biāo)簽庫(kù)。
二、 前提
你需要使用Windows操作系統(tǒng),并安裝Eclipse集成開發(fā)環(huán)境和Tomcat應(yīng)用程序服務(wù)器,還要確保在你的操作系統(tǒng)上已經(jīng)注冊(cè)了MSXML 3.0 ActiveX對(duì)象。另外,你還需要Struts庫(kù)(http://struts.apache.org)和JDOM庫(kù)(www.jdom.org,用于XML開發(fā)),請(qǐng)分別參考下面的圖1和圖2。
![]() 圖1.AjaxForm類層次圖 |
![]() 圖2.ErrormessageHandler類層次圖 |
三、 服務(wù)器端
StrustsActionServlet
首先,我們必須用這個(gè)類擴(kuò)展org.apache.struts.action.ActionServlet類以創(chuàng)建一個(gè)servletMapping變量,并用此變量來存儲(chǔ)有關(guān)瀏覽器地址的action路徑的信息。當(dāng)添加代碼時(shí),我們必須把web.xml配置為一個(gè)用于應(yīng)用程序服務(wù)器的Web應(yīng)用程序描述器。
web.xml的配置如下:
... <servlet> <servlet-name>action</servlet-name> <servlet-class>net.sf.struts.servlet.StrutsActionServlet</servlet-class> ... <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> ... |
相應(yīng)的StrutsActionServlet代碼看上去具有如下形式:
public class StrutsActionServlet extends the ActionServlet. { public String getServletMapping() { return this.servletMapping; } } |
AjaxValidationRequestProcessor
為了支持現(xiàn)有的Struts框架,我們必須擴(kuò)展Struts包中的RequestProcessor類。為此,我們必須定制請(qǐng)求處理器,其一是因?yàn)槲覀儽仨殔^(qū)分怎樣實(shí)現(xiàn)校驗(yàn)-使用現(xiàn)有的Struts框架還是使用基于AJAX的方案;其二是因?yàn)槲覀儗⒃诜?wù)器和客戶端之間在有關(guān)如何攔截消息方面簽訂一種協(xié)約。在消息生成過程中,我們使用的是XML格式-這是一種很好的媒體消息發(fā)送格式。我們所使用的XML格式的定義如下:
XML Format
<?xml version="1.0" encoding="UTF-8"?> <message> <identity name=messageAreaId> <description> MessageValue </description> </identity> </message> |
描述
· Identity是客戶端JavaScript的ID,用于指明消息應(yīng)該放置的位置。
· Description是服務(wù)器端生成錯(cuò)誤消息以后的結(jié)果。
首先,在處理映射前,我們需要從Web描述符中得到servlet映射配置信息。激活該過程后,應(yīng)用程序就著手準(zhǔn)備繼承自AjaxForm類的表單實(shí)例。接下來的處理將管理AJAX校驗(yàn)并且應(yīng)該進(jìn)行檢查以確保來自客戶端的請(qǐng)求沒有使用Struts校驗(yàn)框架。在請(qǐng)求期間另外要實(shí)現(xiàn),其一是處理收集的由客戶端發(fā)送到action表單的信息的填充問題;其二是通過使用已經(jīng)存在于父類AjaxValidationRequestProcessor(TilesRequestProcessor)中的現(xiàn)有Struts校驗(yàn)框架中的方法來處理校驗(yàn)問題。
TilesRequestProcessor中的校驗(yàn)過程將調(diào)用所有基于Struts校驗(yàn)框架的校驗(yàn)并且把a(bǔ)ction錯(cuò)誤保存到請(qǐng)求中。我們需要把a(bǔ)ction錯(cuò)誤分析成片斷并生成將被發(fā)送到客戶端的XML消息校驗(yàn)。既然我們想改變校驗(yàn)方式,那么在校驗(yàn)過程中,我們應(yīng)該檢查我們使用的是哪一種校驗(yàn)框架(見圖3)。
![]() 圖3.控制器處理流程 |
在此,我們把JDOM作為處理引擎并使用它生成XML消息。如圖4所示,當(dāng)開始校驗(yàn)并且所用校驗(yàn)框架是AJAX校驗(yàn)框架時(shí),接下來要進(jìn)行填充錯(cuò)誤消息并且構(gòu)建XML消息校驗(yàn)。
![]() 圖4.過濾和XML校驗(yàn)生成過程 |
ErrorMessageHandler
這個(gè)類具有XML消息構(gòu)建器的功能,它基于identity和description屬性來構(gòu)建XML消息。在調(diào)用buildXMLMessage后,調(diào)用者就會(huì)準(zhǔn)備文檔并設(shè)置XML消息的根元素。這個(gè)類還有一個(gè)addNextXMLMessage函數(shù),這個(gè)函數(shù)負(fù)責(zé)把其它校驗(yàn)消息添加進(jìn)XML(見源代碼中的列表1)。
AjaxValidationRequestProcessor類中的process方法負(fù)責(zé)把響應(yīng)的content type設(shè)置為"text/xml"并且以字符串形式發(fā)送XML消息。該方法的代碼如列表2(見所附源碼)所示。
AjaxValidationRequestProcessor類中的processValidation方法負(fù)責(zé)填充action錯(cuò)誤并且基于XML格式約定為客戶端構(gòu)建消息。此函數(shù)的代碼如下所示:
... ActionErrors errors = (ActionErrors) request.getAttribute(Globals.ERROR_KEY); Locale locale = (Locale) request.getAttribute(Globals.LOCALE_KEY); generateXMLMessage(errors, identity, locale, sbXMLMessage); ... |
· AjaxJavaScriptLibraryTag:該taglib組件負(fù)責(zé)生成客戶端基本的XMLHTTP控制器函數(shù)的JavaScript函數(shù)部分。
· AjaxErrorHtmlRenderTag:該taglib組件負(fù)責(zé)在JSP頁(yè)面上生成顯示錯(cuò)誤消息的區(qū)域。
配置Taglib定義
在開發(fā)完taglib組件后,我們需要使用如列表3(見所附源碼)的方式來配置taglib的tld文件。
五、 構(gòu)建JSP和Struts配置
為了模仿校驗(yàn)處理的結(jié)果,我們首先需要構(gòu)建描述層-這可以通過加入我們已經(jīng)構(gòu)建的taglib來實(shí)現(xiàn)。在本文實(shí)例中,我將盡力使用Struts提供的校驗(yàn)規(guī)則組件和表單本身的校驗(yàn)功能來給出一個(gè)校驗(yàn)的實(shí)例。現(xiàn)在,我們?cè)贘SP頁(yè)面中準(zhǔn)備5個(gè)文本框。第一到第四個(gè)文本框使用校驗(yàn)規(guī)則配置,第5個(gè)文本框使用來自action表單的校驗(yàn)過程。此外,我們還需要一個(gè)提交按鈕來實(shí)現(xiàn)提交表單后對(duì)此的模仿。注意,至此,現(xiàn)有的Struts校驗(yàn)仍然沒有使用AJAX。用戶接口如圖5所示。
![]() 圖5.JSP校驗(yàn)頁(yè)面 |
六、 構(gòu)建Action和Action表單
對(duì)于Struts action,我們只需把它轉(zhuǎn)發(fā)到我們已經(jīng)構(gòu)建的JSP即可,相應(yīng)的action代碼具有如下類似形式:
public ActionForward execute(...) { return mapping.findForward("success"); } |
如果輸入為空,那么Action表單代碼就對(duì)requiredText屬性進(jìn)行校驗(yàn)。記住,要從AjaxForm類中派生此表單類。此Action表單的validate方法看上去如下:
public ActionErrors validate(...) { ActionErrors errors = new ActionErrors(); if (StringUtils.isEmpty(this.requiredText)) { errors.add("requiredText", new ActionError("error.required.input")); } request.setAttribute(Globals.ERROR_KEY, errors); } |
七、 應(yīng)用Struts校驗(yàn)規(guī)則
接下來要配置Struts校驗(yàn)規(guī)則,例如最小長(zhǎng)度,最大長(zhǎng)度,電子郵件和模式文本,等等。然后,把這些數(shù)據(jù)應(yīng)用于客戶端的輸入對(duì)象。這一部分相應(yīng)的配置類見列表4(詳見所附源碼)。
八、 校驗(yàn)處理流程
首先,客戶端初始化XMLHTTP組件以實(shí)現(xiàn)對(duì)服務(wù)器的請(qǐng)求。然后,一旦開始構(gòu)建用戶激活的事件,URL的參數(shù)就被發(fā)送給服務(wù)器。在結(jié)束構(gòu)建參數(shù)后,客戶端將依附oneadystatechange XMLHTTP事件來聽取(listen)來自服務(wù)器端的響應(yīng)。在接收響應(yīng)后,客戶端開始分析XML校驗(yàn)消息并且把該消息存放到適當(dāng)?shù)牡胤剑ㄒ妶D6)。
![]() 圖6.客戶端處理流程 |
當(dāng)服務(wù)器接收請(qǐng)求時(shí),它就開始檢查AJAX校驗(yàn)的參數(shù)并且進(jìn)行校驗(yàn)。一旦完成校驗(yàn),生成的對(duì)象就被過濾到與用戶輸入對(duì)象相聯(lián)系的特定的錯(cuò)誤中。在過濾操作完成后,即刻生成XML消息并把該消息發(fā)送回客戶端(見圖7)。
![]() 圖7.服務(wù)器端處理流程 |
九、 總結(jié)
在本文中,我們構(gòu)建了一個(gè)控制器,它能夠接收來自客戶端的異步請(qǐng)求并且加入Struts校驗(yàn)過程來生成action錯(cuò)誤對(duì)象。在生成錯(cuò)誤對(duì)象和XML消息(見圖8和圖9)之后,對(duì)于即將被校驗(yàn)的特定輸入對(duì)象的過濾操作立即執(zhí)行。
![]() 圖8.在Struts校驗(yàn)框架內(nèi)使用AJAX實(shí)現(xiàn)應(yīng)用程序校驗(yàn)測(cè)試 |
![]() 圖9.Struts校驗(yàn)框架用例 |
凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
、轉(zhuǎn)載請(qǐng)注明來處和原文作者。非常感謝。