- PR -

struts2 ajaxタグ 文字化け問題

1
投稿者投稿内容
よしお
会議室デビュー日: 2008/10/13
投稿数: 8
投稿日時: 2008-10-13 00:14
現在、struts2のajaxタグ(sxタグ theme="xhtml")を利用しています。
このページと同じ趣旨のコードを学習のために書きました。
http://www.planetstruts.org/struts2-showcase/ajax/remotebutton/
しかし、日本語の処理がうまくいかなくて困っています。
(Ajaxタグを利用しない場合は問題なく処理されます。)
ドキュメント等が少なく、色々調べましたが、解決できずにいます。
どなたか原因に思い当たる節がある方、アドバイスいただけないでしょうか?

【やりたいこと】
 フォームのテキストフィールドに入力した内容をsubmitし、
 処理結果を、指定した領域(div要素など)に表示する。

【環境】
 Tomcat6
 JRE JDK1.5
 struts2.1.2

【内容】
 コード内容はサンプルと同様。
 jspには、
 「contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"」を指定。

 server.xmlにはConnecterタグに、
 「useBodyEncodingForURI="true" URIEncoding="UTF-8"」を追記。

【現在の状況】
 テキストフィールドに英語などを入れてsubmitすると、
 問題なく処理結果が指定した領域に表示される。
 ただし、日本語を入力した場合は、処理結果がすべて、
 「??????????」となって表示される。

 http://www.planetstruts.org/struts2-showcase/ajax/remotebutton/
 のサンプルと同じ状況。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-10-13 00:39
文字化けしている箇所はどこからでしょう?
文字化けは基本的にパラメータが化けている場合と、
出力が化ける場合に分けられます。

パラメータで既に文字化けしている場合、アクションなどで確認できるかと思います。
たとえばTomcatに対してGETでマルチバイト文字のパラメータを送信する場合、
server.xmlのConnector要素にuseBodyEncodingForURI="true"を指定して、
HttpServletResponse#setCharacterEncodingで解決できる場合もあります。
よしお
会議室デビュー日: 2008/10/13
投稿数: 8
投稿日時: 2008-10-13 01:36
ご返信ありがとうございます。
サンプルにおいて文字化けしているのは、恐らく出力の方だと思われます。
StrutsのAction側では化けずに取得できているようです。
server.xmlのConnectorには「useBodyEncodingForURI="true"」を追加し、
HttpServletResponse#setCharacterEncodingで指定しても、解決しませんでした。
サンプルはPOSTで送信していることからも、出力の方が可能性が高いかと存じます。
struts2のdojo周りが関係しているのでしょうか…。

というのも、struts2.1のAJAX Validationを使い、
http://struts.apache.org/2.0.11.2/docs/ajax-validation.html
独自にvalidationを定義・日本語のエラーを出そうとしたのですが、
日本語が「??????????」になってしまい、
そこで長いことツボにはまってしまっています。
(1バイト文字は全く問題ないです。)
このサンプルが症状が似ている?と感じ、
解決の糸口があるのではないかと思い、投稿させていただいた次第です。

[ メッセージ編集済み 編集者: よしお 編集日時 2008-10-13 01:39 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-10-13 03:08
useBodyEncodingForURIは既に対処済みだったんですね・・・。
最初の書き込みをよく読んでいませんでした。。。

やはりどこで化けているのかを特定した方がよいかと思いますが、
通信内容を見てみるのも特定しやすくする手段の一つかも知れません。
FireBugあたりでAjax通信の内容を見てみてはいかがでしょうか。
具体的な解決方法ではなくてすみません。
よしお
会議室デビュー日: 2008/10/13
投稿数: 8
投稿日時: 2008-10-13 15:26
ご返信ありがとうございます。
お恥ずかしながら、javascriptのデバックツールは利用していませんでした。
「FireBug」便利なものがあるんですね。
struts2のAjax validationは大まか、
以下のような流れで処理が流れているようです。

 【流れ】
  [1]. submit
   ↓
  [2]. Action validation
   ↓
  [3]. Ajax用に、validationのエラーメッセージを表すresponseをJSON形式で作成
   ↓
  [4]. Ajax受信・[3]を解釈
   ↓
  [5]. 結果表示

通信内容をのぞいてみたところ、
手順[4][5]では既に文字化けしていたことから、
手順[3]の内容を見てみることにしました。
この手順は、struts2.1.2-coreの"JSONValidationInterceptor"というクラスが担当しているようです。
以下のように変更することで、文字化けを回避することが出来ました。

 【修正】
  ※場所
   response.getWriter()のresponse.setContentType部分
   
  ※内容
   response.getWriter().print(*****);
   response.setContentType("application/json");
    ↓("; charset=UTF-8"を追加し、response.getWriter().print()の前に移動)
   response.setContentType("application/json; charset=UTF-8");
   response.getWriter().print(*****);

長いこと悩んでましたが、すっきりしました。
これを機に「FireBug」を利用させていただきたいと思います。
アドバイスいただきまして、本当にありがとうございました。
1

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