25.3. GWT ウィジェットを Seam コンポーネントにつなげる
次に、 コンポーネントに非同期インターフェースを返すメソッドを記述します。 このメソッドはウィジェットクラス内にあり、 非同期クライアントのスタブへの参照を取得するためウィジェットにより使用されます。
private MyServiceAsync getService() {
String endpointURL = GWT.getModuleBaseURL() + "seam/resource/gwt";
MyServiceAsync svc = (MyServiceAsync) GWT.create(MyService.class);
((ServiceDefTarget) svc).setServiceEntryPoint(endpointURL);
return svc;
}
最後にクライアントスタブでメソッドを呼び出すウィジェットのコードを記述します。 次の例ではラベル、 テキスト入力フィールド、 ボタンで構成されるシンプルなユーザーインターフェースを作成します。
public class AskQuestionWidget extends Composite {
private AbsolutePanel panel = new AbsolutePanel();
public AskQuestionWidget() {
Label lbl = new Label("OK, what do you want to know?");
panel.add(lbl);
final TextBox box = new TextBox();
box.setText("What is the meaning of life?");
panel.add(box);
Button ok = new Button("Ask");
ok.addClickListener(new ClickListener() {
public void onClick(Widget w) {
ValidationUtility valid = new ValidationUtility();
if (!valid.isValid(box.getText())) {
Window.alert("A question has to end with a '?'");
} else {
askServer(box.getText());
}
}
});
panel.add(ok);
initWidget(panel);
}
private void askServer(String text) {
getService().askIt(text, new AsyncCallback() {
public void onFailure(Throwable t) {
Window.alert(t.getMessage());
}
public void onSuccess(Object data) {
Window.alert((String) data);
}
});
}
...
ボタンをクリックすると
askServer() メソッドが呼び出され、 入力テキストの内容を渡します。 この例では、 入力値が正しい質問であるかも検証します。 askServer() メソッドは非同期クライアントスタブへの参照を取得し (getService() メソッドで返される)、 askIt() メソッドを呼び出します。 その結果はアラートウィンドウに表示されます (または呼び出しが失敗するとエラーメッセージが表示されます)。
この例の完全なコードは Seam ディストリビューションの
examples/remoting/gwt ディレクトリにあります。