【Java & Tomcat】日本語のリクエスト(サンプルコード付き)

  • このエントリーをはてなブックマークに追加
  • Pocket

サーブレットへのリクエストで日本語のデータを処理するにあたっては「文字コード」について定義する必要がある。今回はその方法について説明する。

日本語のリクエストへの対応の仕方

日本語のリクエストというのは、日本語の全角文字がクライアントからのリクエストのデータに含まれているということである。例えば、次のような画面があった場合テキストフィールドに漢字で名前が入力されても、それだけでリクエストが日本語の漢字だと認識されるわけではない。入力された文字がどんな種類のものかを設定しなければならない。

文字がどんな種類かを設定するために、文字コードというものが決められている。例えば、Shift_JISやUTF-8というものがある。Tomcat 8からは、リクエストの文字コードが「ISO-8859-1」から「UTF-8」になった。

テキスト入力の例を考えてみよう。

文字コードの設定をしないで入力された情報をそのままレスポンスとして表示させると、文字が正しく表示されない。これは、doPostメソッドでレスポンスを返した結果である。

サーブレットに、このテキスト入力フィールドに入力されたデータがUTF-8であると認識させるために、クライアントからのリクエスト情報が入っているHttpServletRequestオブジェクトに対してsetCharacterEncoding()メソッドを使う必要がある。このメソッドによりリクエストのデータがUTF-8の文字コードであることを設定できる。

書き方の基本は簡単だ。

HttpServletRequestオブジェクト. setCharacterEncoding (文字コード);

実際のコードはこうなる。

response.setContentType("text/html; charset=UTF-8");

文字コードを設定するAPI仕様

setCharacterEncoding(java.lang.String env)

戻り値の型

void

内容

リクエストのボディの中で使われている文字コードの名前を上書きする。このメソッドはリクエストパラメータを読むか、getReader()を用いて入力を読むことに先立って呼び出されなければならない。

引数:文字コードの名前を含む文字列。

例外::java.io.UnsupportedEncodingException – もし正しいコードでなければ。

日本語のリクエストを処理するサンプルプログラム

このサンプルプログラムは、入力されたリクエストデータの文字コードにUTF-8を設定する。リクエストから取得したデータをレスポンスとして表示する。リクエストがGETメソッドを使っていても、POSTメソッドを使っていても両方正しく文字コードが扱われていることを示している。

サーブレットの配置とプログラムのコードは次のようになっている。

最初にHTMLで書かれた入力画面のコードを示す。この画面は、リクエストデータの文字コードにUTF-8を設定するサーブレットのdoGetメソッドを呼び出す。

  • サーブレット:ServletSetCharacterEncodingUft8
  • サーブレットのメソッド:doGet

次のHTMLで書かれた画面は、リクエストデータの文字コードにUTF-8を設定するサーブレットのdoPostメソッドを呼び出す。

  • サーブレット:ServletSetCharacterEncodingUft8
  • サーブレットのメソッド:doPost

HTML画面からリクエストを受け取るサーブレットのコードを示す。このサーブレットは、文字コードの設定を行う。

実行結果

ブラウザにURL:http://localhost:8080/Servlet/setcharacterencodinginget.htmlを入力し、Enterを押す。

表示されるブラウザ画面:

テキストに「あいうえお」テキスト2と入力し、実行ボタンを押す。

表示されるブラウザ画面:

ブラウザにURL:http://localhost:8080/Servlet/setcharacterencodinginpost.htmlを入力し、Enterを押す。

テキストに「あいうえお」テキスト2と入力し、実行ボタンを押す。

表示されるブラウザ画面:

サンプルプログラムの説明

それでは簡単にプログラムの解説をしてゆこう。

  • [1] アノテーションの宣言をする。
  • [2] HttpServletを継承して、ServletSetCharacterEncodingUft8クラスを定義する。
  • [3] doGet()メソッドをオーバーライドして定義する。
  • [4] write()メソッドを呼ぶ。
  • [5] doPost ()メソッドをオーバーライドして定義する。
  • [6] write()メソッドを呼ぶ。
  • [20] write()メソッドを定義する。
  • [21] レスポンスのContent Typeを設定する。
  • [22] HTMLを出力するためのPrintWriterオブジェクトを取得する。
  • [23] リクエストの文字コードをsetCharacterEncodingメソッドでUTF-8に設定する。
  • [24] 入力されたテキストの文字列を取得し、変数textに参照先を代入する。
  • [25]-[27] PrintWriterオブジェクトに「テキスト:」と表示し、続いて変数textの値を表示するHTMLコードを出力する。

まとめ

以前はプログラムで日本語を取り扱うにあたり、Shift-JISなどを使用すると使用環境や国によっては読めない(文字化けを起こす)状況が多々あったが、近年ではひとまずUTF-8を選んでおけば多くの環境に対応できるようになった。今後作成するプログラムで日本語の入出力を取り扱う際には必須事項となるので覚えておこう。

  • このエントリーをはてなブックマークに追加
  • Pocket

このページの続きや関連ページは下記から一覧で確認できる。

短期間でエンジニアになる方法

・「まったくの初心者だけどエンジニアになりたい!」

・「プログラマーとして転職をしたい!」

という方はリナックスアカデミーの資料を見てみてください。短期間で未経験からエンジニアになることができるスクールとして15年間選ばれ続けてきた理由やノウハウが載った資料です。

エンジニアの入り口に立つために必要な勉強技術の最新動向本当に使えるIT資格学習に役立つ国からの奨励金などの情報が詰まっています。

無料で2,3日中にお手元にお届けします。


資料を見てみる

SNSでもご購読できます。

コメントを残す

*

ゼロからエンジニアを目指す方へ
短期間でエンジニアになる方法

必要な勉強や技術の最新動向、本当に使えるIT資格、学習に役立つ国からの奨励金などの情報を無料でお届け

資料を見てみる