サーブレットへのリクエストで日本語のデータを処理するにあたっては「文字コード」について定義する必要がある。今回はその方法について説明する。
日本語のリクエストへの対応の仕方
日本語のリクエストというのは、日本語の全角文字がクライアントからのリクエストのデータに含まれているということである。例えば、次のような画面があった場合テキストフィールドに漢字で名前が入力されても、それだけでリクエストが日本語の漢字だと認識されるわけではない。入力された文字がどんな種類のものかを設定しなければならない。
文字がどんな種類かを設定するために、文字コードというものが決められている。例えば、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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<title>日本語のGETリクエストサンプル</title>
</head>
<body>
<p>全角の文字を入力してください。(GETリクエスト)</p>
<form action="/Servlet/ServletSetCharacterEncodingUft8" method="get">
<p>テキスト:<input type="text" name="text"></p>
<p><input type="submit" value="実行" style="WIDTH: 200px; HEIGHT: 20px"></p>
</form>
</body>
</html>
次のHTMLで書かれた画面は、リクエストデータの文字コードにUTF-8を設定するサーブレットのdoPostメソッドを呼び出す。
- サーブレット:ServletSetCharacterEncodingUft8
- サーブレットのメソッド:doPost
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<title>日本語のPOSTリクエストサンプル</title>
</head>
<body>
<p>全角の文字を入力してください。(POSTリクエスト)</p>
<form action="/Servlet/ServletSetCharacterEncodingUft8" method="post">
<p>テキスト:<input type="text" name="text"></p>
<p><input type="submit" value="実行" style="WIDTH: 200px; HEIGHT: 20px"></p>
</form>
</body>
</html>
HTML画面からリクエストを受け取るサーブレットのコードを示す。このサーブレットは、文字コードの設定を行う。
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ServletSetCharacterEncodingUft8")//[1]
public class ServletSetCharacterEncodingUft8 extends HttpServlet {//[2]
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {//[3]
write(request, response);//[4]
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {//[5]
write(request, response);//[6]
}
private void write(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {//[20]
response.setContentType("text/html; charset=UTF-8");//[21]
PrintWriter out = response.getWriter();//[22]
request.setCharacterEncoding("UTF-8");//[23]
String name = request.getParameter("text");//[24]
out.println("<html><head></head><body>");//[25]
out.println("<p>テキスト:" + name +"</p>");//[26]
out.println("</body></html>");//[27]
}
}
実行結果
ブラウザに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を選んでおけば多くの環境に対応できるようになった。今後作成するプログラムで日本語の入出力を取り扱う際には必須事項となるので覚えておこう。









