SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

japan.internet.com翻訳記事

Google Web ToolkitでSQL AnywhereのWebサービスを利用する

GWTを使ったアプリケーションの作成

ダウンロード ソースコード (7.4 KB)

Webアプリケーションをデプロイする

 これでSQL AnywhereがWebサーバとして設定されました。このサーバはGWTがアプリケーションを生成するディレクトリを監視しているので、プロジェクトがコンパイルされるたびにアプリケーションがデプロイされます。アプリケーションを変更したのにブラウザで実行したときにその変更が反映されていない場合は、「www」ディレクトリの中味を削除してからアプリケーションを再度ビルドします。GWTでは、既存のファイルを上書きしないように配慮されています。

 これをテストするには、アプリケーションをコンパイルした後、お気に入りのWebブラウザに移動して、生成したWebページのURLを入力します。

HTTP://localhost/com.iAnywhere.Console/Console.html
 
ボタンをクリックした後のアプリケーション
ボタンをクリックした後のアプリケーション

 これで、SQL Anywhereで管理できる作業アプリケーションが完成しました。

コンソールアプリケーションを作成する

 次に、SQL Anywhereに付属しているDBConsoleアプリケーションの接続ビューア部分と同じ働きをするブラウザベースのアプリケーションを作成してみます。

DBConsole
DBConsole

 DBConsoleの接続ビューアでは、ユーザーはデータベース接続プロパティのリストから表示するものを選択し、データ更新のリフレッシュレートを設定し、その情報を表示することができます。DBConsoleはオプションダイアログを使って構成します。

DBConsoleのオプションダイアログ
DBConsoleのオプションダイアログ

 同じことを行うためには、Webサービスとストアドプロシージャを設定し、表示する接続データを集める必要があります。また、接続プロパティのリストを作るためにもWebサービスとストアドプロシージャが必要です。さらに、サーバからの結果を表示するためにGWTプロジェクトを更新することも必要です。

 まず、「Console.html」を編集します。編集するのは、デプロイ先のディレクトリ(デフォルトでは「www」)内のファイルではなく、「src」ディレクトリ内のファイルです。こうしないと、最初からすべてビルドし直したときに正しいHTMLファイルを取得することができません。新規アプリケーションのユーザーインターフェイスに必要なのは、GWTが自動的に生成するJavaScriptだけです。HTML要素は必要ありません。「Console.html」から次の要素を削除します。

Console.htmlから削除するHTML@
Console.htmlから削除するHTML@

 GWTによってタイトルは自動的に「Wrapper HTML for Console」になりました。このタイトルを「Console」に変更します。GWTのグラフィカルコンポーネント(ボタンやメニューなど)は、スタイルシートを使ってカスタマイズできます。これらのコンポーネントの多くは、スタイルシートでカスタマイズしないと非常に地味です。GWTの資料には、各コンポーネントのスタイルシートプロパティのリストが含まれています。スタイルシートは非常に長いので、ここでは省略します。詳しい内容については、「Console.html」を参照してください。

 どの接続プロパティをリストに表示したいと思うかは、ユーザーによって異なります。まず、ユーザーが表示データをカスタマイズできるように、接続プロパティのリストを取得する必要があります。

 そのためのサービスを作成します。

CREATE SERVICE "get_connection_properties" TYPE 'XML'
AUTHORIZATION OFF USER "DBA" AS call getConnectionPropeties();

 次にストアドプロシージャを作成します。

CREATE PROCEDURE "DBA"."getConnectionPropeties"()
RESULT (
   property_name long varchar,
   property_description long varchar,
   property_is_numeric long varchar,
   property_is_cumulative long varchar
)
begin
   select property_name( row_num ) as prop,
      property_description( row_num ),
      property_is_numeric( row_num ),
      property_is_cumulative( row_num )
   from  sa_rowgenerator(0,500)
   where connection_property( prop ) is not null
   order by prop
end

 このリストをブラウザに表示するには、GWTが生成したConsoleクラスを更新しなければなりません。今回の例では、ConnectionOptionsDialogというクラスを追加しました。このコードは非常に長いのでここでは省略します。詳しくは、サンプルのソースファイルを参照してください。

 次に、接続プロパティのリストを作るための接続データを取得します。そのために、接続データを取得するためのサービスを作成します。

CREATE SERVICE "connections" TYPE 'RAW' AUTHORIZATION OFF
USER "DBA" AS call connections(:properties);

 ストアドプロシージャを作成します。

CREATE PROCEDURE "DBA"."connections"( IN properties LONG VARCHAR )
BEGIN
   DECLARE pos INT;
   DECLARE start_pos INT;
   DECLARE property LONG VARCHAR;
   DECLARE temp_table LONG VARCHAR;
   DECLARE insert_into LONG VARCHAR;
   DECLARE counter INT;
   DECLARE curr_cid INT;
   DECLARE cid INT;
   DECLARE return_value LONG VARCHAR;
   DECLARE table_heading LONG VARCHAR;
   DECLARE insert_html long varchar;
   DECLARE cols LONG VARCHAR;
   declare local temporary table t_html(
      ord INT,
      str LONG VARCHAR
   ) in SYSTEM not transactional;

   SET temp_table = 'declare local temporary table t_conn_webconsole(';
   SET insert_into = 'insert into t_conn_webconsole values (';
   SET table_heading = '<TR class="header">';
   SET cols = '';
   SET insert_html = 'INSERT INTO t_html SELECT 1, ''<TR>'' ||';

   SET pos = 1;
   SET start_pos = 0;
   SET counter = 0;

   WHILE pos > 0 LOOP
      SET pos = LOCATE( properties, ',', start_pos );
      IF pos = 0 THEN
         SET property = SUBSTR( properties, start_pos,
                        LENGTH( properties ) - start_pos );
      ELSE
         SET property = SUBSTR( properties, start_pos,
                                pos - start_pos );
      END IF;

      IF counter > 0 THEN
         SET temp_table = temp_table || ', ';
         SET insert_into = insert_into || ', ';
         SET cols = cols || ' || ';
         SET insert_html = insert_html || ' || ';
      END IF;

      SET temp_table = temp_table || ' "' || property ||
                       '" varchar(255)';
      SET cols = cols || ' "' || property || '"';
      SET insert_into = insert_into ||
         ' connection_property( ''' || property || ''' , cid )';
      SET table_heading = table_heading || '<TH>'
         || property_description( property ) || '</TH>';
      SET insert_html = insert_html || '''<TD>'' ||"'
         || property || '" || ''</TD>''';

      SET start_pos = pos + 1;
      SET counter = counter + 1;
   END LOOP;

   SET temp_table = temp_table || ' ) in SYSTEM not transactional;';
   SET insert_into = insert_into || ');';
   SET table_heading = table_heading || '</TR>';
   SET insert_html = insert_html || ' || ''</TR>'
      ' FROM t_conn_webconsole';

   EXECUTE IMMEDIATE temp_table;
   set curr_cid = connection_property( 'number' );
   set cid = next_connection( NULL, NULL );
   loop_label:
   loop
      if cid is NULL then
         leave loop_label
      end if;
      if cid <> curr_cid then
         EXECUTE IMMEDIATE insert_into;
      end if;
      set cid = next_connection( cid, NULL );
   end loop loop_label;

   INSERT INTO t_html VALUES (
      0,
      '<HTML><BODY><TABLE BORDER=1 CELLSPACING=1
                       CELLPADDING=0 COLS=' || counter || '>'
                       || table_heading
   );
   EXECUTE IMMEDIATE insert_html;

   INSERT INTO t_html VALUES (
      99999,
      '</TABLE></BODY></HTML>'
   );

   SELECT str FROM t_html ORDER BY ord;
END

 このアプリケーションでは定期的にデータを更新します。データの収集の管理にはタイマーを使います。アプリケーションがブラウザのドキュメントにロードされたときにタイマーを始動し、アンロードされたときにタイマーを停止します。今回使用したコードを次に示します。

public void onLoad() {
   _timer = new Timer() {
      public void run() {
         boolean success =
            HTTPRequest.asyncGet( _hostName +
            "connections?properties="+_connectionProperties,
            new ResponseTextHandler() {
            public void onCompletion( String responseText ) {
               _content.setHTML( responseText );
            }
         });
         if( !success ) {
            _timer.cancel();
            // Report problem to user.
            Window.alert( "Error getting connection data." );
         }
      }
   };
   _timer.scheduleRepeating( _refreshRate );
}

public void onDetach() {
   _timer.cancel();
}

 Webアプリケーションを起動するたびに、表示するプロパティのリストをユーザーが設定し直すのでは不便です。クッキーを使用すれば、この設定を保存することができます。GWTには、クッキーの値を設定および取得するための静的なメソッドを含むCookieクラスがあります。ただし、自分のマシンから提供しているアプリケーションをテストするときには、クッキーの処理で問題が発生することがあります。クッキーはローカルホストでは正しく動作しない可能性があります。クッキーがローカルホストで正しく動作しない場合、そのコンピュータがドメイン内にあるときは、localhostではなくコンピュータの完全修飾名を使うようにしてください。

 完成したWebアプリケーションは次のようになります。

完成したWebアプリケーション
完成したWebアプリケーション
完成したWebアプリケーションでオプションメニューを表示した様子
完成したWebアプリケーションでオプションメニューを表示した様子
Webアプリケーションのオプションダイアログ
Webアプリケーションのオプションダイアログ

 複数のブラウザをターゲットとするJavaScriptアプリケーションを作成した経験がある人ならば、すべてのブラウザで同じ動作を期待どおりに実現するのが大変であることはよくご存知でしょう。この問題を解決するために、GWTは複数の代表的なブラウザ用のスクリプトを生成します。生成されたコードは、ロード時にブラウザに合ったスクリプトを読み込みます。このGWTの素晴らしい働きのおかげで、Javaプログラマは複数のブラウザ用のWebアプリケーションを簡単にデプロイできるようになりました。

 手順さえ理解すれば、GWTをSQL Anywhereで利用するのは難しいことではありません。このサンプルアプリケーションは未完成ですが、アプリケーションを作成する際の出発点としては役に立つでしょう。

参考資料

  1. GWT
  2. SQL Anywhere

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

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

Rob Close(Rob Close)

SQL Anywhereエンジニアリングチームのシニア開発者。SQL Anywhere向け管理ツールを担当するチームのJavaリーダー的存在。SQL Anywhereの次期バージョンや技術記事の投稿に関わっていないときは、カナダ、オンタリオ州南部で養蜂の仕事をしている。

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/993 2008/09/02 16:06

イベント

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

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

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

メールバックナンバー