この 4 回シリーズの第 1 回では、GWT と XForms の両方の確固たる基礎について説明し、そしてこの 2 つを組み合わせることで Web アプリケーションの作成プロセスを効率化できることを示しました。今回の第 2 回では、単純な Web アプリケーションとして、ロック・スターのアプリケーションを作成します。このアプリケーションには 2 つのページがあり、1 つのページはアーティストを表示し、もう 1 つのページはそれらのアーティストが録音したアルバムを表示します。最初のページは GWT を使って作成し、そこでは GWT のウィジェットと Ajax によって抽象化された GWT を使います。このページは 2 番目のページにリンクされます。2 番目のページは XForms を使って作成され、このページの UI の作成には XForms のデータ・モデルと XForms のコントロールが使われます。
この記事では、GWT のバージョン 1.4 と Mozilla の XForms プラグイン 0.8 を使います (ダウンロードのためのリンクは「参考文献」を参照してください)。Mozilla の XForms プラグインは、Mozilla ベースの Web ブラウザー (Firefox や Seamonkey など) であれば、どのブラウザーでも動作します。GWT を使うには、Java™ 言語の知識と HTML や CSS などの Web 技術の知識が必要です。また、この記事では JavaScript も頻繁に使います。XForms は Model-View-Control のパラダイムを頻繁に使うため、このパラダイムに慣れておくと役に立ちます。これまでに XForms と GWT を経験したことがあると、もちろん助けになりますが、必須ではありません。この記事のコードは Eclipse 3.3 を使って作成しましたが、Eclipse を知っている必要はありません。
この、ロック・スターのアプリケーションで最初にしなければならないことは、すべてのアーティストのリストを入手することです。もちろん、このリストに新しいアーティストを追加できる必要もあります。またこのリストは、2 番目のページにナビゲートするための手段も提供します。2 番目のページでは、ある特定のアーティストが録音したアルバムを管理することができます。この、アーティストのページでは、GWT を使います。GWT に組み込みのウィジェットを利用してこのページ用の洗練された UI を作成し、また Ajax によって抽象化された GWT を使ってデータのロードと保存を単純化します。
このアプリケーションのデータは、単純な XML ファイルに保存されます。XML はデータ転送のための一般的なフォーマットであり、そしてもちろん、XForms のネイティブ・フォーマットです。データはリレーショナル・データベースに簡単に保存できますが、結局さまざまな目的のためにそのデータを XML としてシリアライズする羽目になる可能性がかなりあります。データの保存にリレーショナル・データベースを使わずに XML を使うことで単純になり、このアプリケーションの本来のスターである、GWT と XForms に集中することができます。
アーティストを表現するために、このアプリケーションのための単純なデータ・モデルが必要です。GWT を使うと、単純な Java Bean を作成するだけの簡単な作業ですんでしまいます (リスト 1)。
リスト 1. アーティストのモデル: Java Bean
package org.developerworks.rockstar.client;
import com.google.gwt.user.client.rpc.IsSerializable;
public class Artist implements IsSerializable{
private int id;
private String name;
private String genre;
public Artist(){
// needed for GWT's RPC mechanism
}
public Artist(int id, String name, String genre) {
this.id = id;
this.name = name;
this.genre = genre;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGenre() {
return genre;
}
public void setGenre(String genre) {
this.genre = genre;
}
} |
先ほど触れたように、これは単なる標準的な Java Bean にすぎません (3 つのフィールドを持ち、それぞれに対応してゲッターとセッターがあります)。簡単にアーティストを参照できるように、アーティストに対しては数値 ID を使います。アーティストを保存するためにデータベース・テーブルが使われていたのであれば、おそらくこの数値 ID も既にあるはずです。これがアプリケーションのクライアント・パッケージの中にあることに注意してください。そのため、このクラスは JavaScript にコンパイルされます。ただし、それが皆さんに関係するわけではありません。相変わらずこのクラスを Java でプログラムすることができ、その先の JavaScript にまで注意を払う必要はありません。最後に、このクラスが IsSerializable マーカー・インターフェースを実装していることに注意してください。このインターフェースの実装は、(例えば Ajax の呼び出しに対するリクエストまたはレスポンスの一部として) ネットワーク上で送信されるすべてのクラスに必要です。それでは、Artist オブジェクトのリスト用の UI を GWT を使って作成する方法を調べてみましょう。
GWT のウィジェットを使ってアーティストのリストを作成する
GWT に数多くある便利なことの 1 つが、一般的な UI の構造を作成するための一連のウィジェットが用意されていることです。これにより、UI の要素を作成するためにおなじみの Java の構文を使うことができます。Swing あるいは SWT のプログラミング経験のある人ならば、こうしたことにはかなり慣れているはずです。ここでは FlexTable を使います。これは動的な表であり、このアプリケーションに非常に適しています。ここではアーティストの数が固定されていないからです。FlexTable は、アーティストの数に合わせて拡張されます。FlexTable にデータを入力するためのコードをリスト 2 に示します。
リスト 2. アーティストの表を作成する
private void populateTable(Artist[] artists){
// clear the table
int rowCount = this.artistTable.getRowCount();
for (int i=0;i<rowCount;i++){
this.artistTable.removeRow(i);
}
// create the header
this.artistTable.getRowFormatter().addStyleName(0, "tableHeader");
this.artistTable.setText(0, 0, "Name");
this.artistTable.setText(0, 1, "Genre");
// now add artists
for (int i=0;i<artists.length;i++){
this.artistTable.setText(i+1, 0, artists[i].getName());
this.artistTable.setText(i+1, 1, artists[i].getGenre());
}
this.artistTable.setBorderWidth(4);
}
|
リスト 2 のコードは、もし既に表がある場合には、その表をクリアーします。そしてヘッダーを作成します。このヘッダーに関して唯一特別なことは、そこにスタイルが追加されることです。その箇所を簡単に確認してください。次にこのコードは、アーティストを繰り返し、表に追加します。この表が追加されるページを見てみましょう (リスト 3)。
リスト 3. アーティストのページ
<html>
<head>
<title>RockStars</title>
<!-- -->
<!-- This script loads your compiled module. -->
<!-- If you add any GWT meta tags, they must -->
<!-- be added before this line. -->
<!-- -->
<script language='javascript' src='org.developerworks.
rockstar.RockStarMain.nocache.js'></script>
<style type="text/css">
.tableHeader{
background-color:#AAAAAA;
}
</style>
</head>
<body>
</body>
</html>
|
この HTML にはほとんど処理がありません。面倒な作業はすべて、GWT に処理させるのです。唯一、HTML らしいことと言えば、表のヘッダー用に少しばかりの CSS をインライン化したことだけです。これで、このページの UI 要素を作成できたので、あとは少しデータが必要なだけです。そのためには、Ajax を使って GWT 流に行います。
アーティストのデータを取得する: リモート・プロシージャー・コールを使う
アーティストのリストを表示するために使用できる、便利な GWT ウィジェットが用意されています。あとはリストが必要なだけです。そのためには、アーティストを管理するためのサービスを作成します。そしてこのサービスを、GWT を使って非同期に (例えば Ajax を使って) 呼び出します。これは典型的な GWT の RPC (Remote Procedure Call: リモート・プロシージャー・コール) です。まず、このサービスに対するインターフェースを宣言します (リスト 4)。
リスト 4. アーティスト・サービスのインターフェース
package org.developerworks.rockstar.client;
import com.google.gwt.user.client.rpc.RemoteService;
public interface ArtistService extends RemoteService {
public Artist[] getAllArtists();
public void addArtist(Artist newArtist);
}
|
このサービスが GWT のマーカー・インターフェース RemoteService を継承していることに注意してください。これは GWT の規則として必要です。また getAllArtists() を呼び出すと Artist オブジェクトの配列が返されることにも注意してください。これらのオブジェクトは、先ほどデータ・モデルとして定義した Artist オブジェクトと同じものです。getAllArtists() を呼び出したときに Collection<Artist> あるいは List<Artist> を返すようにしたいという誘惑にかられるかもしれませんが、そうしてはいけません。GWT はクライアント・コード (例えば JavaScript にコンパイルされるコード) では Generics をサポートしていません。JavaScript には Generics はなく、また Generics タイプの情報は、いずれにせよ実行時には利用できません。java.util.List を返すこともできますが (これらは許されています)、配列でも問題なく動作し、しかも強い型付けがされています。
GWT では、クライアントから呼び出されるインターフェースはすべて非同期でなければなりません。このサービスのインターフェースの非同期バージョンをリスト 5 に示します。
リスト 5. 非同期のサービス・インターフェース
package org.developerworks.rockstar.client;
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface ArtistServiceAsync {
public void getAllArtists(AsyncCallback callback);
public void addArtist(Artist newArtist, AsyncCallback callback);
}
|
ここで重要なことは、サービス名に付いている Async という接尾辞です。この命名規則によって、GWT はこのインターフェースをリスト 4 に示すインターフェースと突き合わせます。また、すべての呼び出しが非同期に行われていること、つまり戻り型が void であることにも注意してください。これらの呼び出しはすべて AsyncCallback 型の引数が渡されているため GWT は、このインターフェースのサーバー・サイドの実装が (この実装に対する) リクエストの処理を終了すると、このコールバックを呼び出すことができます。では、このインターフェースのサーバー・サイドの実装を見てみましょう (リスト 6)。
リスト 6. このインターフェースのサーバー・サイドの実装
package org.developerworks.rockstar.server;
import java.util.List;
import org.developerworks.rockstar.client.Artist;
import org.developerworks.rockstar.client.ArtistService;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
public class ArtistServiceImpl extends RemoteServiceServlet implements ArtistService {
private static final long serialVersionUID = -1801240935065207659L;
private List<Artist> artists;
private ArtistDao dao;
public ArtistServiceImpl(){
this.dao = new ArtistFileDao();
this.artists = this.dao.getAllArtists();
}
public void addArtist(Artist newArtist) {
newArtist.setId(this.artists.size());
this.artists.add(newArtist);
dao.saveArtists(this.artists);
}
public Artist[] getAllArtists() {
Artist[] array = new Artist[this.artists.size()];
return this.artists.toArray(array);
}
} |
このクラスに関して、注目すべき点がいくつかあります。1 つは、このクラスが、定義されたインターフェースを実装することに加えて RemoteServiceServlet を継承していることです。RemoteServiceServlet は古典的な Java サーブレットであり、Ajax リクエストを処理するために設計されています。実行時にはクライアント・コードからのリクエストによってスーパークラスのメソッドが呼び出され、そしてスーパークラスはクライアントが要求する実際のメソッドをリフレクションを使って呼び出します。最後に、DAO (Data Access Object) インターフェース、ArtistDao を使っていることに注意してください。ここではファイル・ベースの実装である ArtistFileDao を使っていますが、これを簡単にデータベース・ベースの実装と交換することができます。またこのクラスには、ファイルの読み書きと XML の構文解析のための面倒なコードもすべて含まれています。では、このアプリケーションをテストしてみましょう。
ここまでは、すべては純粋な GWT でした。GWT の便利なことの 1 つは、ホスト・モードを使用できることです。Eclipse を使用している場合には、Eclipse からアプリケーションを起動して表示することができます。ただし、まず少しばかりデータが必要です。簡単なデータ・ファイルをリスト 7 に示します。
リスト 7. テスト・データ
<?xml version="1.0" encoding="UTF-8"?>
<Data>
<Artist>
<Id>0</Id>
<Name>The Struts Five</Name>
<Genre>Classic Rock</Genre>
</Artist>
<Artist>
<Id>1</Id>
<Name>Spring Flow</Name>
<Genre>Techno</Genre>
</Artist>
<Artist>
<Id>2</Id>
<Name>The Holy Grails</Name>
<Genre>Funk</Genre>
</Artist>
<Artist>
<Id>3</Id>
<Name>The Rails Way</Name>
<Genre>Pop</Genre>
</Artist>
<Artist>
<Id>4</Id>
<Name>Cake Clone</Name>
<Genre>Pop</Genre>
</Artist>
<Artist>
<Id>5</Id>
<Name>Obscure Tapestry</Name>
<Genre>Techno</Genre>
</Artist>
<Artist>
<Id>6</Id>
<Name>Dojo Darling</Name>
<Genre>Classic Rock</Genre>
</Artist>
<Artist>
<Id>7</Id>
<Name>Cairingorm</Name>
<Genre>Progressive</Genre>
</Artist>
<Artist>
<Id>8</Id>
<Name>ProtoStripes</Name>
<Genre>Thrash</Genre>
</Artist>
</Data>
|
これでテスト・データは用意できたので、アプリケーションを起動します。そうすると図 1 のようなインターフェースが表示されるはずです。
図 1. ホスト・モードでアーティストを表示する
ここに表示されているのは、テスト・データの中にあるアーティストのリストです。今度は、新しいアーティストを入力するための単純なフォームが必要です。
新しいアーティストを追加する: GWT を使ってフォームを作成する
新しいアーティストを入力するためには、簡単なデータ入力フォームが必要です。幸い GWT には、フォームを作成するためのウィジェットも含まれています。GWT を使うことで、プログラムでフォームを作成することができます (リスト 8)。
リスト 8. GWT を使ったデータ入力フォーム
public class RockStarMain implements EntryPoint {
// Widgets for the page
final FlexTable artistTable = new FlexTable();
final VerticalPanel outerPanel = new VerticalPanel();
final HorizontalPanel formPanel = new HorizontalPanel();
final Label artistLabel = new Label("Artist Name:");
final TextBox artistInput = new TextBox();
final Label genreLabel = new Label("Genre:");
final TextBox genreInput = new TextBox();
final Button addButton = new Button("Add Artist");
/**
* This is the entry point method.
*/
public void onModuleLoad() {
// add the outer panel, then add to it
RootPanel.get().add(outerPanel);
outerPanel.add(artistTable);
outerPanel.add(formPanel);
// arrange form elements horizontally
formPanel.add(artistLabel);
formPanel.add(artistInput);
formPanel.add(genreLabel);
formPanel.add(genreInput);
formPanel.add(addButton);
// add event listener to our button
ClickListener listener = new ClickListener(){
public void onClick(Widget sender) {
addNewAritst();
}
};
addButton.addClickListener(listener);
// load the artists now all the widgets are ready
this.loadArtists();
}
|
このコードも、驚くほど単純です。ラベルとテキスト・ボックス、そしてボタン (そして作業対象である FlexTable) という、一連のウィジェットを作成します。また、これらのウィジェットを配置するためのレイアウト・マネージャーのように動作する、いくつかのパネルを使います。次に、新しいアーティストを追加するためのボタンの 1 つにイベント・リスナーを追加します。このイベント・リスナーがバックエンドのサービスを呼び出します。ではこれをリスト 9 で見てみましょう。
リスト 9. 新しいアーティストのメソッドを追加する
private void addNewAritst(){
Artist artist = new Artist(-1, artistInput.getText(), genreInput.getText());
ArtistServiceAsync artistService = getArtistService();
AsyncCallback callback = new AsyncCallback(){
public void onFailure(Throwable caught) {
// remove last row because of failure
removeLastArtist();
}
public void onSuccess(Object result) {
// nothing to do here since we added optimistically
}
};
artistService.addArtist(artist, callback);
// we'll be optimistic and go ahead and add to the table
int size = this.artistTable.getRowCount();
this.artistTable.setText(size, 0, artist.getName());
this.artistTable.setText(size, 1, artist.getGenre());
}
|
このコードを見ると、このインターフェースの非同期バージョンが呼び出されていることがわかります。そして非同期のコールバック・メソッドが作成されています。このコールバック・メソッドは非常に単純で、処理が行われるのは、この呼び出しが失敗した場合のみです。これは、サーバーからの応答を待たずに先行して表にアーティストを追加しているためです。アーティストの追加は瞬時に行われるため、こうすることで適切なユーザー・エクスペリエンスを実現することができます。ただしこれは、失敗が非常に稀であるということを前提にしています。完全なソース・コードのダウンロードは、この記事の最後に用意されています。これでフォームを追加できたので、今度は UI を見てみましょう (図 2)。
図 2. アーティストを表示し、新しいアーティストを追加する
フォームに入力し、Add Artist ボタンをクリックします。UI が瞬時に更新されるはずです (図 3)。
図 3. 追加されたアーティスト
GWT を使って UI 要素を作成する方法、そして Ajax を使うことでバックエンド・サービスからデータを取得でき、そこにデータを保存できることがわかりました。では今度は、アルバムを管理するためのページを XForms を使って作成する方法を見てみましょう。
このアプリケーションの 2 番目の部分では、あるアーティストのアルバムのリストを表示します。当然のことですが、どのアーティストにも使用できる、アルバム表示用の 1 ページを作成します。では、どのアルバムを表示するのかを、どうやって知るのでしょう。もちろん、このためにはいくつか異なる方法がありますが、ここではコマンドのパターンを使います。このコマンドによって、このページを作成するために知らなければならないことが、すべてわかるはずです。この場合には、誰のアルバム (つまり、どのアーティストのアルバム) を表示するのかを知る必要があります。そのためには、アーティストを指定する request パラメーターが必要です。そこでこれを単純に artistId と呼ぶことにします。最初のページから 2 番目のページへのリンクが必要であり、このリンクは artistId パラメーターを持つ必要があります。
最初のページに戻り、2 番目のページへのリンクを作成しましょう。これは、コードを少し変更するだけで実現することができます (リスト 10)
リスト 10. Artist リストにリンクを追加する
private void populateTable(Artist[] artists){
// clear the table
int rowCount = this.artistTable.getRowCount();
for (int i=0;i<rowCount;i++){
this.artistTable.removeRow(i);
}
// create the header
this.artistTable.getRowFormatter().addStyleName(0, "tableHeader");
this.artistTable.setText(0, 0, "Name");
this.artistTable.setText(0, 1, "Genre");
// now add artists
for (int i=0;i<artists.length;i++){
//this.artistTable.setText(i+1, 0, artists[i].getName());
String html = "<a href=\"Albums.jsp?artistId=
"+artists[i].getId()+"\">"+artists[i].getName()+"</a>";
this.artistTable.setHTML(i+1, 0, html);
this.artistTable.setText(i+1, 1, artists[i].getGenre());
}
this.artistTable.setBorderWidth(4);
}
|
変更したのは、表の左側の列を設定するコードのみです。setText(...) を使う代わりに、setHTML(...) を使っています。こうすることで表の中に HTML を配置することができ、これによって新しいページ「Albums.jsp」への単純なリンクが作成されます。JSP を使っているため、少しばかり動的にページを作成することができます。動的な部分は、artistId で指定されたアーティストが録音したアルバムのみを表示する、という部分です。artistId パラメーターがリンクの一部であることに注目してください。あとはこのページを作成すればよいだけです。
この JSP は、HTML や CSS のページなどの Web リソースとまったく同じように作成することができます。このページにも GWT を使うことができます。必要なことは、GWT が生成する JavaScript ファイルを参照することだけです。ここでは、指定されたアーティストが録音したアルバムを、サーバー・サイドのコードを使ってロードします。このデータを XForms のモデルのインスタンス・データに直接書き込みます (リスト 11)。
リスト 11. サーバー・ロジックを使ったインライン・データ
<?xml version="1.0" encoding="UTF-8"?>
<xhtml:html xmlns:xforms="http://www.w3.org/2002/xforms"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<%@page import="org.developerworks.rockstar.client.*" %>
<%@page import="org.developerworks.rockstar.server.*" %>
<%@page import="java.util.List" %>
<xhtml:head>
<xhtml:title>Albums</xhtml:title>
<xforms:model id="albums">
<xforms:instance id="albumData" xmlns="">
<Data>
<%
int artistId = Integer.parseInt(request.getParameter("artistId"));
AlbumDao dao = new AlbumFileDao();
List<Album> albums = dao.getAllAlbums();
for (Album album : albums){
if (album.getArtistId() == artistId){
%>
<Album>
<Title><%= album.getTitle() %></Title>
<Year><%= album.getYear() %></Year>
</Album>
<%
}
}
%>
</Data>
</xforms:instance>
</xforms:model>
</xhtml:head>
<xhtml:body>
<xhtml:div id="albumList">
<xforms:repeat id="repeatItem" nodeset="/Data/Album">
<xhtml:div>
<xforms:output ref="Title">
<xforms:label>Title:</xforms:label>
</xforms:output>
<xforms:output ref="Year">
<xforms:label>Year:</xforms:label>
</xforms:output>
</xhtml:div>
</xforms:repeat>
</xhtml:div>
</xhtml:body>
</xhtml:html>
|
どのアルバムを表示するかを判断するためのロジックを、Java のスクリプトレットが処理します。このデータも XML ファイルからロードします。フィルターのためのロジックは、この記事のソース・コードの一部としてダウンロードされる外部クラスに含まれています。この場合も、いくつかのテスト・データを XML ファイルの中に作成することに注目してください。このテスト・データも、この記事のソース・コードと一緒に含まれています。
これで、XForms のアルバム・ページをテストする準備ができました。ここまでは、GWT のホスト・モードを使って GWT のアーティスト・ページをテストしてきました。今回もホスト・モードで起動できますが、新しいページをテストするためには GWT の Web モードに切り替える必要があります。なぜでしょう。XForms は、GWT のホスト・モードには存在しない、ブラウザーのプラグインに依存するからです。図 4 は Web モードへの切り替え方法を示しています。
※訳注: 上記パラグラフで最初に出てくる GWT's hosted dode は、GWT's hosted mode と解釈して訳しています。
図 4. Web モードに切り替える
Compile/Browse をクリックすると、このアプリケーションが Web モードで表示されます (図 5)。
図 5. Web モードでのアプリケーション
このアプリケーションが、皆さんがデフォルトで使っている Web ブラウザーで実行されている様子がわかるはずです。アーティストの 1 人をクリックすると、図 6 に示すインターフェースが表示されるはずです。
図 6. Artist ページをテストする
このページは、そのアーティストのアルバムのリストを表示します。このページは、いくつかの単純な XForms コントロールを使って、モデルのインスタンス・データの XML データに対して繰り返しの処理を実行します。第 3 回では、データ入力用の XForms コントロールを追加して、それを GWT の Ajax から呼び出せるようにし、レコード会社の幹部がこのページに新しいアルバムを追加できるようにする方法について説明します。
この記事では、ロック・スターのシリーズの第 2 回として、GWT を使って対話型のページを作成する方法と、このページを XForms を使うページにリンクする方法について見てきました。第 3 回では、今回の記事で作成したロック・スターのアプリケーションをリファクタリングします。実際には今回作成したアプリケーションの機能を変更するわけではありませんが、同じページで GWT 要素を XForms 要素として使うことで、アプリケーションの対話動作をさらに優れたものにする方法を学びます。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| Part 2 sample code | rockstar2_src.zip | 12KB | HTTP |
学ぶために
- この記事シリーズ「XForms を Google Web Toolkit と統合する」の第 1 回「GWT の JSNI (JavaScript Native Interface) を紹介する」を読んでください。
- XForms への優れた入門記事として、3 回シリーズの「XForms 入門」(Chris Herbroth 著、developerWorks、2006年9月) を読んでください。
- JavaScript と XForms とを組み合わせて使う方法を学ぶために、「XForms のヒント: XForms フォームから JavaScript をコールする」(Nicholas Chase 著、developerWorks、2007年1月) を読んでください。
- JavaScript が XForms の機能をどのように改善できるかを学ぶために、「Use JavaScript to make your XForms more robust」(Michael Galpin 著、developerWorks、2007年7月) を読んでください。
- XForms と Ajax を組み合わせて動作させ、autosuggest 機能を作成する方法を学ぶために、「XForms と Ajax を使って autosuggest フォーム・フィールドを作成する」(Michael Galpin 著、developerWorks、2007年7月) を読んでください。
- GWT を詳細に解説した最初のチュートリアルの 1 つとして、「Java 開発者のための Ajax: Google Web Toolkit を探る」(Philip McCarthy 著、developerWorks、2006年6月) を読んでください。
- GWT を使った Web アプリケーションの構築を学ぶために、4 回シリーズの developerWorks のチュートリアル「Google Web Toolkit、Apache Derby、Eclipse を使用して Ajax アプリケーションをビルドする」(Noel Rappin 著、developerWorks、2006年12月) を読んでください。
- GWT の Ajax 機能に慣れるために、2 回シリーズのチュートリアル「Build an Ajax-enabled application using the Google Web Toolkit and Apache Geronimo」(Michael Galpin 著、developerWorks、2007年5月) を読んでください。
- IBM developerWorks の Ajax Resource Center をご覧ください。
- IBM developerworks の Java technology ゾーンをご覧ください。
-
W3C の XForms のホーム・ページを訪れてください。
- XML および関連技術において IBM 認証開発者になる方法については、IBM XML certification を参照してください。
- developerWorks の XML ゾーンは XML の技術ライブラリーとして、広範な話題を網羅した技術記事やヒント、チュートリアル、技術標準、IBM Redbook などを用意しています。
-
developerWorks technical events and webcasts で最新情報を入手してください。
- IBM developerWorks の XMLゾーンで XForms について学んでください。
-
Podcasts を利用して IBM 技術のエキスパートから最新情報を入手してください。
製品や技術を入手するために
- GWT の情報を入手するためには、そのソースである Google Web Toolkit の正式サイトに直接行くのが一番です。
-
Mozilla や Firefox、あるいは Seamonkey 用の XForms 拡張を入手してください。
議論するために