2010-11-28 25 views
0

私は、JSPページのデータのエンコーディングに関するいくつかの問題を抱えています(Spring MVCを使用しています)。 それは次のようになります。jspページのエンコーディングの問題

<%@page contentType="text/html" pageEncoding="UTF-8"%> 

<% 
    response.setHeader("Cache-Control", "no-cache"); //HTTP 1.1 
    response.setHeader("Pragma", "no-cache"); //HTTP 1.0 
    response.setDateHeader("Expires", 0); 
    response.setCharacterEncoding("UTF-8"); 
    request.setCharacterEncoding("UTF-8"); 
%> 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 

..... 
<form method="post">    
     <input type="text" name="txt" value="${Name}" /> 
     <input type="submit" value= OK /> 
</form> 

........ 

私のアプリは、入力されたテキストボックスからテキストを取り、データベース(HSQLDB)に書き込みます。私が英語の文字を使ってデータを書いているとき、それはすべて正常に動作します!しかし、私は入力テキストボックスにロシアの文字を使用しようとしているときに、間違ったエンコード形式でいくつかの奇妙な文字を書いています。この問題を避けるには?

アイデア?

+1

あなたの 'Cache-Control'エントリは途中で[不完全]です(http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-ブラウザ/ 2068407#2068407)。 Firefoxなどでは動作しません。また、 'setCharacterEncoding()'の両方の呼び出しは、 'request'の呼び出しには遅すぎるため、既に' response'を暗黙のうちに実行している 'pageEncoding'をすでに設定しているので余計です。 – BalusC

+0

ああ...私はそれについて知らなかった。だから、私は行を削除することができますresponse.setCharacterEncoding( "UTF-8"); request.setCharacterEncoding( "UTF-8"); ?私はこの行をエンコーディングの問題を解決するためにここに入れようとしました。しかし、axtavtが私にSpringエンコーディングフィルタの解決策を与えない限り、すべてはうまくいかなかった。 – Ilnur

+1

リクエストに応じて設定するのは遅すぎます。すでに処理されています(JSPは応答の一部です)。リクエスト処理の前に*発生する必要があり、 'Filter'がジョブを実行するための唯一の正しい場所です。応答については、 'pageEncoding =" UTF-8 "はすでにカバーの下にあるので、重複しているだけです。ところで、応答ヘッダを設定することは、好ましくは、フィルタ内で行われるべきである。これにより、JSPでコードの重複がなくなります。 [JSPでのJavaコードの回避方法](http://stackoverflow.com/questions/3177733/how-to-avoid-java-code-in-jsp-files)も参照してください。 – BalusC

答えて

5

あなたはweb.xmlで文字エンコーディングフィルタを構成する必要があります。

<filter> 
    <filter-name>charsetEncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 

    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>charsetEncodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

ブラウザがページのエンコーディングでフォームを送信するのに対し、要求エンコーディングは、指定されていない場合はサーブレットコンテナの扱いは、(ISO-8859-1として要求データをPOSTあなたのケースではUTF-8)、エンコードを明示的に指定していないため、適切なリクエストエンコーディングを指定するフィルタが必要です。

EDIT: BalusCが正しく言及しているように、GETリクエストでのエンコーディングの問題は扱いません。 Tomcatで修正するにはをに設定し、conf/server.xmlに設定する必要があります。

+2

Springユーザーには良いアドバイスがありますが、これはGETリクエストではなくPOSTリクエストのみをカバーすることに注意してください。それはちょっとした方法です(http://kickjava.com/src/org/springframework/web/filter/CharacterEncodingFilter.java.htm)。 'request.getCharacterEncoding()'がnullを返す場合、基本的に 'request.setCharacterEncoding()'が実行されます。 – BalusC

+0

素晴らしい!ありがとう、axtavt!私はTomcat設定を構成することでそれを解決しようとしましたが、すべて私を助けません。 – Ilnur

+1

Tomcatがリクエストエンコーディングのために提供する設定は、GETリクエストであり、POSTリクエストではありません(HTTP ''エレメントのURIEncoding'属性です)。 – BalusC