Webアプリケーションをデプロイする
これでSQL AnywhereがWebサーバとして設定されました。このサーバはGWTがアプリケーションを生成するディレクトリを監視しているので、プロジェクトがコンパイルされるたびにアプリケーションがデプロイされます。アプリケーションを変更したのにブラウザで実行したときにその変更が反映されていない場合は、「www」ディレクトリの中味を削除してからアプリケーションを再度ビルドします。GWTでは、既存のファイルを上書きしないように配慮されています。
これをテストするには、アプリケーションをコンパイルした後、お気に入りのWebブラウザに移動して、生成したWebページのURLを入力します。
HTTP://localhost/com.iAnywhere.Console/Console.html
これで、SQL Anywhereで管理できる作業アプリケーションが完成しました。
コンソールアプリケーションを作成する
次に、SQL Anywhereに付属しているDBConsoleアプリケーションの接続ビューア部分と同じ働きをするブラウザベースのアプリケーションを作成してみます。
DBConsoleの接続ビューアでは、ユーザーはデータベース接続プロパティのリストから表示するものを選択し、データ更新のリフレッシュレートを設定し、その情報を表示することができます。DBConsoleはオプションダイアログを使って構成します。
同じことを行うためには、Webサービスとストアドプロシージャを設定し、表示する接続データを集める必要があります。また、接続プロパティのリストを作るためにもWebサービスとストアドプロシージャが必要です。さらに、サーバからの結果を表示するためにGWTプロジェクトを更新することも必要です。
まず、「Console.html」を編集します。編集するのは、デプロイ先のディレクトリ(デフォルトでは「www」)内のファイルではなく、「src」ディレクトリ内のファイルです。こうしないと、最初からすべてビルドし直したときに正しいHTMLファイルを取得することができません。新規アプリケーションのユーザーインターフェイスに必要なのは、GWTが自動的に生成するJavaScriptだけです。HTML要素は必要ありません。「Console.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アプリケーションは次のようになります。
複数のブラウザをターゲットとするJavaScriptアプリケーションを作成した経験がある人ならば、すべてのブラウザで同じ動作を期待どおりに実現するのが大変であることはよくご存知でしょう。この問題を解決するために、GWTは複数の代表的なブラウザ用のスクリプトを生成します。生成されたコードは、ロード時にブラウザに合ったスクリプトを読み込みます。このGWTの素晴らしい働きのおかげで、Javaプログラマは複数のブラウザ用のWebアプリケーションを簡単にデプロイできるようになりました。
手順さえ理解すれば、GWTをSQL Anywhereで利用するのは難しいことではありません。このサンプルアプリケーションは未完成ですが、アプリケーションを作成する際の出発点としては役に立つでしょう。








