日本語データの送信
- 2010-11-29 Mon 16:54:33
- データのやり取り
前回、フォームデータの送信・受信について勉強しましたが、例によって(?)日本語データを利用するには別の設定が必要になります。
Form1.jspに入力されたフォームデータ(入力パラメータ)は、ブラウザによって変換されてTomcatサーバへ送信されます。これをURLエンコードといいます。
URLエンコードされた文字列は、ブラウザのアドレス部分に表示されます。たとえば「Hello」という文字列を送信したら、ブラウザのアドレス部分は、
http://localhost:8080/siroto/Form1?message=hello
になると思いますが、この「?」から後ろの部分が入力パラメータです。
この入力パラメータが日本語の場合、受け取ったサーバが正しく再変換するように設定する必要があります。これをURLデコードといいます。
URLデコードをするには、URLエンコードした文字エンコーディングと同じ文字エンコーディングを指定する必要があります。つまり、Form1.jspではpageディレクティブによってWindows-31Jを指定していますから、URLデコードでも同じ指定をしなければなりません。
URLデコードをするには、setCharacterEncoding()メソッドを使います。
ここまで説明したところで、いつものようにフォルダとファイルを作成しましょう。前回作った「form_entry」フォルダの中に「Form2.jsp」を作り、「WEB-INF/src」の下の「form_Entry」パッケージの下に「Form2.java」のファイルを作ります。
web.xmlの設定
<servlet>
<servlet-name>Form2</servlet-name>
<servlet-class>form_entry.Form2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Form2
<url-pattern>/Form2
</servlet-mapping>
いつものとおり、上のコードを「<web-app> ~ </web-app>」の間に挿入します。
JSPファイルのコード
<%@page contentType="text/html; charset=Windows-31J" %>
<html>
<body>
<h3>日本語でフォームデータを送信してみましょう。</h3>
<form action="../Form2">
<input type="text" name="message">
<input type="submit" value="送信">
</form>
</body>
</html>
これも問題ないかと思います。送信先がForm2.javaのファイルに変わっただけです。
サーブレットのコード
サーブレットのコードは、URLデコードのためにsetCharacterEncoding()メソッドを用いた1行を挿入します。
package form_entry;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Form2 extends HttpServlet{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException{
request.setCharacterEncoding("Windows-31J");
String msg=request.getParameter("message");
response.setContentType("text/plain;charset=Windows-31J");
PrintWriter out=response.getWriter();
out.println("message="+msg);
}
}
赤字の1行がURLデコードのための1行です。
requestとは、doGet()メソッドの引数であるHttpServletRequest型の仮引数です。HttpServletRequestはブラウザからのリクエスト(要求)、つまり入力パラメータを表します。そしてこの入力パラメータについて、setCharacterEncoding()メソッドで、文字エンコーディングをWindows-31Jに指定しました。
server.xmlの編集
実は、文字エンコーディングの指定のほか、Tomcat自体の設定も必要です。ただ、文字エンコーディングの指定は毎回行う必要がありますが、Tomcatの設定は一度やればその後は必要ありません。
Tomcatでは、URLデコードに使う文字エンコーディングがデフォルトで決まっているため、サーブレットが文字エンコーディングを指定しても無視されてしまう不具合が起こります。
そこでTomcatの設定を変更する必要がありますので、以下の場所のserver.xmlを編集してください。
Tomcatをインストールしたディレクトリ/conf/server.xml
Tomcatのバージョンにより記述が微妙に違いますが、以下のような記述のある場所を探して、赤字の部分のコードを追加してください。
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
useBodyEncodingForURI="true" />
server.xmlはTomcatの動作を設定するためのファイルです。
スポンサーサイト
タグ :
Comments: