|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
WebSphere PortalによるAjaxの使用 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Doug Phillips(dougep@us.ibm.com), Senior Software Engineer, IBM レベル:中級 原文の掲載:2006年6月28日 Ajaxについての噂を聞いて、自分のポータル・アプリケーションに使用できないかと考えてはいませんか。この記事では、ポータルでのAjaxの基本的な使用方法について説明します。ポータルにおいて最もコストのかかる操作の1つが、ページの更新操作です。Ajaxを使用すると、多数のユーザー対話イベントを処理してからページの各部分に更新を適用できるため、ページ全体を更新する必要がなくなります。これにより、ポータルのパフォーマンスを向上させ、ポータル・アプリケーション全体のアーキテクチャーをよりクリーンに作成することができますが、一番重要なことは、こうしたレスポンスのよいポータルによってユーザーの満足度が高くなるということです。 はじめにこの記事では、Ajaxをポータル・アプリケーションに統合する概念について説明します。一般的ないくつかのAjaxの記事は既に入手できるため(『リソース』セクションを参照)、この記事の読者はAjaxの基礎を理解していることを前提としています。つまり、Ajaxとは何か、その名前の由来、Ajaxは新しい概念ではないという事実、Googleが世界中の経営者や技術者にこの技術を浸透させた方法について、既に理解しているという前提です。CTO(最高技術責任者)からの電話で、会社のポータル・アプリケーションがAjax対応なのかを尋ねられたとき、立ち上がって「もちろんです!」と即答できるように、ポータル・アプリケーションにおけるAjaxの使用に関する有益な情報をこの記事で提供します。 この記事を読んで、会社のポータルにAjaxを採用するかどうかを検討してください。この記事ではポータル・アプリケーションを中心に説明しますが、ここで述べるヒントは通常、ほとんどの複雑なアプリケーションに対して応用できます。この記事は、今後のチュートリアルを理解するための準備でもあります。今後のチュートリアルの中で、Ajaxポートレット・アプリケーションの作成について詳しく説明していきます。 本題に入る前に、次のことに注意してください。Ajaxについて普段目にする内容の多くは、本来のAjaxではなくDynamic HTML (DHTML)についての内容です。Ajaxはその本来の意味において、「XMLHttpRequest」という単一のJavaScriptオブジェクトで構成されています。このクラスは、サーバーとその結果応答に対するバックグラウンド通信チャネルを指定します。ドラッグ・アンド・ドロップ、DOMの更新、スタイリング、その他の先進的な技術など、バックグラウンド通信チャネル以外はすべてDHTMLによるものです。
AjaxとWebSphere Portalが適合する理由ポータル環境で最もコストのかかる操作の1つが、ページの更新です。ユーザーがページ上でリンクのクリックやその他の操作を行った場合、ポータルは、対象となるポートレットに対して キャッシングによってオーバーヘッドの大部分が削減されますが、実行中のものも多数あります。Ajaxを使用すると、バックグラウンドで多数のユーザー対話イベントを処理してからページの各部分を更新することができます。その際、ポータル全体の更新サイクルは必要はありません。この技術によって各操作の応答性を高めることで、エンド・ユーザー・エクスペリエンスやアプリケーション全体のパフォーマンスを大幅に改善することができます。特定の状況においてAjaxを使用すると、アプリケーション全体のアーキテクチャーが一層クリーンになります。2次Ajaxコントローラー(サーブレットやWebサービスなど)を使用すると、モデル・コードはより厳密に分割されます。 完全なAjaxコントローラーの設計をアプリケーションに適用する場合、Ajaxコントローラーによってすべての基本ユーザー入力操作とセグメント化された表示の更新を処理する必要があります。ページ・レベルの移行時または主要な状態変更を処理する場合に限り、ポータルの
AjaxとWebSphere Portalが適合しない理由ではなぜ、高機能なインターネット・アプリケーションに、この新しい流行の技術を使用しないのでしょうか。あらゆる技術情報の週刊誌でAjaxがいいと紹介され、会社の上司からは「我々の業務目標の1つ」だから使用するようにと指示されているかもしれません。そのため使用してはいけないとは言いませんが、いくつかの落とし穴の可能性について理解しておく必要があります。
こうした問題を挙げると、Ajaxは現在の環境には適していないと判断したり、別の記事を参照したりするかもしれません。しかし、是非この記事を続けてお読みください。この記事を読めば、きっと自分のアプリケーションに追加したくなるはずです。 ここで重要なのは、慎重に行うことです。多少の変更を行ってもかまわないアプリケーションを用意し、ユーザーのフォームやウィザードに簡単なAjax機能を追加してみてください。少しの工夫で効果的なユーザー拡張が作成できるということを理解すれば、ポータル・アプリケーションに対して実際に仕掛けを追加する準備ができたことになります。
設計に関する考慮事項ポータル・アプリケーションにAjaxを追加する場合、複数のコントローラーを従来のMVCパターンに効果的に追加することになります。この場合、モデル・ロジックをクリーンに分割するという潜在的な利点があります。マイナス面は、より複雑になるということと、コントローラーを次の3つのアスペクトに分割せざるを得ないということです。
Ajaxをポータル・アプリケーションで使用するための基本的な前提として、分割コントローラーが必要です。通常の環境では、サーブレットを使用してAjaxクライアントと通信します。サーブレットにポートレットのWARファイルをバンドルしたり、サーブレットをスタンドアロンのWebアプリケーションの一部として含めることができます。 図1.Ajaxサーバーの対象となる可能性があるもの ![]()
AjaxツールキットAjaxを実装するマイナス面の1つとして、適切なクロス・ブラウザーのJavaScriptの作成が難しいことが挙げられます。Ajaxの抽象化を実現するJavaScriptやDHTMLの各種ツールキットがありますが、実際には種類が多すぎて、どのツールキットが現在のニーズに最適かをテストすることはできません。すべてのオープン・ソース・プロジェクトと同様に、これからの数年間で淘汰されるでしょう。 最も有望な品質の高い設計ツールキットとして、これまでに次の製品を使用してきました。Dojo、Rico、DWR (『リソース』セクションを参照)です。DoJoを使用するのは、Aspectのような高度なアーキテクチャーが使用されているためです。DWR (Direct Web Rendering)には、クライアントのJavaScriptからホスト・ベースのJavaBeansを参照する簡単な機能が備わっています。この他にも多数の製品が利用できます。現在の環境にはどの製品が適切であるかを判断する必要があります。
Ajaxをポートレット・アプリケーションに追加するポータル・アプリケーションにAjaxを実装するには、次に示す簡単な手順に従います。次の説明は、AjaxサーブレットにポートレットWARファイルをバンドルすることを前提としています。 サーブレットにポートレットのWARファイルをバンドルするプロセスは非常に簡単ですが、経験豊富なポートレット開発者でさえ、常にすべての詳細を理解しているわけではありません。このためここでは、完全で安全な詳細を示します。
リスト1. web.xml内でのサーブレット・マッピング
グローバル参照(リスト2参照)をJSPファイル内に定義し、ポートレット要求ライブラリーにアクセスできるようにする必要があります。グローバル変数を定義した後は、組込まれたJavaScriptにより、その参照を使用してサーブレットを安全にポイントできます。 リスト2. サーブレットへのグローバル参照
ポートレット・ページに追加する外部リソースと同様に、リスト3のとおり、URLをエンコードしてベース・コンテキストを設定します。 リスト3. URLをエンコードし、ベース・コンテキストを設定するスクリプト
ヒント: JavaScriptパラメーターに文字列引数を使用して、各ロード処理時にブラウザーによるキャッシュの更新処理を実行します。頻繁に変更される可能性のあるJavaScriptがある場合、この更新処理により、キャッシュされた古いコードがブラウザーで使用されなくなります。この例ではバージョンID (?v1.1.2) を使用していますが、どんな文字列でも機能します。 いくつかの定型的な操作を実行することにより、Ajaxの機能を実行することができます。ここで、概要を説明します。コードの説明については、今後の追加のチュートリアルを参照してください。
図2は、各部分がどのように関連しているかを示したものです。 図2.AJAX通信イベントのモデル
ポータル固有の考慮事項Ajaxをポータル・アプリケーションに実装する際に、注意するべき問題がいくつかあります。 グローバルJavaScript変数 通常の場合、ポータル・アプリケーション内のJavaScriptにはグローバル変数を使用しないようにします。ポータルにより、複数のポートレットが1つのページに集約されているためです。グローバルのJavaScript変数(リスト4を参照)のネーム・スペースを指定する場合が、そのいい例です。この場合、同じポートレットが同じページ上に2度デプロイされる場合でも、変数名が固有になるように指定します。 リスト4. JavaScript変数のネーム・スペースを指定する
Ajaxツールキットを使用している場合、抽象化層によって名前の競合が解決されます。 ID属性の使用 ページの一部を素早く更新する際に、Ajaxでは通常、ID属性が使用されます。HTMLタグで囲まれたID属性はDOMに対してグローバルであるため、これらのID属性が確実に固有の値になるようにします。重複したID属性が存在する場合、その結果は予測できず(通常は、望まない結果になります)、その問題の追跡は非常に困難になることがあります。 安全のため、リスト5に表示されているように(コードが読みづらくなることもありますが)、すべてのID属性にネーム・スペースを指定します。 リスト5. 安全のためID属性にネーム・スペースを指定する
状態のメンテナンス ページの一部を素早く更新する際に、Ajaxでは通常、ID属性が使用されます。HTMLタグで囲まれたID属性はDOMに対してグローバルであるため、これらのID属性が確実に固有の値になるようにします。重複したID属性が存在する場合、その結果は予測できず(通常は、望まない結果になります)、その問題の追跡は非常に困難になることがあります。 安全のため、リスト5に表示されているように(コードが読みづらくなることもありますが)、すべてのID属性にネーム・スペースを指定します。 セッション・データの共有 サーブレットにポータル・アプリケーションをバンドルすると、サーブレットとポートレットの間でセッション・データを共有できます。通常、セッション・データを共有する場合は、アプリケーション・スコープを使用します。サーブレットに対して、これが通常のセッション・スコープになります。サーブレットからポートレット・スコープ変数にアクセスするには、特別なネーム・スペースが指定された名前の値が必要になります。これは、ポータルに最初にデプロイされたときに設定されたポートレットIDに基づいた値です。開発中にこの値を抽出するのは、非常に困難です。あまり実用的ではありませんが、ポートレット・スコープ変数の構文は次のとおりです。
それぞれの値は、次のとおりです。 アクションURL Ajaxを使用している場合、アクションURLの処理には細心の注意が必要になることがあります。一般に、アクションURLは現在の アクションURLをセッション内に格納してもかまわない場合の例として、データ・セットの一部としてアクションURLのリンクが含まれているAjax駆動型のページング・データ・テーブルが挙げられます。ユーザーが「次へ」をクリックすると、ブラウザーによってサーブレットへのAjaxコールが生成されます。その後、サーブレットによってセッションから次ページのデータが抽出されるため、あらかじめアクションURLを定義しておく必要があります。 アクティビティーの通知 集約した情報が単一ページに詰め込まれた場合、ポータル・ページが非常にビジー状態になることがよくあります。バックグラウンドで実行されているAjaxコールはブラウザーのアクティビティー・アイコンをトリガーしないため、ユーザーに何らかのアクティビティーが実行されていることを一貫した表示方法で通知する必要があります。通知しない場合、アプリケーションがアクションの処理中でビジー状態になっていることを知らずに、ユーザーが混乱してしまう可能性があります(ユーザーを混乱させることは避けるべきです)。 この通知は、アクティビティー中にフローティングDIVセクション表示を使用したり、ブラウザーのステータス・バーに単純なメッセージを使用することにより(この方法は一部で不適切な形式だと考えられていますが)、実装することができます。そのページのAjax対応ポートレットに対して、一般的な「お待ちください」というメッセージを表示するカスタムのテーマ拡張を統合することも可能です。
まとめこの記事では、ポータル・アプリケーションにおけるAjaxの使用方法と使用する理由を説明しました。今後の関連チュートリアルでは、すべての部品をまとめてAjax対応データベース管理ツールを作成する方法を説明する予定です。こちらもぜひ参照してください。
リソース学ぶ製品/技術情報
筆者について(原文のまま)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||