OpenLaszloアドバンスド・テクニック
OpenLaszloアドバンスド・テクニック(2) Page 3/3

Webアプリと連携するためのコーディング基礎

ネットエイト
小野 圭二
2006/5/9

データのバインド例

 次に、取得したデータを各コンポーネントにバインドする方法を示します。まずはローカルデータを使ってコンポーネントにバインドしてみます。バインドには<datapath>を使います。使用するコンポーネントによって<datapath>の指定方法が異なりますので、使用に際してはリファレンスマニュアルをよく確認してください。ここではよく使われるコンポーネントへのバインドを例に取ります。

 リスト9の<combobox>と<list>を見れば分かるように、実際にデータを描写しているのは<textlistitem>です。<combobox>も<list>も<textlistitem>を「どう表示するか」という機能になっています。

<?xml version="1.0" encoding="UTF-8" ?>
<canvas>
  <dataset name="servertest">
    <resultset>
      <result state="ok" data1="データ1"/>
      <result state="ok" data1="データ2"/>
    </resultset>
  </dataset>
  
  <simplelayout axis="x" spacing="5"/>

  <!-- text --> 
  <view>
    <simplelayout/>
    <text datapath="servertest:/resultset/result/@data1"/>
  </view>
    
  <!-- Grid -->
  <grid height="100" datapath="servertest:/resultset">
    <gridcolumn>データ1
      <text datapath="@data1"/>
    </gridcolumn>
  </grid>
    
  <!-- List --> 
   <list>
    <textlistitem  datapath="servertest:/resultset/result"
                   text="$path{'@data1'}"/>
  </list>
  
  <!-- Combobox --> 
   <combobox>
    <textlistitem  datapath="servertest:/resultset/result"
                   text="$path{'@data1'}"/>
  </combobox>
</canvas>

リスト9 データをコンポーネントにバインドする方法

 さて、ここまででお気付きでしょうが、OpenLaszloではXML形式のデータをクライアント/サーバ間で使用するため、このサンプルのように<dataset>でデータの形を決めておけば、クライアントとサーバでそれぞれ分離して開発やテストが行えます。クライアントであるLZXアプリケーションは、サーバから送られてくるであろうXMLデータを上記のリスト9のように直接アプリケーション内に記述するか、もしくは外部にXMLファイルとして持ち、これを読み込むように設定します。

外部ファイルの読み込み方法

 XML形式のservertest.xmlがservertest.lzxと同じパスに配置されているなら、

<dataset name="servertest" src="servertest.xml"/>

と書けばよいのです。この場合のservertest.xmlは以下のとおりです。

<resultset>
  <result state="ok" data1="データ1"/>
  <result state="ok" data1="データ2"/>
</resultset>

 そして、サーバサイドプログラムとの結合試験の前に、この<dataset>をサーバサイドプログラムに変えてやればいいのです。

 最後にこのプログラムの実行画面(図3)とサンプルソースコード(リスト10、リスト11)を掲載します。

図3 servertest.lzxの実行結果
(画像をクリックすると拡大します)

<?xml version="1.0" encoding="UTF-8" ?>
<canvas debug="true">
<!-- 
  <dataset name="servertest">
    <resultset>
      <result state="ok" data1="データ1"/>
      <result state="ok" data1="データ2"/>
    </resultset>
  </dataset>
 -->

  <dataset name="servertest" src="http:jsp/servertest.jsp"/>

  <alert name="al"/>

  <datapointer xpath="servertest:/resultset[1]/result[1]">
    <method event="ontimeout">
      this.alcall( "タイムアウト" );
    </method>
    <method event="onerror">
      this.alcall( "エラー" );
    </method>
    <method event="ondata">
    <![CDATA[
      var resultChk = this.xpathQuery( '@state' );
      Debug.write( "resultChk: " + resultChk );
      if( resultChk == "ok" ){
        parent.comp.setVisible( true );
        this.alcall( "成功" );
      }else{
        this.alcall( "残念" );
      }
    ]]>
    </method>
    <method name="alcall" args="s">
      parent.al.setAttribute( "text", s );
      parent.al.open();
    </method>
  </datapointer>

  <simplelayout axis="x" spacing="5"/>

  <view y="10">
    <simplelayout/>
    <edittext name="ed"/>
    <button>GET送信
      <method event="onclick">
        var ed = parent.ed.getText();
        Debug.write( "ed: " + ed );

        var d  = canvas.datasets.servertest;
        var p  = new LzParam();
        p.addValue( "ed", ed, true );
        d.setQueryString( p );
        d.doRequest();
      </method>
    </button>
  </view>
  
  <view name="comp" y="10" visible="false" bgcolor="0xffeeaa">
    <simplelayout axis="x" spacing="5"/>
    <!-- text --> 
    <view>
      <simplelayout/>
      <text datapath="servertest:/resultset/result/@data1"/>
    </view>
    
    <!-- Grid -->
    <grid height="100" datapath="servertest:/resultset">
      <gridcolumn>データ1
        <text datapath="@data1"/>
      </gridcolumn>
    </grid>
    
    <!-- List --> 
     <list>
      <textlistitem datapath="servertest:/resultset/result"
                    text="$path{'@data1'}"/>
    </list>
  
    <!-- Combobox --> 
     <combobox>
      <textlistitem datapath="servertest:/resultset/result"
                    text="$path{'@data1'}"/>
    </combobox>
  </view>
</canvas>

リスト10 servertest.lzx


<%@ page language="java" contentType="text/xml; charset=UTF-8" %>
<%
  String state = "ok";
  String ed = ( String )request.getParameter( "ed" );
  if(( ed == null )||( ed.length() == 0 )) state = "ng";
%>
<resultset>
  <result state="<%= state %>" data1="データ1"/>
  <result state="<%= state %>" data1="データ2"/>
</resultset>

リスト11 servertest.jsp

 今回はOpenLaszloとサーバサイドアプリケーションとのデータ連携を解説しました。次回からは、いよいよ実践的なアプリケーション開発に入ります。(次回に続く)

  3/3  

 INDEX

OpenLaszloアドバンスド・テクニック(2)
 Webアプリと連携するためのコーディング基礎
  Page1
はじめに
Openlaszloの配備方法
サーバ連携で取り扱うデータ形式
  Page2
LZXアプリケーションからサーバへのデータ送信方法
サーバからのデータの受け方
Page3
データのバインド例




HTML5 + UX フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日 月間