- PR -

JSFのJSPページについて。

1
投稿者投稿内容
かしん
常連さん
会議室デビュー日: 2004/08/27
投稿数: 25
お住まい・勤務地: 窓際
投稿日時: 2006-08-07 22:32
お知恵をお貸しください。

OS: windows xp
Tomcat5.5 + JSF 1.1環境において、JSF用のJSPページのページエンコーディングがUTF-8で出力されることを確認しています。
同JSPファイルを、Tomcat4.1 + JSF1.1環境で動作させると、ページエンコーディングがShift_JISになってしまいます。
Tomcat4.1 + JSF1.1環境でも、単純なJSPページがUTF-8で出力されることから、JSTLが怪しい?などと考えていますが、どうにもわかりません。
以下に、JSPファイルのコードを示します。

JSFのJSPファイル
コード:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<f:view>
    :
    :
    :



単純なJSP
コード:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
ほげほげ
</body>
</html>



原因・解決方法をご教授いただきたく。
かしん
常連さん
会議室デビュー日: 2004/08/27
投稿数: 25
お住まい・勤務地: 窓際
投稿日時: 2006-08-10 14:45
お世話になっております。
自己レスです。

コード:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<% System.out.println(response.getCharacterEncoding());%><%-- @ --%>
<f:view>
<% System.out.println(response.getCharacterEncoding());%><%-- A --%>
<%response.setContentType("text/html; charset=UTF-8"); %><%-- B --%>
    :
    :



上記の、@、Aの行を入れてみたところ、4.1環境で、結果は以下のようになりました。
UTF-8
Shift_JIS

5.5環境では、
UTF-8
UTF-8

でした。

f:viewタグを前後に、レスポンスのエンコーディングが変わってしまっていました。

jspのjavaファイルも見てみました。(4.1環境)

コード:
System.out.println(response.getCharacterEncoding()); // @
      out.write("\r\n");
      /* ----  f:view ---- */
      com.sun.faces.taglib.jsf_core.ViewTag _jspx_th_f_view_0 = (com.sun.faces.taglib.jsf_core.ViewTag) _jspx_tagPool_f_view.get(com.sun.faces.taglib.jsf_core.ViewTag.class);
      _jspx_th_f_view_0.setPageContext(pageContext);
      _jspx_th_f_view_0.setParent(null);
      int _jspx_eval_f_view_0 = _jspx_th_f_view_0.doStartTag();
      if (_jspx_eval_f_view_0 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
        if (_jspx_eval_f_view_0 != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) {
          javax.servlet.jsp.tagext.BodyContent _bc = pageContext.pushBody();
          out = _bc;
          _jspx_th_f_view_0.setBodyContent(_bc);
          _jspx_th_f_view_0.doInitBody();
        }
        do {
          out.write("\n");
System.out.println(response.getCharacterEncoding()); // A
          out.write("\n");
response.setContentType("text/html; charset=UTF-8"); // B



どうやら、pageContext.pushBody();が実施されて、新しくBodyContentが作成された時に、文字コードが引き継がれないようにみえます。

とりあえず、Bの行を追加したところ、UTF-8で出力されるようになりました。

もうちょっと調べてみます。
以上、ご報告でした。

#エンマークがダブっていますが、読み替えてください。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-08-11 15:11
引用:
f:viewタグを前後に、レスポンスのエンコーディングが変わってしまっていました。


ちょっと調べてみました。
ViewTag.doStartTag()に以下のような処理がありました。
pageContext.getResponse().setLocale(facesContext.getViewRoot().getLocale());

UIViewRootのjavadocによるとgetLocaleは
If we have a locale ivar, return it. If we have a value binding for "locale", get its value. If the value is null, return the result of calling ViewHandler.calculateLocale(javax.faces.context.FacesContext).

だそうなので、さらにViewHandler.calculateLocaleは
Returns an appropriate Locale to use for this and subsequent requests for the current client.

ということで、これ以上はよく分かりませんが、二つの環境でデフォルトのlocaleが違っているというようなことはありませんか?

以上、ご参考まで。
かしん
常連さん
会議室デビュー日: 2004/08/27
投稿数: 25
お住まい・勤務地: 窓際
投稿日時: 2006-08-11 20:37
よしだひろゆきさん
コメントありがとうございます。

同じマシンでそれぞれ動かしていまして、facesContext.getViewRoot().getLocale()はどちらも「ja_JP」でした。

ServletResponse#setLocale()メソッドについて、javadocを見たところ、以下の記述を見つけました。

引用:
レスポンスのロケールをセットしますが、このとき(Content-Type で指定する文字エンコーディングを含む)ヘッダも適当な値にセットします。 このメソッドは getWriter() メソッドよりも前に呼び出しておくべきです。 デフォルトではレスポンスのロケールはサーバの デフォルトロケールです。



ということで、下記のコードをf:viewタグの前に追加してみました。

コード:

:
:
<% System.out.println(pageContext.getResponse().getCharacterEncoding());%>
<% pageContext.getResponse().setLocale(java.util.Locale.getDefault()); %>
<% System.out.println(pageContext.getResponse().getCharacterEncoding());%>
<f:view>
:
:



Tomcat4.1系の実行結果としては、

UTF-8
Shift_JIS

でした。

引用:
ググったところ、org.apache.coyote.Response.javaにバグがあるようで、これが関連しているようです。
とりあえず原因がわかったので、安心しました。


#上記が誤った情報であるため、修正します。
#4.1系と5.5系でorg.apache.catalina.connectorパッケージの実装が変わっており、
#5.5系では、org.apache.coyote.Responseを使用して、正しく動作しています。
#4.1系では、org.apache.catalina.connector.ResponseBaseの実装として、
#setLocaleメソッド内で、org.apache.catalina.util.CharSetMapperクラスが保持するプロパティファイルから、ja=Shift_JISでcharsetを取得しており、それが今回の原因となっていました。

ご協力ありがとうございました。

[ メッセージ編集済み 編集者: かしん 編集日時 2006-08-17 14:58 ]
1

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