• 検索結果がありません。

Servlet JSP JSP Servlet/JSP における 日 本 語 の 処 理 - 1

N/A
N/A
Protected

Academic year: 2021

シェア "Servlet JSP JSP Servlet/JSP における 日 本 語 の 処 理 - 1"

Copied!
12
0
0

読み込み中.... (全文を見る)

全文

(1)

Servlet/JSP

における日本語の処理

における日本語の処理

における日本語の処理

における日本語の処理

Creation Date: Oct 18, 2000 Last Update: Mar 29, 2001

(2)

目次

目次

目次

目次

はじめに... 2 1 Servletでの日本語の処理... 3 1.1 日本語の出力 ... 3 1.2 日本語パラメータの取得 ... 4 2 JSPでの日本語の処理 ... 6 2.1 日本語の出力 ... 6 JSPエレメント・ウィザードによる追加 ... 6 プロジェクトのプロパティ設定 ... 8 2.2日本語パラメータの取得 ... 9

(3)

はじめに

はじめに

はじめに

はじめに

この資料は、Servlet や JavaServer Pages(以下 JSP)で Web アプリケーションを開発する 際に注意が必要な、日本語の処理方法について説明しています。 この資料を作成するにあたって、検証を行った環境は以下のとおりです。 ソフトウェア ソフトウェア ソフトウェア ソフトウェア バージョンバージョンバージョンバージョン

OS Windows NT 4.0(Service Pack 6a)

Solaris 2.6

Apache バージョン 1.3.12

Apache JServ バージョン 1.1

Oracle 9i Application Server(9iAS) バージョン 1.0.2

Tomcat バージョン 3.1

(4)

1 Servlet

での日本語の処理

での日本語の処理

での日本語の処理

での日本語の処理

1.1

日本語の出力

日本語の出力

日本語の出力

日本語の出力

まず、Servlet で日本語を正しく出力するための方法について説明します。 JDeveloper 3.1の HTTP サーブレット・ウィザードを使用して、「こんにちは」と 表示するだけの簡単な Servlet を作成したとすると、『サンプル 1-1』のようなコー ドになるでしょう。 サンプル サンプル サンプル サンプル 1-1

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { responce.setContentType(“text/html”);

PrintWriter out = new PrintWriter(responce.getOutputStream()); out.println(“<html>”); out.println(“<head><title>Servlet1</title></head>”); out.println(“<body>こんにちは”); out.println(“</body></html>”); out.close(); } サンプル 1-1 では、次のようにPrintWriterを取得しています。

PrintWriter out = new PrintWriter(responce.getOutputStream());

この場合、Servlet エンジンによっては、日本語が正しく表示されない場合があ ります(例えば、この Servlet を Windows 環境でコンパイルして、Solaris上の Apache JServ上で実行した場合には「?????」と表示されてしまいます)。

この現象は、Servlet を『サンプル 1-2』のように変更することで回避することが できます。Servlet の仕様では getWriter()メソッドは、setContentType()

メソッドの MIME タイプの後に記述された文字コードに対応したエンコーディン グを使用するPrintWriterを生成します。これにより、どの Servlet エンジンや プラットフォームでも正しく日本語を表示することが可能になります。 サンプル サンプル サンプル サンプル 1-2 // 変更前 // responce.setContentType(“text/html”);

//PrintWriter out = new PrintWriter(responce.getOutputStream());

// 変更後

responce.setContentType(“text/html;charset=SHIFT_JIS”); PrintWriter out = response.getWriter();

サンプル 1-2 では、「SHIFT_JIS」が指定されていますが、日本語を扱う場合は 「ISO-2022-JP」「SHIFT_JIS」「X-EUC-JP」のいずれかになります。

(5)

備考 備考 備考 備考:::: JDeveloper の次期バージョンの HTTP サーブレット・ウィザードは、標準で サンプル 1-2 のようなコードが生成されるように修正される予定です。

1.2

日本語パラメータの取得

日本語パラメータの取得

日本語パラメータの取得

日本語パラメータの取得

Servlet では、ブラウザから送信されたパラメータは、getParameter()メソッドを 使用して取得することができます。『サンプル 1-3』は、POST メソッドによって 送信されたパラメータ(param1)の値をそのまま表示するだけの、簡単な Servlet です。 サンプル サンプル サンプル サンプル 1-3

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

responce.setContentType(..); PrintWriter out = ...;

// パラメータparam1の値を取得

String value1 = request.getParameter(“param1”);

out.println(“入力されたパラメータの値: ” + value1); }

この Servlet を JDeveloper 3.1 の環境内でテストした場合は、問題なく実行でき ますが、Apache JServ や Tomcat など一般的な Servlet エンジン上で実行した場合に は、パラメータの値が文字化けしてしまいます。

JDeveloper 3.1にビルトインされている Servlet エンジン(Web-to-Go)は、実行

しているマシンのロケールに応じて、POSTメソッドで受け取ったパラメータの文 字コードを変換する実装になっています。例えば、Windows NT/2000 の「地域の プロパティ」で「日本語」を選択した場合には SHIFT_JIS として扱います。一方、 一般的な Servlet エンジンでは、受け取ったパラメータの文字コードを判別するこ とができません。これは、HTTP に、送信されてきたパラメータの文字コードが 何であるか、という情報が含まれていないからです。そのため、ISO-8859-1 であ るものとして処理されるため、間違った形で Unicode に変換されます。これは、 現在のところ Servlet の仕様です。 注意 注意 注意

注意:::: GET メソッドで送信されたパラメータは、JDeveloper 3.1 の Servlet エンジ ンも、一般の Servlet エンジンと同様に ISO-8859-1 であるものと処理されま す。ただし WWW の世界では、GET メソッドを使用してマルチバイトの文 字列を送信することは推奨されていません。

(6)

日本語のパラメータを取得するには、次のステップが必要です。 1. FORMを表示する HTML ページの<META>タグの中で、文字コードを指定 する(『サンプル 1-4』)。Servletによって生成された HTML ページの場合は、 setContentType()メソッドに記述した文字コードと一致させる。 2. getParameter()メソッドで取得した文字列を一度バイト配列に戻して から、Stringオブジェクトを再作成する(『サンプル 1-5』)。 サンプル サンプル サンプル サンプル 1-4 <HTML> <HEAD> <META HTTP-EQUIV=”ContentType” CONTENT=”text/html;charset=SHIFT_JIS”> </HEAD> <BODY>...</BODY></HTML> サンプル サンプル サンプル サンプル 1-5 // responseのデフォルト・エンコーディングを取得

String enc = response.getCharacterEncoding();

responce.setContentType(…); PrintWriter out = …;

// エンコーディングを指定してバイト配列から正しい文字列を取得

String value0 = request.getParameter(“param1”);

String value1 = new String(value0.getBytes(enc),” JISAutoDetect”);

備考 備考 備考 備考:::: JDeveloper の次期バージョンにビルトインされる Servlet エンジンでは、パ ラメータの文字コード変換を自動的に行うかどうかをオプションで選択で きるようになる予定です。

(7)

2 JSP

での日本語の処理

での日本語の処理

での日本語の処理

での日本語の処理

2.1

日本語の出力

日本語の出力

日本語の出力

日本語の出力

Servletで日本語を出力する場合、setContentType()メソッドで MIME タイ プの後に文字コードを指定するということは、この資料の 1.1(3ページ)で説明 しました。 responce.setContentType(“text/html;charset=SHIFT_JIS”); JSP の場合は、JSP のページの先頭に記述する<%@ page ...%>タグ(Page Directive)の中で指定します。 <%@ page contentType=“text/html;charset=SHIFT_JIS”%> JDeveloper 3.1で JSP を作成する場合には、次の 2 つの方法が考えられます。 a. ビジネス・コンポーネント JSP アプリケーション・ウィザードを使用して 作成 b. メニューバーから「ファイル」→「新規」を選択し、起動されたオブジェ クト・ギャラリの「Web オブジェクト」タブ・ページから「JSP」アイコン をダブルクリック aの場合は、ウィザードにより Page Directive の設定が自動的に行われますが、b の場合は、手動または JSP エレメント・ウィザードを使用して追加するか、事前 にプロジェクトのプロパティを変更しておく必要があります。 JSPエレメント・ウィザードによる追加エレメント・ウィザードによる追加エレメント・ウィザードによる追加エレメント・ウィザードによる追加 JSPエレメント・ウィザードは、JSP のタグやカスケード・スタイル・シートの宣 言などを追加するためのウィザードです。JSP エレメント・ウィザードで Page Directiveを追加するには、次の手順が必要です。 1. JSPファイルをソース・エディタで開き、Page Directive を追加する行にカー ソルを移動 2. ソース・エディタを右クリックし、コンテキスト・メニューから「JSP エレ メント・ウィザード」を選択

(8)

図 図図 図 1: JSP エレメント・ウィザードの起動エレメント・ウィザードの起動エレメント・ウィザードの起動エレメント・ウィザードの起動 3. 「JSP エレメント・ウィザード」のステップ 1 で、「JSP エレメントの選択」 のツリーから「JSP Tags」ノードの下の「Page Directive」を選択し、「次へ」 をクリック 図 図 図 図 2: JSP エレメント・ウィザードエレメント・ウィザードエレメント・ウィザード ステップエレメント・ウィザード ステップステップステップ 1 4. 「JSP エレメント・ウィザード」のステップ 2 で、contentType の値を 「text/html;charset=ISO8859-1」から「text/html;charset=SHIFT_JIS」に変更

(9)

図 図 図 図 3: JSP エレメント・ウィザードエレメント・ウィザードエレメント・ウィザード ステップエレメント・ウィザード ステップステップステップ 2 プロジェクトのプロパティ設定 プロジェクトのプロパティ設定 プロジェクトのプロパティ設定 プロジェクトのプロパティ設定 JSPファイルを新規に作成した際に、自動的に Page Directive の宣言を追加する ためには、次の手順が必要です。 1. ナビゲータでプロジェクト・ファイルを右クリックし、コンテキスト・メ ニューから「プロパティ」を選択 2. 「コンパイラ」タブ・ページで、エンコーディングを「MS932」(JDK 1.1.8 よりも前のバージョンを使用している場合は「SJIS」)に変更 図 図 図 図 4: プロジェクトのプロパティを変更プロジェクトのプロパティを変更プロジェクトのプロパティを変更プロジェクトのプロパティを変更

(10)

2.2

日本語パラメータの取得

日本語パラメータの取得

日本語パラメータの取得

日本語パラメータの取得

JSPでは、サーバー上で Servlet のソースに変換され、コンパイルされて実行さ れるため、Tomcat にデフォルトで用意されている JSP エンジンなど、一般的な JSP エンジンを使用する場合、日本語のパラメータを処理するためには、『サンプル 2-1』のように Servlet と同様の処理が必要です。 サンプル サンプル サンプル サンプル 2-1 <%

String para1 = request.getParameter(“para1”); byte[] b = papa1.getByte(“8859_1”);

String value1 = new String(b, “SJIS”); %>

JDeveloper 3.1や Oracle 9i Application Server(9iAS)で使用されている JSP エン ジンである Oracle JSP では、このような処理は必要ありません。

Oracle JSPには「translate_params」と呼ばれる初期化パラメータが用意されてお り、この値を「true」と設定すると Page Directive で指定した文字コードを元に、 自動的に受け取ったパラメータの文字コードを変換します。

例えば、Page Directive で

<% page contentType=”text/html;charset=”SHIFT_JIS”%>

とした場合、受け取ったパラメータは SHIFT_JIS として扱われます。

この資料の 1.2 でも説明した通り、日本語パラメータを正しく処理するには、 FORMを表示する HTML ページで、<META>タグの ContentType の中で文字コード を指定する必要がありますが、JSP についても同様です。このとき、Page Directive で指定した文字コードと<META>タグの中で指定した文字コードは必ず一致させ てください。 注意 注意 注意 注意 1111: 9iAS では、「translate_params」のデフォルトの値は「false」に設定されてい ます。設定方法は、9iAS のドキュメントを参照してください。 注意 注意 注意

注意 2:2:2:2: Apache JServ や Tomcat に Oracle JSP を組み込んだ場合や 9iAS 上で Oracle

JSPを使用した場合、POST メソッド・GET メソッドどちらの場合もパラメ

ータの文字コードは正しく認識されますが、JDeveloper 3.1 で Oracle JSP を 使用した場合、GET メソッドで受け取ったパラメータの文字コードは正し く変換されません。ただし、前述した通り、WWW の世界では GET パラメ ータでマルチバイト文字を使用することは推奨されていません。

(11)

なお、Oracle JSP を Apache JServ や Tomcat と組み合わせて使用するために必要 な設定方法については、JDeveloper 3.1 製品版に同梱されている『JSP アプリケー ションのための Apache 利用ガイド』または、Oracle Technology Network Japan (http://otn.oracle.co.jp/)の『JSP アプリケーションのための Apache + JServ の設定 方法』『JSP アプリケーションのための Tomcat の設定方法』を参照してください)。

(12)

日本オラクル株式会社 日本オラクル株式会社 日本オラクル株式会社 日本オラクル株式会社

Copyright(C) Oracle Corporation Japan. All Rights Reserved. 無断転載を禁ず この文書はあくまでも参考資料であり、掲載されている情報は予告なしに変更されるこ とがあります。日本オラクル社は本書の内容に関していかなる保証もいたしません。また、 本書の内容に関連したいかなる損害についても責任を負いかねます。 Oracle は、オラクル社の登録商標です。JDeveloper は、オラクル社の商標または登録商 標です。 他のすべての企業名と製品名は、識別のためにのみ掲載されており、それぞれの所有者 の商標の場合があります。

図 図図図 3: JSP エレメント・ウィザード エレメント・ウィザード エレメント・ウィザードエレメント・ウィザード ステップステップステップステップ 2  プロジェクトのプロパティ設定プロジェクトのプロパティ設定プロジェクトのプロパティ設定 プロジェクトのプロパティ設定  JSP ファイルを新規に作成した際に、自動的に Page Directive の宣言を追加する ためには、次の手順が必要です。  1

参照

関連したドキュメント

備 考 瀬戸内海 300m 500m 1000m.

備考 1.「処方」欄には、薬名、分量、用法及び用量を記載すること。

人為事象 選定基準 評価要否 備考. 1 航空機落下 A 不要 落下確率は 10

 実施にあたっては、損傷したHIC排気フィルタと類似する環境 ( ミスト+エアブロー ) ※1 にある 排気フィルタ

変更前変更後備考 (2) 浸水防護重点化範囲の境界における浸水対策 【検討方針】

優越的地位の濫用は︑契約の不完備性に関する問題であり︑契約の不完備性が情報の不完全性によると考えれば︑

区分 授業科目の名称 講義等の内容 備考.. 文 化

授業科目の名称 講義等の内容 備考