使用AJAX的Struts驗證架構--即時資料驗證是AJAX技術的一大優勢

來源:互聯網
上載者:User
使用AJAX的Struts驗證架構--即時資料驗證是AJAX技術的一大優勢

作者: Sonny Hastomo

即時資料驗證是AJAX技術的一大優勢之一。通過應用此技術,struts驗證架構將增強struts MVC,並使Web應用程式更接近於傳統型應用程式。

  此驗證架構用於驗證欄位。有許多在Web應用程式上進行驗證的方法。這些方法可分為兩類:伺服器端方法和用戶端方法。Struts驗證架構是面 向基於Java的Web應用環境的最佳架構之一。它能夠配置應用程式,方法是使用伺服器端驗證和錯誤訊息,此錯誤訊息在處理請求時呈現在調用的驗證流程 上,它還能夠進行用戶端驗證,方法是使用請求頁面上呈現的JavaScript。

  AJAX是一種JavaScript技術,它能夠非同步呼叫伺服器並擷取XML文檔,這類文檔最近非常流行。其用途之一就是即時資料驗證。

  本文關注使用AJAX增強現有struts驗證架構。必須開發幾個組件(例如控制器),以選擇驗證架構,並呈現特定格式的訊息(用於用戶端)和標籤庫(處理錯誤訊息呈現)。 必要條件

  需要一個具有Eclipse和Tomcat應用伺服器的Windows系統。請確定已在作業系統中註冊了MSXML 3.0 ActiveX對象。還需要Struts庫(http://struts.apache.org)和JDOM庫(www.jdom.org),以用於XML開發(參見圖1和圖2)。

伺服器端情境 StrustsActionServlet

  我們必須擴充來自 org.apache.struts.action.ActionServlet的類,以獲得servletMapping變數,此變數儲存關於如何針對 動作類將該擴充格式化為瀏覽器地址形式的移動路徑的資訊。當添加代碼時,我們必須將web.xml配置為應用伺服器的Web應用程式描述項。

  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>
...
StrutsActionServlet Java代碼如下:
public class StrutsActionServlet extends the ActionServlet.
{
public String getServletMapping() {
return this.servletMapping;
}
}
AjaxValidationRequestProcessor

  要在第一步中支援現有Struts框 架,我們必須擴充來自Struts軟體包的RequestProcessor。我們必須定製化此要求處理常式,因為我們必須判別將如何進行驗證(通過使用現 有Struts架構,還是利用AJAX概念),還因為我們將在伺服器和用戶端之間制訂一個有關如何解釋訊息的契約。在訊息呈現方面,我們將使用XML格 式,這是一種很好的媒體訊息傳遞格式。我們將應用的XML格式的定義是:

  XML Format

  XML Format
<?xml version="1.0" encoding="UTF-8"?>
<message>
<identity name=messageAreaId>
<description>
MessageValue
</description>
</identity>
</message>
描述 Identity是用戶端JavaScript用於瞭解訊息將被置於何處的ID。 Description是在伺服器端呈現錯誤訊息後的結果。

  首先我們需要在繼續流程映射之前,從Web描述符獲得servlet映射配置。調用此流程後,應用程式將準備表單一實例,此執行個體繼承自 AjaxForm類。這一處理管理AJAX驗證,並且應進行檢查以確定來自用戶端的請求沒有使用struts驗證架構。其他在請求過程中執行的流程是流程 填充(用於收集用戶端發送到動作表單的資訊)和流程驗證(通過使用現有Struts驗證架構中已經存在於 AjaxValidationRequestProcessor的父類TilesRequestProcessor中的方法)。

  來自 TilesRequestProcessor的驗證流程將調用所有基於struts驗證架構的驗證,並將動作錯誤儲存到請求。我們需要仔細分析動作錯誤, 並產生XML訊息驗證,此驗證將被發送到用戶端。因為我們希望更改支援驗證的行為方式,所以驗證流程應檢查所用的驗證架構的指標(參見圖3)。

  使用JDOM作為處理引擎,產生XML訊息。如圖4所示,如果流程驗證被調用,且驗證架構的條件等同於AJAX驗證架構,則流程將繼續填充錯誤訊息並構建XML訊息驗證。

ErrorMessageHandler

  該類處理XML訊息產生器的功能。此Java類將構建基於identity和 description屬性的XML訊息。調用方調用了buildXMLMessage之後,它將準備文檔並設定XML訊息的根項目。此類還具有一個 addNextXMLMessage函數,以將更多驗證訊息添加到XML(參見清單1)。

  清單1

  ...
public void buildXMLMessage() throws ParserConfigurationException {

// initiate document builder to prepare the media of XML Message
this.rootElement = new Element(CONSTANT_MESSAGE);

addNextXMLMessage();

}
...
public void addNextXMLMessage() throws ParserConfigurationException {

// creating the xml message based on format above
Element identityElement = new Element(CONSTANT_IDENTITY);

identityElement.setAttribute(CONSTANT_NAME, this.identity);

Element descriptionElement = new Element(CONSTANT_DESCRIPTION);
descriptionElement.addContent(this.description);
identityElement.addContent(descriptionElement);
rootElement.addContent(identityElement);
}

  此流程方法將響應的內容類型設定為“text/xml”,並將XML訊息作為字串發送。AjaxValidationRequestProcessor代碼上的流程函數如清單2所示。

  清單2

  public void process(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException
{
if ( request.getParameter(CONSTANT_VALIDATION_FRAMEWORK_ARG) != null )
{
...
this.processValidate(req, resp, form, mapping);
response.setContentType(CONSTANT_XML_CONTENT_TYPE);
response.getWriter().write(sbXMLMessage.toString());
response.flushBuffer();

}
} else
{
super.process(req, resp);
}
}
processValidation方法將填充

  動作錯誤,並基於面向用戶端的XML格式契約構建訊息。AjaxValidationRequestProcessor代碼上的processValidation函數如下所示:

  ...
ActionErrors errors = (ActionErrors) request.getAttribute(Globals.ERROR_KEY);
Locale locale = (Locale) request.getAttribute(Globals.LOCALE_KEY);
generateXMLMessage(errors, identity, locale, sbXMLMessage);
...
用戶端情境 構建標籤庫組件 AjaxJavaScriptLibraryTag:此標籤庫組件在用戶端轉譯JavaScript功能,以實現基本XMLHTTP控制器功能。 AjaxErrorHtmlRenderTag:此標籤庫組件在JSP頁面呈現錯誤訊息地區。 配置標籤庫定義

  開發出標籤庫組件之後,我們需要配置清單3中顯示的標籤庫tld檔案。

  清單3

  <taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>ajaxLib</shortname>

<tag>
<name>library</name>
<tagclass>net.sf.ajax.taglib.AjaxJavaScriptLibrary
</tagclass>
<bodycontent>JSP</bodycontent>
</tag>

<tag>
<name>error</name>
<tagclass>net.sf.ajax.taglib.AjaxErrorHtmlRender
</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>property</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>event</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>

</taglib>
構建JSP和Struts配置

  要類比驗證處理的結果,我們首先需要構建呈現層,方法是合并我們已經構建的標籤庫。在此例中, 我試圖給出一個樣本驗證(通過使用來自Struts的驗證規則組件)以及來自表單本身的驗證。準備五個JSP頁面下的文字框。第一個到第四個文字框使用驗 證規則配置,第五個文字框使用來自動作表單的驗證流程。除此之外,我們還需要一個提交按鈕,以在提交表單後類比它,現有的struts驗證仍在沒有 AJAX的情況下工作。使用者介面外觀如圖5所示。

構建動作和動作表單

  為獲得Struts動作,我們轉到已經構建的JSP。此動作代碼如下所示:

  public ActionForward execute(...) {
return mapping.findForward("success");
}

  如果輸入為空白,則此動作表單代碼將驗證requiredText屬性。請記住,要從AjaxForm類擴充此表單。動作表單的驗證方法如下所示:

  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);
}
應用Struts驗證規則

  配置Struts驗證規則(例如最小長度、最大長度、電子郵件和模式文本)將應用於用戶端的輸入對象,且配置與清單4類似。

  清單4

  <field property="paternText"
depends="required,mask">
<arg0 key="label.paternText"/>
<var>
<var-name>mask</var-name>
<var-value>^[0-9]{3}-[0-9]{2}___FCKpd___8lt;/var-value>
</var>
</field>
<field property="minLength"
depends="minlength">
<arg0 key="label.minLength"/>
<arg1 key="${var:minlength}" resource="false"/>
<var>
<var-name>minlength</var-name>
<var-value>5</var-value>
</var>
</field>

<field property="maxLength"
depends="maxlength">
<arg0 key="label.maxLength"/>
<arg1 key="${var:maxlength}" resource="false"/>
<var>
<var-name>maxlength</var-name>
<var-value>5</var-value>
</var>
</field>

<field property="email"
depends="email">
<arg0 key="label.email"/>
</field>
驗證處理流

  首先用戶端會初始化XMLHTTP組件以執行到伺服器的請求,然後在使用者觸發器開始構建時,URL參數將被發送到 伺服器。在完成構建參數後,用戶端會串連oneadystatechange XMLHTTP事件,以偵聽來自伺服器端的響應。收到響應後,用戶端會開始分析XML驗證訊息,並將訊息放置到正確的地區(參見圖6)。

  如果請求被伺服器接受,則伺服器會開始檢查AJAX驗證條件的參數,並處理驗證。完成之後,將從產生的錯誤對象過濾出與使用者輸入對象相關的特定錯誤。在過濾流程完成之後,將產生XML訊息,並發送回用戶端(參見圖7)。

結束語

  在本文中,我們構建了一個控制器,它能夠接收來自用戶端的非同步請求,併合並struts驗證流程以產生動作錯誤對象。在產生錯誤對象並產生作為應答返回用戶端以指示錯誤訊息的XML訊息之後,將對被驗證的特定輸入對象進行過濾(參見圖8和圖9)。

原文出處:http://jdj.sys-con.com/read/171472.htm  

作者簡介
  Sonny Hastomo 是Sigma Cipta Caraka公司面向銀行解決方案的電子交付通道團隊的產品開發顧問,他目前專註於使用OS/200和AIX作業系統的遺留應用程式的整合和串連。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.