fc2ブログ

日本語データの送信





前回、フォームデータの送信・受信について勉強しましたが、例によって(?)日本語データを利用するには別の設定が必要になります。

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の動作を設定するためのファイルです。
スポンサーサイト



タグ :

Return to page top

Comments:

Comment Form
Only inform the site author.

Trackback+Pingback:

TrackBack URL for this entry
http://servletmania.blog137.fc2.com/tb.php/12-028ca720
月別アーカイブ
カテゴリ
リンク
RSSリンクの表示
QRコード
QR