【ハウツー】

サーバサイドでDOMを活用! 自由度が高いAjaxフレームワーク「ItsNat」

2 "エコーアプリケーション"で作法をつかむ

    竹添直樹  [2009/03/04]

    ItsNatでアプリケーションを作ってみよう

    続いて実際に簡単なアプリケーションを作成しながらItsNatの使い方を見ていこう。作成するのは図4のようなエコーアプリケーションだ。テキストフィールドに文字列を入力してボタンをクリックするとメッセージが表示される。

    図4: 作成するアプリケーション

    まずはリクエストを受け付けるためのサーブレットを作成する(リスト1)。サーブレットはorg.itsnat.core.http.HttpServletWrapperクラスを継承し、init()メソッドをオーバーライドする。init()メソッドではItsNatの初期設定や、HTMLテンプレートの登録といった処理を行う。

    リスト1: MyServlet.java

    public class MyServlet extends HttpServletWrapper {
    
      public void init(ServletConfig config) throws ServletException {
        super.init(config);
    
        // ItsNatの初期設定
        ItsNatHttpServlet itsNatServlet = getItsNatHttpServlet();
        ItsNatServletConfig itsNatConfig = itsNatServlet.getItsNatServletConfig();
    
        itsNatConfig.setDebugMode(false);
        itsNatConfig.setClientErrorMode(
          ClientErrorMode.SHOW_SERVER_AND_CLIENT_ERRORS);
        itsNatConfig.setLoadScriptInline(true);
        itsNatConfig.setFastLoadMode(true);
        itsNatConfig.setDefaultSyncMode(SyncMode.ASYNC_HOLD);
        itsNatConfig.setAJAXTimeout(-1);
        itsNatConfig.setOnLoadCacheStaticNodes("text/html", true);
        itsNatConfig.setOnLoadCacheStaticNodes("text/xml", false);
        itsNatConfig.setNodeCacheEnabled(true);
        itsNatConfig.setAddFrameworkScriptFiles(true);
        itsNatConfig.setFrameworkScriptFilesBasePath("js");
        itsNatConfig.setDefaultEncoding("UTF-8");
        itsNatConfig.setUseGZip(UseGZip.SCRIPT);
        itsNatConfig.setDefaultDateFormat(
            DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.US));
        itsNatConfig.setDefaultNumberFormat(NumberFormat.getInstance(Locale.US));
        itsNatConfig.setEventDispatcherMaxWait(0);
        itsNatConfig.setAJAXEnabled(true);
            itsNatConfig.setScriptingEnabled(true);
        itsNatConfig.setUsePatternMarkupToRender(false);
        itsNatConfig.setAutoCleanEventListeners(true);
    
        ItsNatServletContext itsNatCtx = itsNatConfig.getItsNatServletContext();
        itsNatCtx.setMaxOpenDocumentsBySession(-1);
    
        // テンプレートの登録
        String pathPrefix = getServletContext().getRealPath("/");
        pathPrefix += "WEB-INF/pages/manual/";
    
        ItsNatDocumentTemplate docTemplate;
        docTemplate = itsNatServlet.registerItsNatDocumentTemplate(
            "manual.core.example","text/html", pathPrefix + "sample.html");
    
        // リスナの登録
        docTemplate.addItsNatServletRequestListener(new SampleListener());  
      }
    
    }
    

    サーブレットで登録しているHTMLの内容はリスト2の通りだ。NetBeans上では/itsnat/Webページ/WEB-INF/pages/manualの配下にsample.htmlとして作成しておく。

    リスト2:sample.html

    <html>
      <head>
        <title>ItsNatのサンプル</title>
      </head>
      <body>
        <div itsnat:nocache="true" xmlns:itsnat="http://itsnat.org/itsnat">
          お名前をどうぞ:
          <input type="text" id="name"/>
          <input type="button" id="click" value="クリック!"/>
          <div id="result"></div>
        </div>
      </body>
    </html>
    

    続いてリスト1の最後で登録しているリスナのソースコードを見てみよう(リスト3)。実際の処理はSampleProcessorに移譲していることがわかる。

    リスト3:SampleListener.java

    public class SampleListener implements ItsNatServletRequestListener {
      public void processRequest(ItsNatServletRequest request,
          ItsNatServletResponse response) {
        ItsNatHTMLDocument itsNatDoc = 
          (ItsNatHTMLDocument) request.getItsNatDocument();
        new SampleProcessor(itsNatDoc);
      }
    }
    

    SampleProcessorのソースコードはリスト4の通りだ。テキストフィールドと結果表示用のdiv要素をあらかじめ取得しておき、ボタンのclickイベントにリスナを登録している。ボタンがクリックするとここで登録しているリスナのhandleEvent()メソッドが呼び出され、div要素にメッセージが挿入されるという仕組みだ。

    リスト4:SampleProcessor.java

    public class SampleProcessor {
    
      private ItsNatHTMLDocument itsNatDoc;
      private ItsNatHTMLInputText input;
      private Element result;
    
      public SampleProcessor(ItsNatHTMLDocument itsNatDoc) {
        this.itsNatDoc = itsNatDoc;
    
        // テキストフィールドを取得
        this.input = (ItsNatHTMLInputText) 
          itsNatDoc.getItsNatComponentManager().addItsNatComponentById("name");
    
        // 結果を表示するdiv要素を取得
        this.result = itsNatDoc.getDocument().getElementById("result");
    
        // ボタンクリック時に呼び出されるリスナを登録
        Element element = itsNatDoc.getDocument().getElementById("click");  
        itsNatDoc.addEventListener((EventTarget) element, "click", 
          new EventListener() {
            public void handleEvent(Event evt) {
              // メッセージを挿入
              result.setTextContent("こんにちは、" + input.getText() + "さん!");
            }
          }, false);
      }
    
    }
    

    以上でアプリケーションは完成だ。プロジェクトを実行後、ブラウザからhttp://localhost:8080/itsnat/MyServlet?itsnat_doc_name=manual.core.example※1にアクセスして動作を確認してみよう。

    ※1 URLはサーブレットを/MyServletにマッピングしている場合。またitsnat_doc_nameパラメータにはサーブレット内でテンプレートを登録する際に指定したキーを指定する

    クラスの関連や処理の流れは少々複雑だが、実質的な処理を行っているのはSampleProcessorだけなので、そこだけ見れば特に難しいことはないだろう。

    サーバーサイドの複雑な処理にも対応可能

    ItsNatはサンプルで紹介した機能以外にもサーバサイドでの非同期処理、タイマー、COMET対応などAjaxアプリケーションを開発するための豊富な機能が用意されている。サーバサイドでDOMを活用するというやや風変りなフレームワークではあるものの、自由度が高くサーバーサイドでの複雑な処理にも対応可能だ。

    ただし、冒頭でも述べた通り、ライセンスがGNU Affero General Public License v3 となっているため、採用にあたっては注意してほしい。

    関連サイト

    関連したタグ

    新着記事

    特設サイトの情報

      求人情報

      人気記事

      一覧

      イチオシ記事

      新着記事

      特別企画

      転職ノウハウ

      あなたの仕事適性診断

      4つの診断で、自分の適性を見つめなおそう!

      Heroes File ~挑戦者たち~

      働くこと・挑戦し続けることへの思いを綴ったインタビュー

      はじめての転職診断

      あなたにピッタリのアドバイスを読むことができます。

      転職Q&A

      転職に必要な情報が収集できます

      スカウト転職する

      企業からアプローチのメッセージが届きます。

      マイナビニュースマガジン