|
Norbert Lindenberg English: Developing Multilingual Web Applications Using JavaServer Pages Technology 今では、JavaServer Pages (JSP) 技術は Web アプリケーション開発者のお気に入りのツールになっています。JSP ページを使用すれば、開発者は他のプログラミング知識がなくても動的な Web ページを設計できるだけでなく、拡張可能なタグメカニズムを使用することによって、JSP ページの下で動作するソフトウェアコンポーネントの機能を利用できるからです。 Java Community Process を通じて開発された新しい拡張機能は、多言語アプリケーション開発のための幅広いサポートを提供します。この JavaServer Pages Standard Tag Library には、地域対応の機能とロケール対応の書式化をサポートする一連のタグなど、さまざまな機能が定義されています。 この解説では、最初に JavaServer Pages 技術について簡単に説明します。これによって、国際化の諸問題に対してこの技術をどのように使用すればよいかがわかります。次に、多言語 Web アプリケーションの開発に特有の主な問題をいくつか取り上げ、JavaServer Pages 技術 (ロケールの判別と地域対応、文字のエンコーディング、書式化と解析など) を使ってそれらの問題をどのように解決するかを説明します。 JavaServer Pages 技術JavaServer Pages (と、関連するいくつかの技術) は、Web アプリケーションのプレゼンテーションレイヤに位置しています。開発者は、JSP ページを使用することによって、ネットワーク上のビジネスロジックやデータベースといったさまざまなサービスと対話する動的な Web ページを開発できます。 JavaServer PagesJSP 技術に基づくページでは、HTML や XML などの静的なコンテンツと XML 風のタグが結合されます。そして、これらのタグと下位で動作するソフトウェアライブラリとが接続されます。これらのライブラリは、通常、Java プログラミング言語で作成されています。この場合に特に重要な Java 技術は、JSP と Java クラス間の汎用インタフェースとしての JavaBeans コンポーネントアーキテクチャと、SQL データベースのアクセスに必要な Java Database Connectivity (JDBC) API、それに、XML 処理に必要なさまざまなライブラリです。 JSP ページ自体はサーブレット形式の Java コードにコンパイルされ、実行されます。サーブレットとは、コンパイルされ、サーバーにリンクされる Web サーバーの拡張です。これによって、実行は、スクリプト言語の場合よりも速くなります。Java プログラミング言語で作成されたサーブレットと JSP ページは、いっしょに使用されることがよくあります。この場合には、サーブレットがコントローラになり、JSP ページがアプリケーションのビューになります。 JavaServer Pages とその下で動作するサーブレット技術は、HTTP 要求/応答情報の処理や、クッキーや URL 再作成に基づくセッション維持を強力にサポートします。 JSP 技術を使用する重要な理由の 1 つは、ページオーサーの仕事とアプリケーション開発者の仕事を分離できる点にあります。Java ステートメントを JSP ページに直接組み込むことは「可能」ではありますが、開発者は、この方法を避けるべきだと考えるようになり、今ではカスタムタグを使用する傾向にありま す。 JavaServer Pages Standard Tag LibraryJavaServer Pages Standard Tag Library (JSTL) には、JSP ページでよく使われる機能のいくつかをまとめたカスタムアクションが含まれています。JSTL は、その構築に貢献してくれた人々がそれぞれのライブラリを通して得た経験に基づいて作られました。このライブラリは、アプリケーションが実際に動作する サーバーから独立した標準的なインタフェースとなります。 JSTL では、カスタムタグの他に、式言語が新たに導入されます。そのため、JSP ページでスクリプト言語式を使用する必要性はさらに薄れます。さらに、JSTL では、JSP ページでのスクリプトライブラリやタグライブラリの使用に制約を課すタグライブラリ検証機能が導入されます。式言語の拡張版と、スクリプト機能を抑制する 機能は、その後、JSP 2.0 仕様に組み込まれています。したがって、JSTL のこのような機能は JSP 1.2 を使用する場合にのみ必要です。 カスタムアクションの対象となる主な分野は次のとおりです。
ロケールの判別と地域対応多言語 Web アプリケーションの設計では、まず、ユーザーの言語とロケール設定をどのように判別し、これらの設定を、アプリケーションや Java 実行時環境がサポートするロケール群とどのように対応付けるかを決める必要があります。このセクションでは、最初に、Web アプリケーションで対処しなければならない外部環境とその要件について述べます。次に、その下で動作する Java 2 Standard Edition (J2SE) プラットフォームの機能について概観し、最後に、JavaServer Pages Standard Tag Library のタグによって環境と J2SE がどのように接続されるのかを説明します。 ユーザー設定の判別ユーザーの言語設定を Web アプリケーションから判別する方法は 2 つあります。最初の方法は、HTTP 要求ヘッダーフィールド
多くの場合、Web アプリケーションはいくつかのコンポーネントから構成されています。しかし、すべてのコンポーネントの地域対応が、同じ言語セットに対するものであるとは 限りません。とりわけ興味深いコンポーネントの 1 つに Java 実行時環境があります。このコンポーネントは、日付書式など、ロケールに依存するある種の機能分野で、40 を超える言語の 100 以上のロケールをサポートします。これは、一般的な Web アプリケーションがサポートするロケールの数をはるかに超えています。したがって、アプリケーションの開発者は、地域対応の機能をアプリケーション全体で サポートされている言語に限定するか、個々のコンポーネントの機能をそのまま利用できるようにするかを決める必要があります。前者の方法ではページに常に 同じ言語が表示されますが、後者の方法では同じページに異なる言語が表示されることがあります。たとえば、ほとんどのテキストにはある言語が使用される が、書式化された日付には別の言語が使用されるといった具合です。 Java 2 Standard Edition プラットフォームでの地域対応あるアプリケーションがどのロケールをサポートするかを JSTL がどのように判別するかを理解するために、Java 2 Standard
Edition プラットフォームでの地域対応がどのようになされているかを見てみましょう。コア部分には、
JavaServer Pages アプリケーションの地域対応アプローチJavaServer Pages に基づくアプリケーションの地域対応には、通常、2 つの方法が使用されます。最初の方法では、国際化ページを使って、ロケールに依存するコンテンツをカスタムタグから (しばしばリソースバンドルから) 取得します。この方法は、通常、ページの構造が複雑で、かつその構造の整合性をすべてのロケールの間で維持する必要があるあるときに有効です。もう 1 つの方法では、ロケール固有の個々のページと、サーブレットを使用します。このサーブレットは、ユーザーが好むロケールに基づいて適切なページを呼び出し ます。この方法は、ページの主な内容がテキストである場合や、ページの構造がロケールによって著しく異なる恐れがある場合に有効です。 JSTL におけるロケールの判別と地域対応JSTL は J2SE の機能の上に構築されたもので、ロケールの判別と地域対応を行います。ロケールの判別機能は、どちらの JSP 地域対応方法 (前出の説明を参照) でも使用できますが、地域対応化機能は国際化ページをサポートするためのものです。 JSTL は、ユーザーのロケール設定を判別する前述の方法を両方ともサポートします。アプリケーションでは、JSTL の 次の例は、Web
アプリケーションの最初のページで使用できるいくつかのコード部分です。これらのコード部分を同時に使用すれば、ユーザーが自身のロケールを極めて容易に
選択できます。このコードは、ページ <%-- Interpret user's locale choice --%> 最初のセクション (このセクションは生成された HTML ページのどのコンテンツよりも前に来る必要がある)
では、ユーザーがどのロケールを選択したかを解析します。その結果、要求パラメータから JSP ページを知ることができます。 2 つめのセクション (このセクションは生成された HTML ページのコンテンツの一部です)
は、同じページに戻るユーザーリンクです。ただし、 最後のセクションは、 ロケールがアプリケーション自身のユーザーインタフェースから選択され、 JSTL
は、どのロケールがサポートされているかを判別するために、アプリケーションが使用しているリソースバンドルを参照します。リソースバンドルにアクセスす
るアクションには、
この例をいくつか示します。あるアプリケーションに対して
ところで、リソースバンドルを参照するアクションがなぜ 2 つあるのでしょうか。その違いは使い方にあります。 地域対応コンテキストを使用する JSTL タグに <fmt:setBundle basename="Errors" var="errorBundle" /> 次に、地域対応コンテキストと関連付けられた要求ロケールがなぜあるのでしょうか。JSTL
は、このロケールを通して、書式化タグを、アプリケーションがサポートする言語に限定します。これによって、表示されるページでは常に同じ言語が使用され
ます。 <jsp:useBean id="now" class="java.util.Date" /> HTTP の 最後に、地域対応コンテキストは、なぜ要求ロケールを使用するのでしょうか (見つけたリソースバンドルのロケールではなく)。それは、書式化タグによっては必要になるかもしれない重要な情報が失われるのを防ぐためです。多くのア プリケーションは同じ言語のさまざまな異形を区別せずに、たとえば、英語のリソースバンドルだけを提供します。テキストが英国でもオーストラリアでもシン ガポールでも同じように理解されることを期待するわけです。しかし、日付を書式化する場合には、国が重要になります。英国人にとって「2/6/02」は 「2 June 2002」ですが、米国式に慣れた人には「February 6, 2002」を意味します。したがって、多くの場合、要求ロケール (リソースバンドルロケールではなく) が使用される場合には、国情報が保存されます。 文字のエンコーディングテキストをコンピュータに格納したり、ネットワーク経由で伝送したりする場合には、現在、テキストを表す方法として 2 つのモデルが使用されています。1 つは、少数の言語や国、オペレーティングシステムに特有の古い文字エンコーディングモデルです (ISO 8859 シリーズや Windows コードページ、EUC エンコーディングなど)。もう 1 つは、あらゆる言語を表すことができ (少なくとも理論的には)、どこにでも使用できる Unicode ベースの新しいエンコーディングモデルです。 旧モデルには重大な欠点があります。
Web コンテンツの作成や配布、解釈に使用される主要なソフトウェアシステムの最新バージョンでは、新しいモデルが主流になっています。このようなバージョン は、通常、内部処理に Unicode を使用しています。あるいは、少なくとも、UTF-8 (Web で使用される Unicode ベースのエンコーディング) をどのように処理すべきかを承知しています。Unicode ベースのエンコーディングには明確な利点があります。このエンコーディングでは、多言語のページが可能で、ロケール処理の問題が文字エンコーディングと明 確に分離されます。さらに、エンコーディングの変換によって情報が失われるおそれもほとんどありません。Unicode ベースのエンコーディングは、現代のサーバーシステムやクライアントシステムにうまく当てはまります。 それにもかかわらず、多くの Web 開発者は依然として UTF-8 の使用を躊躇しています。その理由には、このエンコーディングがうまく動作しない旧バージョンのブラウザをサポートする必要性や、このエンコーディングを サポートするツールの欠如などが考えられます。 JavaServer Pages 技術は両方のモデルをサポートします。次の各セクションでは、文字のエンコーディングが問題となるさまざまな分野を概観し、JSP 技術や JSTL がこのような問題をどのように処理するのかを説明します。 ソースページエンコーディングの処理JSP ソースファイルのエンコーディングは、それを編集するツールがあるかどうかで決まります。そのため、一般には、国やオペレーティングシステム固有のエン コーディングが使用されます。文字エンコーディングを JSP 実行時環境 (「コンテナ」) に伝える方法はいくつかあります。そして、そのメカニズムとルールはこれまでにある程度の進化を見てきました。さらに、JSP ファイルの構文として標準構文と XML ベースの新構文があることも好都合です。 JSP 2.0 仕様は、文字エンコーディングを検出するときに 2 つの構文を区別できます。XML
構文のファイルであれば、エンコーディングは XML 仕様に従って検出されます。つまり、デフォルトは UTF-8 か UTF-16
であり、それ以外のエンコーディングは、ファイル冒頭の XML 宣言で宣言されていなければなりません。標準構文のファイルの場合は、コンテナが 2
つの主要な情報源を参照します。コンテナは、まず、アプリケーションの配備記述子の中から、 ここでは、JSP 2.0 に基づくアプリケーションに対する簡単な推奨事項を紹介します。まず、XML 構文のファイルの場合、UTF-8 か
UTF-16
で適切にエンコーディングされていないファイルは文字エンコーディングを明示すべきです。標準構文のファイルの場合は、すべてのソールファイルに
UTF-8 を使用するのであれば、配備記述子にある単一要素 <jsp-property-group> アプリケーションのソースファイルをこのように編成できない場合は、個々のソースファイルに JSP 1.2 仕様は、ソースファイルの文字エンコーディングに関して、標準構文のファイルと XML
構文のファイルを明確に区別していません。さらに、この仕様では、配備記述子に文字エンコーディングを指定できません。したがって、JSP 1.2
コンテナ用のアプリケーションでは、文字エンコーディングを正しく検出するために、 JSTL には Web ページエンコーディングの処理Web アプリケーションは、生成される Web ページに使用される文字エンコーディング (応答文字エンコーディング)
を選択する必要があります。ただし、その際には、ターゲットとなるブラウザの機能や、ページコンテンツの書き込みシステムや言語の機能、さらに場合によっ
てはブラウザのホストオペレーティングシステムの機能を考慮する必要があります。HTTP 仕様では、文字エンコーディングは ターゲットとするすべてのブラウザが UTF-8 をサポートする場合には、通常、このエンコーディングを使用すべきです。それによって、多言語文書がサポートされるだけでなく、文字変換による情報の損失 を避けることができます。 UTF-8 を使用できない場合は、文字エンコーディングと使用する言語 (特殊文字を含む) の対応に注意を払う必要があります。間違いが起るのを避けるためには、ページ全体で強制的に同じ言語を使用する必要があるかもしれません。これについて は、この解説の始めの方にある「ロケールの判別と地域対応」セクションを参照してください。さらに、「€」文字の使用を避ける必要があるかもしれません。 ページの文字エンコーディングは、Web アプリケーションで明示的に指定することもできますし、ロケール情報を使って間接的に JSP 技術に選択させることもできます。
古い文字エンコーディングがサポートされているのであれば、文字エンコーディングの暗黙的な判別であってもかまいません
(ただし、その場合でも、ページの中で同じ言語が常に使用され、かつ、一般的に使用されている文字エンコーディングでサポートされない恐れがある特殊文字
が使用されないことが前提です)。しかし、UTF-8 を使用するためには明示的な指定が必要です。Servlet 2.4
仕様では、明示的な指定が暗黙的な指定よりも優先するため、 要求パラメータエンコーディングの処理JSP ページは Web ページを生成できるだけでなく、HTTP 要求に付随するパラメータを受信し、解釈することができます。この要求は、通常、前に生成された Web ページの一部であるフォームからの入力です。このようなパラメータの文字エンコーディングはどこにも指定されていません。しかし、ブラウザは、事実上の標 準として、このフォームを含むページと同じエンコーディングを使用します。 このことは、以前に生成されたページのエンコーディングを Web アプリケーションが常に知っていなければならないことを意味します。一般的に使用されるメカニズムでは、エンコーディングの名前がフォーム自体の隠された フィールドに格納され、次回の要求でそれが最初のパラメータとして抽出され、他のパラメータの復号化に使用されます。しかし、JSP ページでは、セッション管理を通して要求と要求の間で情報を共有することができます。 アプリケーションでは、JSTL カスタムアクション 書式化と解析数値や日付などのデータを地域対応書式で表示する機能は、ユーザーの入力を解釈する機能と同じように、どのようなアプリケーションでも必要になりま す。個々の言語や文化の書式はさまざまであるため、そのためのライブラリが存在しなければ、この仕事は、開発者にとって簡単な仕事とはいえません。 幸いなことに、そのようなライブラリがあります。Java 2 Standard Edition (J2SE) プラットフォームの JavaServer Pages Standard Tag Library には、この機能を JSP ページで直接使用できるようにするカスタムアクションが含まれています。 書式化アクションや解析アクションのロケールの判別数値や日付のための書式アクションや解析アクションを使用する場合には、事前定義された地域対応コンテキストがあっても (たとえば、 数値の書式化と解析数値の形式化や解析を行う JSTL カスタムアクション これらのアクションによる通貨の書式化サポートは、とりわけ興味深いものがあります。これまで、多くの書式化ライブラリでは、通貨記号はロケールか ら導き出せるものとされていました。たとえば、ロケールが China なら、通貨は RMB であるといった具合です。しかし、国境を越えた取引が行われる環境では、このことはあまり意味がありません。たとえば、ある英国の企業がポンドで計算した 価格を Web アプリケーションが RMB で表示するとします。これには 2 つの問題があります。RMB の価値はポンドよりもずっと低く、RMB をポンドに戻すことは困難であるかもしれません。通貨の選択は実際にはビジネスの問題であるため、通貨は、書式の一部としてではなく、値の一部として取り 扱う必要があります。
<fmt:formatNumber type="currency" value="${price.value}" JSP ページで通貨コードを指定すると、その下で動作する 日付と時刻の書式化と解析日付や時刻の書式化や解析を行う JSTL カスタムアクション 興味深い点は、表示される日付や時刻がロケール固有の書式に依存するだけでなく、時間帯の認識にも依存していることです。ユーザーにとって、通常、
サーバーの時間帯は重要ではありません。しかし、一方で、ユーザーがどの時間帯にいるのかを簡単に知る方法はありません。アプリケーションでは、クライア
ント側の JavaScript コードを使用することによって、GMT
とユーザーの時間帯とのオフセットを知ることができます。あるいは、現在の時間帯をユーザープロファイルの一部としてユーザーに指定させることもできま
す。JSTL アクションではこの問題を解決できませんが、JSTL には、時間帯の日付や時刻の書式化と解析を知るためのカスタムアクションが 2
つあります。 メッセージの書式化前に述べた たとえば、JSP ページに次のテキストが指定されているとします。 <jsp:useBean id="now" class="java.util.Date" /> 見つかったリソースバンドルがドイツ語で、キー まとめこれまでの説明でおわかりのように、JavaServer Pages 技術 (とりわけ、JavaServer Pages Standard Tag Library) は、多言語アプリケーションの構築に使用できる強固な基盤であるといえます。しかし、設計に当たっては、いくつかの選択肢を慎重に検討する必要がありま す。たとえば、ユーザーの言語とロケールの設定をどのように判別するかや、地域対応化のために JSP ページの構造をどのようにするか、すべてのページを単一の言語に限定するか既存のロケールサポートを全面的に使用するか、どの文字エンコーディングモデル を使用するか、といったことです。JSP 技術を使えばどの選択肢にも対応できますので、世界中のユーザーに最も適切な方法で情報を提供できます。とりわけ重要な点は、ユーザー独自の言語で提供で きることです。 参照R. Fielding 他: 『Hypertext Transfer Protocol -- HTTP/1.1. RFC 2616』The Internet Society、1999 年 Dave Raggett 他 (ed.): 『HTML 4.01 Specification』World Wide Web Consortium、1999 年 Tim Bray 他 (ed.): 『Extensible Markup Language (XML) 1.0 (Second Edition)』World Wide Web Consortium、 2000 年 『JavaTM 2 Platform, Standard Edition, v 1.4.2 API Specification』 Sun Microsystems、2002 年 Danny Coward (ed.): 『JavaTM Servlet Specification. Version 2.3』Sun Microsystems、 2001 年 Danny Coward, Yutaka Yoshida (ed.): 『JavaTM Servlet Specification. Version 2.4』Sun Microsystems、 2003 年 Eduardo Pelegrí-Llopart (ed.): 『JavaServer PagesTM Specification. Version 1.2』 Sun Microsystems、2001 年 Mark Roth, Eduardo Pelegrí-Llopart (ed.): 『JavaServer PagesTM Specification. Version 2.0』 Sun Microsystems、2003 年 Pierre Delisle (ed.): 『JavaServer PagesTM Standard Tag Library. Version 1.0』Sun Microsystems、2002 年 Pierre Delisle (ed.): 『JavaServer PagesTM Standard Tag Library. Version 1.1』Sun Microsystems、2003 年 著者についてNorbert Lindenberg 氏は Sun Microsystems の Java Web Services グループに属し、Java の国際化で指導的な役割を担っています。Sun に入社する前は、General Magic や Apple Computer でさまざまな国際化プロジェクトに係わってきました。ドイツの Universität Karlsruhe からコンピュータサイエンスの修士号を取得しています。 | |||||||||||||||||||||||
Oracle is reviewing the Sun product roadmap and will provide guidance to customers in accordance with Oracle's standard product communication policies. Any resulting features and timing of release of such features as determined by Oracle's review of roadmaps, are at the sole discretion of Oracle. All product roadmap information, whether communicated by Sun Microsystems or by Oracle, does not represent a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. It is intended for information purposes only, and may not be incorporated into any contract.
|
| ||||||||||||