AJAXを使用したStruts検証フレームワーク


リアルタイムデータ検証はAJAX技術の大きなメリットの一つです.このテクノロジーを適用すると、struts検証フレームワークはstruts MVCを強化し、Webアプリケーションをデスクトップアプリケーションに近づけます.
この検証フレームワークは、フィールドを検証するために使用されます.Webアプリケーションで検証する方法はたくさんあります.これらのメソッドは、サーバ側メソッドとクライアント側メソッドの2つに分類されます.Struts検証フレームワークは、JavaベースのWebアプリケーション環境に最適なフレームワークの1つです.サーバ側の検証とエラー・メッセージを使用してアプリケーションを構成できます.このエラー・メッセージは、要求を処理するときに呼び出された検証プロセスに表示されます.また、要求ページに表示されるJavaScriptを使用してクライアント検証を行うこともできます.
AJAXは、サーバを非同期で呼び出し、XMLドキュメントを取得できるJavaScriptテクノロジーで、最近非常に流行しています.その用途の1つは、リアルタイムのデータ検証です.
この文書では、AJAXを使用して既存のstruts検証フレームワークを強化することに注目します.コントローラなどのいくつかのコンポーネントを開発して、検証フレームワークを選択し、クライアント用の特定のフォーマットのメッセージとラベルライブラリ(エラーメッセージのレンダリングを処理)を表示する必要があります.
必要条件
EclipseとTomcatアプリケーションサーバを備えたWindowsシステムが必要です.オペレーティングシステムにMSXML 3.0 ActiveXオブジェクトが登録されていることを確認してください.XML開発のためのStrutsライブラリ(http://struts.apache.org)およびJDOMライブラリ(www.jdom.org)も必要である(図1および図2参照).
サーバー側のシーン
StrustsActionServlet
orgから拡張しなければなりませんapache.struts.action.ActionServiceletのクラスは、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メッセージが構築されます.呼び出し元がbuildXMLメッセージを呼び出すと、ドキュメントが準備され、XMLメッセージのルート要素が設定されます.このクラスにはaddNextXML Message関数もあり、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形式契約に基づいてメッセージが構築されます.A jaxValidationRequestProcessorコードのprocessValidation関数は次のようになります.
      ...
    ActionErrors errors = (ActionErrors) request.getAttribute(Globals.ERROR_KEY);
    Locale locale = (Locale) request.getAttribute(Globals.LOCALE_KEY);
    generateXMLMessage(errors, identity, locale, sbXMLMessage);
    ... 
    

    クライアントシーン
    ラベルライブラリコンポーネントの構築
  • AjaxJavaScriptLibraryTag:このラベル・ライブラリ・コンポーネントは、基本XMLTTPコントローラ機能を実現するためにクライアントにJavaScript機能を示します.
  • 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ページの下にあるテキストボックスを5つ用意します.1番目から4番目のテキスト・ボックスは検証ルール構成を使用し、5番目のテキスト・ボックスはアクション・フォームからの検証プロセスを使用します.それ以外に、フォームのコミット後にシミュレーションするコミットボタンが必要です.既存の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/400とAIXオペレーティングシステムを使用したレガシーアプリケーションの統合と接続に専念しています.
    
    Listing 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);
        }
    
    Listing 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);
            }
        }
    
    Listing 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>
    
    Listing 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___9lt;/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>