- PR -

jsp:forward & jsp:param のエンコードは?

1
投稿者投稿内容
bubunya
大ベテラン
会議室デビュー日: 2003/01/16
投稿数: 124
投稿日時: 2003-08-18 17:23
J2EE の勉強中なのですが jsp:forward 時に利用されるデフォルト エンコーディングがわからなくて悩んでいます。

通常、html フォームの POST/GET や、jsp の setAttribute() などで日本語の値を servlet に渡す場合に、contentType や setCharacterEncoding でエンコードを指定することで、String((文字列).getBytes("8859_1"), エンコード) をやらなくても日本語が正しく渡されますよね。(ここでは web.xml の filter の話は置いておきます)

で、実際に色々なパターンを試しているのですが (全て UTF-8)、唯一 <jsp:forward> + <jsp:param> で日本語のパラメータ値を渡した場合だけ、setCharacterEncoding が効かない気がします。

たとえば <%@ page contentType="text/html; charset=UTF-8" %> と <% request.setCharacterEncoding("UTF-8"); %> が宣言されている jsp から servlet のアクセサメソッドと日本語のやりとりをしても問題ありません。
同様に HTML のフォームから POST/GET で上記のような JSP に日本語をやりとりをしても問題ありません。
しかし、同様の JSP から <jsp:forward> + <jsp:param name="hoge" value="ほげ"> で jsp or servlet に値を渡すと文字化けしてしまいます。結果として、String((文字列).getBytes("8859_1"), エンコード) をやる必要が出てしまいます。

これは仕様なのでしょうか、それとも環境依存の問題でしょうか?

環境は
WinXP Pro + SP1 (.NET 2003 も入ってます)
JDK 1.4.1_02
Tomcat 4.1.24
です。
ブラウザは IE6SP1 と Netscape 7 の両方で試しましたが結果は同じでした。

Any comment would be appreciated!

bubunya
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2003-08-19 07:19
ちなみにforward先のjspにも<%@ page contentType="text/html; charset=UTF-8" %>って書いてある?
bubunya
大ベテラン
会議室デビュー日: 2003/01/16
投稿数: 124
投稿日時: 2003-08-19 09:57
呼ばれる側の JSP には同じ contentType の宣言が入ってます。Servlet であれば、setCharacterEncoding も入ってます。
実際、これらの組み合わせは色々と試したのですが、どうも JSP:param だけこれらを無視している気がして仕方がありません。

そういえば、JSP のコンパイルされたソースをチェックしてなかったです。あとで確認してみます。

あと、Apache のバージョンは 4.1.18 でした。24 は他の環境で使ってるので混乱してました。
seraen
会議室デビュー日: 2003/08/19
投稿数: 1
投稿日時: 2003-08-19 11:33
はじめまして

Tomcatを使っているなら、server.xmlのContextの設定で
以下のような記述も出来ますが、お試しになられたでしょうか?

<Context path="/hoge" docBase="hoge">
  <DecodeInterceptor defaultEncoding="EUC-JP" useSessionEncoding="false"/>
</Context>

これは、Tomcat4.x以上であれば、使えると思えますが。。。
bubunya
大ベテラン
会議室デビュー日: 2003/01/16
投稿数: 124
投稿日時: 2003-08-19 16:05
どうやら、MS932 に強制的に変換しているような気がします。
私の環境ではエディタも UTF-8 にしてあるのですが、<jsp:forward page="hoge.jsp"><jsp:param name="p1" value="あいう"/> のような場合、"あいう" の部分だけ MS932 でのエンコードに変換され、常に下記のようなソースが作成されます。これは seraen さんご指摘の server.xml の修正 (EUC-JP から UTF-8 に変更しました) を入れても同じです。

if (true) {
pageContext.forward("hoge.jsp" + "?" + "p1=" + "%82%A0%82%A2%82%A4");
return;
}

もちろん、setCharacterEncoding, contentType などで UTF-8 を指定しています。また、その前にダミーで String の変数を準備して "あいう" を設定しても、MS932 エンコードはされていません。

時間があれば仕様を確認してみます。
bubunya
大ベテラン
会議室デビュー日: 2003/01/16
投稿数: 124
投稿日時: 2003-08-19 16:45
1.1 と 2.0 の仕様はダウンロードできたんですが、何故だか 1.2 のだけ、sun.com/Download5 がタイムアウトになってダウンロードできませんでした。
で、1.1 では明示されていません。2.0 では以下のようになっています。

The parameter names and values specified should be left unencoded by the
page author. The JSP container must encode the parameter names and values
using the character encoding from the request object when necessary. For
example, if the container chooses to append the parameters to the URL in the
dispatched request, both the names and values must be encoded as per the content type application/x-www-form-urlencoded in the HTML specification.

JSP コンテナが request オブジェクトを元にエンコードするとなっていますから、普通に考えると、request.setCharacterEncoding() のような気がします。だとすれば、MS932 へのエンコードは間違ってますが、1.2 の仕様がはっきりしないので何とも言えません。
あとで、再度ダウンロードにトライします。

bubunya
bubunya
大ベテラン
会議室デビュー日: 2003/01/16
投稿数: 124
投稿日時: 2003-08-20 16:12
1.2 の仕様も確認しましたが、やっぱり明示されていません。
とりあえず、環境依存の動作として納得しておきます。

どなたか違う環境で試してみませんか?

他力本願モード
bubunya
1

スキルアップ/キャリアアップ(JOB@IT)