SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

OpenLaszlo(オープンラズロ)をはじめよう

OpenLaszloとサーバーサイド連携

第3回

  • X ポスト
  • このエントリーをはてなブックマークに追加

datasetタグとlz.datapointerクラス

 LZXソースのdatasetタグ、srcプロパティにサーバーサイドのURLをセットしてdoRequestメソッドを実行します。非同期で処理されるので、正常終了したときのイベントハンドラ、エラーが発生したときのイベントハンドラに処理内容を記述します。

 サーバーから取得したXMLデータは、datasetタグのgetPointerメソッドで取得したlz.datapointerクラス経由で操作します。XMLデータは内部でDOM形式で解析されているため、XMLデータをツリー構造としてアクセスすることができます。

サンプルソース
<?xml version="1.0" encoding="UTF-8"?>
<canvas fontsize="15"
        font    ="MS UI Gothic"
        debug   ="false">

  <dataset name="dtData"
           src ="http://localhost:8080/lps-4.3.0/my-apps/sample/getUserInfo.jsp"/>

  <button id="btnRequest">ユーザー情報の取得</button>

  <text id="txt" y="40" multiline="true" resize="true"/>

  <!-- ボタンをクリックした時のイベントハンドラ -->
  <handler name     ="onclick"
           reference="btnRequest">
  <![CDATA[
    txt.clearText();
    dtData.doRequest();  //サーバーサイドにリクエスト
  ]]>
  </handler>

  <!-- サーバーサイド連携が正常終了したときのイベントハンドラ -->
  <handler name     ="ondata"
           reference="dtData">
  <![CDATA[
    txt.setAttribute('fgcolor', lz.colors.black);
    var p = dtData.getPointer();  //データポインタの取得
    p.setXPath('/users/user[1]');  //XPathを使用してuserタグの先頭に移動
    do {
      p.selectChild();  //userタグの子階層に移動
      do {
        //サーバーから取得した名前、年齢、性別を画面に表示
        txt.addText(p.getNodeName() + "=>" + p.getNodeText() + '\n');
      } while (p.selectNext());  //次のノードへ
      p.selectParent(); //userタグの階層に戻す
    } while (p.selectNext());  //次のノードへ
  ]]>
  </handler>

  <!-- サーバーサイド連携でエラーが発生したときのイベントハンドラ -->
  <handler name     ="onerror"
           reference="dtData">
  <![CDATA[
    txt.setAttribute('fgcolor', lz.colors.red);
    txt.setAttribute('text', 'エラーが発生しました。');
  ]]>
  </handler>

  <!-- サーバーサイド連携でタイムアウトが発生したときのイベントハンドラ -->
  <handler name     ="ontimeout"
           reference="dtData">
  <![CDATA[
    txt.setAttribute('fgcolor', lz.colors.red);
    txt.setAttribute('text', 'タイムアウトが発生しました。');
  ]]>
  </handler>

</canvas>
getUserInfo.jspのソース
<?xml version="1.0" encoding="UTF-8"?>
<%@page pageEncoding="UTF-8"%>
<%@page contentType="text/html;charset=UTF-8"%>
<%
  out.println("<users>");
  out.println(" <user>");
  out.println("   <name>長崎太郎</name>");
  out.println("   <age>30</age>");
  out.println("   <sex>男</sex>");
  out.println(" </user>");
  out.println(" <user>");
  out.println("   <name>諫早花子</name>");
  out.println("   <age>25</age>");
  out.println("   <sex>女</sex>");
  out.println(" </user>");
  out.println(" <user>");
  out.println("   <name>佐世保次郎</name>");
  out.println("   <age>20</age>");
  out.println("   <sex>男</sex>");
  out.println(" </user>");
  out.println("</users>");
%>
サンプルソースを実行した結果
サンプルソースを実行した結果

XPath(XML Path Language)

 XMLデータのポインタを操作する方法として、selectChildメソッド・selectNextメソッドを使用して目的の位置まで順番に探していく方法以外に、XPathを使用して特定の位置までダイレクトに移動することもできます。XPathを使用すると、配列のようにアクセスできたり、条件を指定してポインタを移動することができます。

サンプルソース
<?xml version="1.0" encoding="UTF-8"?>
<canvas fontsize="15"
        font    ="MS UI Gothic"
        debug   ="false">

  <!-- ダミーのデータセットの準備。
       子タグで直接XMLを記入してdatasetに値をセットすることができる。-->
  <dataset name="dtAddress">
    <users>
      <user id="1" category="friends">
        <firstName>太郎</firstName>
        <lastName>長崎</lastName>
        <phone>111-111-1111</phone>
        <email>aaa@aaaa.co.jp</email>
      </user>
      <user id="2" category="business">
        <firstName>花子</firstName>
        <lastName>諫早</lastName>
        <phone>222-222-2222</phone>
        <email>bbb@bbbb.co.jp</email>
      </user>
      <user id="3" category="friends">
        <firstName>次郎</firstName>
        <lastName>佐世保</lastName>
        <phone>333-333-3333</phone>
        <email>ccc@cccc.co.jp</email>
      </user>
    </users>
  </dataset>

  <view layout="axis: y; spacing: 20">
    <view layout="axis: y; spacing: 3">
      <button id="btnTest1" text="/users/user[2]/lastName/"/>
      <text id="txtResult1" fgcolor="red" resize ="true"/>
    </view>
    <view layout="axis: y; spacing: 3">
      <button id="btnTest2" text="/users/user[@category="business"]/lastName/"/>
      <text id="txtResult2" fgcolor="red" resize ="true"/>
    </view>
    <view layout="axis: y; spacing: 3">
      <button id  ="btnTest3"
              text="/users/user[@id="3"][@category="friends"]/lastName/"/>
      <text id="txtResult3" fgcolor="red" resize ="true"/>
    </view>
  </view>

  <!-- 1番目のuserの子ノードfirstNameの値を取り出す -->
  <handler name     ="onclick"
           reference="btnTest1">
  <![CDATA[
    txtResult1.clearText();
    var p = dtAddress.getPointer();
    if (p.setXPath('/users/user[1]/lastName/'))
    txtResult1.setAttribute('text', '取得結果 ⇒ ' + p.getNodeText());
  ]]>
  </handler>

  <!-- userの属性categoryが"business"の子ノードfirstNameの値を取り出す -->
  <handler name ="onclick"
           reference="btnTest2">
  <![CDATA[
    txtResult2.clearText();
    var p = dtAddress.getPointer();
    if (p.setXPath('/users/user[@category="business"]/lastName/'))
    txtResult2.setAttribute('text', '取得結果 ⇒ ' + p.getNodeText());
  ]]>
  </handler>

  <!-- userの属性idが3かつ属性categoryが"friends"の子ノードfirstNameの値を取り出す -->
  <handler name ="onclick"
           reference="btnTest3">
  <![CDATA[
    txtResult3.clearText();
    var p = dtAddress.getPointer();
    //xpathQueryメソッドはポインタを移動して値を返します。
    var v = p.xpathQuery('/users/user[@id="3"][@category="friends"]/lastName/');
    if (v != null)
      txtResult3.setAttribute('text', '取得結果 ⇒ ' + v);
  ]]>
  </handler>
</canvas>
サンプルソースを実行した結果
サンプルソースを実行した結果

次のページ
サーバーに値をGET/POSTする

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
OpenLaszlo(オープンラズロ)をはじめよう連載記事一覧

もっと読む

この記事の著者

株式会社ドゥアイネット 前田慎治(マエダシンジ)

株式会社ドゥアイネットに勤務するプログラマーです。制御系から事務系まで様々な開発を経験し、現在はCurlやOpenLaszloを使ってRIAの開発を担当しています。OpenLaszloで開発した「スマートスケジューラー」http://www.dinss.jp/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3999 2009/06/17 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング