SHOEISHA iD

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

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

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

japan.internet.com翻訳記事

インターネットアプリケーションの新しいフレームワーク「Guise」

HTML、JavaScript実装なしでAjaxを実現するJavaフレームワーク

「Hello User!」サンプル

 静的なコンテンツについて理解できたところで、次は、イベントに応答し、Webページのコンテンツを更新することがいかに簡単であるかを見ていきましょう。Guiseは背後でAjaxを自動的に使用しているため、サーバとの通信はバックグラウンドで発生し、ページの再ロードを引き起こすことなく、Webページへの変更が動的に行われます。では、Hello Worldパネルを少し変更して、Hello Userパネルを作成してみましょう。

package com.example;

import com.guiseframework.component.*;
import com.guiseframework.component.layout.*;
import com.guiseframework.event.*;
import com.guiseframework.validator.RegularExpressionStringValidator;

public class HelloUserPanel extends LayoutPanel
{

   public HelloUserPanel()
   {
      super(new FlowLayout(Flow.PAGE));
      setLabel("Guiseu2122 Demonstration: Hello User");

      final Label greetingLabel = new Label();
      greetingLabel.setVisible(false);
      add(greetingLabel);

      final TextControl<String> userInput = 
         new TextControl<String>(String.class);
      userInput.setLabel("What's your name?");
      userInput.setInfo("Enter a name that does not start with
                         whitespace.");
      userInput.setValidator(new RegularExpressionStringValidator
                             ("S+.*", true));
      add(userInput);

      final Button greetButton = new Button();
      greetButton.setLabel("Greet");
      greetButton.addActionListener(new ActionListener()
         {
            public void actionPerformed(final ActionEvent
                                        actionEvent)
            {
               if(HelloUserPanel.this.validate())
               {
                  final String user = userInput.getValue();
                  greetingLabel.setLabel("Hello, "+user+"!");
                  greetingLabel.setVisible(true);
               }
            }
         });
      add(greetButton);
   }
}

 ご存知のように、ボタンの押下などのイベントを検出するには、関連するコントロールにイベントリスナをインストールする必要があります。イベントリストに加えて、このパネルには、Hello Worldサンプルと異なる点がいくつかあります。

  • new FlowLayout(Flow.PAGE)
  • このパネルを領域に基づいてレイアウトする代わりに、FlowLayoutを使用して、追加されたすべてのコンポーネントをページに沿って垂直に配置します。垂直に配置するにはFlow.PAGEを指定します(ほとんどのロケールでは、行の進行方向は水平で、ページの進行方向は垂直です)。
  • new Label()
  • Headingコンポーネント内のテキストを表示する代わりに、Labelコンポーネントの情報を表示します。作成されるWebページでは、XHTMLの<label>要素を使用します。これは単に好みの問題です。
  • greetingLabel.setVisible(false)
  • ユーザー名がわからないので、最初はグリーティングラベルを非表示にします。
  • new TextControl<String>(String.class)
  • TextControlは、テキスト入力を受け取るコンポーネントです。他のValueControlと同様、ユーザーが入力する値が格納されます。テキストコントロールは、ジェネリックを使用して、格納する値のデータ型を指定します(このケースではString)。これは、ユーザーがテキストを入力しても、コントロールに格納される実際の値は、例えばBooleanの可能性もあり(truefalseのテキストで表現されます)、テキストとは限らないためです。
  • userInput.setInfo(...)
  • 多くのコンポーネントでは、コンポーネントラベルのように、状況に応じて異なる用途に使われる独立した情報を指定できます。多くの場合、コンポーネントの情報は、マウスポインタをコンポーネントの上に置いたときに表示されるツールヒントに表示されます。
  • userInput.setValidator(...)
  • アプリケーションでは、通常、ユーザーが入力する値を制限する必要があります。Guiseのすべての値コントロールでは、コーディングで値をチェックするのではなく、Validatorによる宣言的な制限を行います。Validatorは正しい値が入力されたことを自動的に確認し、値が不正な場合はエラーを表示します。この特殊なバリデータは、文字列を正規表現S+.*(空白以外の文字と、それに続くゼロ個以上の文字)で制限します。
  • validate()
  • すべてのコンポーネントは、自身を検証する機能を備えています。ネストされたコンポーネントを持つコンポーネントは、子を検証することもできます。パネル全体を検証すると、すべてのコントロールが自身を検証します。TextControlは、自身にValidatorが追加されている場合はそれを使用します(通常は、値が変更されたときにバリデータが既に起動されています)。このメソッドがtrueを返す場合は、すべてのコンポーネントは正しい値を格納しています。
  • userInput.getValue()
  • すべてのValueControlの値はgetValue()メソッドを通じて取得できます。コントロールはJavaジェネリックの使用を通じて正しいデータ型を既に返しているので、ここで返される値をキャストする必要はありません。この値はラベル内のユーザー名を更新するために使用され、ラベルがまだ表示されていない場合は、これを表示します。

Guiseの優れた機能

 駆け足の説明でしたが、Guiseの使用について、感じはつかめたことでしょう。今後の記事では、高級なアーキテクチャの概念から強力な対話機能に至るまで、Guiseフレームワークのさまざまな要因を、じっくりと、包括的に扱う予定です。さらに興味を持っていただくために、以降では、高度でありながら簡単に使用できるGuiseの機能をいくつか紹介します。

正規表現のマップ先

 Guiseのマップ先は正規表現で指定できます。例えば、パネルを<property:pathPattern>[^/]+/help</property:pathPattern>にマップして、「test/help」や「anything/help」などのパスに対応できます。

WebTrends準拠の自動ログ

 Guiseアプリケーションディスクリプションに<property:DCSID>webTrendsSDCID</property:DCSID>を追加することで、WebTrends準拠のログファイルを自動的に生成できます。

ユーザーの変更

 GuiseSession.setPrincipal(java.security.Principal)の呼び出しを通じて現在の「プリンシパル」を変更することによって、ユーザーログインおよびログアウトを実行できます。

ロケールの変更

 別の言語への変更は簡単です。GuiseSession.setLocale(java.util.Locale)を呼び出すだけで現在のセッションのコントロールが再設定され、必要に応じて新しいテキストや他のリソースが読み込まれます。

コンテナはコレクション

 Guiseの個々のContainerはJavaのIterableです。for(final Component<?> child:panel)を使用するだけで、例えばパネルのすべての子コンポーネントのイテレーションが可能です。

コントロールのプロトタイプ

 Guiseには特別な「プロトタイプ」が用意されており、属性と機能を共有する各種のコンポーネントを、簡単かつ統一された方法で作成できます。例えば、1つの「ファイルの保存」プロトタイプを作成すると、プロトタイプの正しい(国際化された)ラベルとアイコンを自動的に継承するボタンとメニュー項目を簡単に作成できます。これらは、選択されるとプロトタイプのアクションを実行し、プロトタイプが適切だと判断すると、無効または有効になります。

高度なセマンティクス

 Guiseでは、単に機能を記述するだけでなく、情報セマンティクスを定義できます。GuiseComponent.setInfo(java.lang.String)を使用して情報をコンポーネントに割り当てると、既定でツールヒントが表示されます。GuiseComponent.setDescription(java.lang.String)を使用して説明を設定すると、GuiseComponent.setFlyoverEnabled(boolean)でフライオーバもオンになっている場合は、フライオーバ表示になります。

ブックマーク

 ブックマークを簡単に設定できます。ユーザーがページに初めてアクセスしたときにコンポーネントに特別な処理を行わせるには、NavigationListenerインターフェイスを実装します。URIパラメータが、BookmarkとしてNavigationEventオブジェクトに渡されます。

まとめ

 Guiseは新しいインターネットアプリケーションフレームワークですが、急速に成長しており、複雑な現実のアプリケーションで評価を得ています。Guiseは標準のJavaを通じてアクセスできる強力で洗練されたオブジェクト指向のユーザーインターフェイスパラダイムであり、Guiseを使用する開発者は、Ajaxなどの下位レベルの基本テクノロジを意識せずに済みます。

 GuiseはXHTMLやJavaScriptを記述することなくインターネットアプリケーションを作成できる総合的な標準ベースのフレームワークであり、新しいインターネットアプリケーションのSwingおよびMFCとなることが期待されています。

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

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

もっと読む

この記事の著者

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

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

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

Garret Wilson(Garret Wilson)

自身が設立したGlobalMentor, Inc.でインターネット標準に関するコンサルティングを行う。Guiseの主要アーキテクトでもある。

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1242 2007/04/26 08:00

イベント

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

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

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

メールバックナンバー