アプリ版:「スタンプのみでお礼する」機能のリリースについて

JSP・Servlet・Beanがうまくいかなくて困っています。開発環境はWindowsXP JDK5とEclipse3.2とTomcat5.5を使って作っています。
じゃんけんをするゲームを作ったのですが、コンピュータの手は文字列も画像もきちんと出るのですが、自分の手が文字列は文字化けして画像も正しく表示されません。
JSPのcharsetやServletのrequest.setCharacterEncoding()メソッドなど文字化け等で考えられることはいろいろ調べてやってみたつもりなのですがどうもうまくいきません。コンソールに値を出力するようにしてデバックもやってみてはいるのですが、同様に文字化けした値が入ってしまいます。どなたかご教授下さい。以下にソースを書きます。
<!--JankenStart.jsp-->
<%@page language="java" import="java.lang.*, java.util.*"
contentType="text/html; charset=Shift_JIS"%>
<html>
<head><title>じゃんけんゲーム</title></head>
<body>
<h2>このゲームはコンピュータとじゃんけんをします!<br>
コンピュータに勝てるかな?</h2>
<form action="../JankenAction">
あなたの手:
<input type="radio" name="te1" value="グー">グー<img src="../img/hand4-1-3.gif">
<input type="radio" name="te1" value="チョキ">チョキ<img src="../img/hand4-1-1.gif">
<input type="radio" name="te1" value="パー">パー<img src="../img/hand4-1-2.gif"><p>
<center><input type="submit" value="勝負"></center>
</body>

//JankenAction.java
package servlets;
import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import beans.JankenBean;
public class JankenAction extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
 request.setCharacterEncoding("Windows-31J");
 response.setCharacterEncoding("Windows-31J");
  String te=request.getParameter("te1");
  JankenBean jankenBean=new JankenBean();
  jankenBean.setJibun(te);
  jankenBean.setComputer();
  jankenBean.setHantei();
  request.setAttribute("hoge", jankenBean);
  RequestDispatcher rDispatcher=request.getRequestDispatcher("JSP/JankenKekka.jsp");
  rDispatcher.forward(request, response);
}
}
//JankenBean.java
package beans;
public class JankenBean {
private String computer=null;private String jibun=null;
private String hantei=null;private String jgazou=null;
private String cgazou=null;
public String getComputer(){
return computer;
}
public String getCgazou(){
return cgazou;
}
public void setComputer(){
int random =(int)(Math.random()*3);
if(random==0){
System.out.println("グー");
computer="グー";
cgazou="img/hand4-1-3.gif";
}
else if(random==1){
System.out.println("チョキ");
computer="チョキ";
cgazou="img/hand4-1-1.gif";
}else{
System.out.println("パー");
computer="パー";
cgazou="img/hand4-1-2.gif";
}
System.out.println("computer"+computer);
}
public String getJibun(){
return jibun;
}
public String getJgazou(){
return jgazou;
}
public void setJibun(String te){
jibun=te;
if(jibun.equals("グー")){
jgazou="img/hand4-1-3.gif";
}
else if(jibun.equals("チョキ")){
jgazou="img/hand4-1-1.gif";
}else{
jgazou="img/hand4-1-2.gif";
}
System.out.println("jibun"+jibun);
}
public String getHantei(){
return hantei;
}
public void setHantei(){
String hantei2="";
if( (computer.equals("グー"))&&(jibun.equals("チョキ"))||(computer.equals("チョキ"))&&(jibun.equals("パー"))||(computer.equals("パー"))&&(jibun.equals("グー")) ){
System.out.println("コンピュータの勝ち");
hantei2="コンピュータの勝ち";
}
  else if( (computer.equals("グー"))&&(jibun.equals("パー"))
    ||(computer.equals("チョキ"))&&(jibun.equals("グー"))
    ||(computer.equals("パー"))&&(jibun.equals("チョキ")) ){
System.out.println("あなたの勝ち");
hantei2="あなたの勝ち";
}else{
System.out.println("あいこ");
hantei2="あいこ";
}
hantei=hantei2;
}
}

A 回答 (3件)

クライアント側(ブラウザ側)のエンコーディングに統一して下さい。

この回答への補足

charset=Shift_JIS
request.setCharacterEncoding("Shift_JIS");
response.setCharacterEncoding("Shift_JIS");
にしみても、
charset=Windows-31J
request.setCharacterEncoding("Windows-31J");
response.setCharacterEncoding("Windows-31J");
にしみても、状況としては変わりませんでした。

charset=EUC-JP
request.setCharacterEncoding("EUC-JP");
response.setCharacterEncoding("EUC-JP");
にすると自分の手のパラメータ以外もすべてまったく解読不能な文字化けになってしまいます。

たぶん、IE7(Shift_JIS)でもSleipnir(EUC-JP)だと思うのですが、いろいろ試してみたり他のPCでもやってみましたが同様でした。

全部で4つファイルがあるのですが、文字数制限で3つしか書けなかったので追記します。

<%@
page language="java" import="java.lang.*, java.util.*"
contentType="text/html; charset=Shift_JIS"
%>
<jsp:useBean id="hoge" scope="request" class="beans.JankenBean"/>

<html>
<head>
<title>じゃんけんの結果は?</title>
</head>
<body>
<h4>あなたが選んだ手は・・・</h4><jsp:getProperty name="hoge" property="jibun" />
<img src=<%=hoge.getJgazou()%>>
<p>
<h4>コンピュータが選んだ手は・・・</h4><jsp:getProperty name="hoge" property="computer" />
<img src=<%=hoge.getCgazou()%>>
<p>
<h2>勝負の結果は・・・</h2><jsp:getProperty name="hoge" property="hantei" />
<p>
<a href="JSP/JankenStart.jsp">もう一度勝負</a>
</body>

補足日時:2008/10/19 18:11
    • good
    • 0

> だと思うのですが


「だと思う」で仕事をしてはいけません。

TomcatのデフォルトはUTF-8なので、なにもかもUTF-8に統一するのがいちばん楽ですよ。

この回答への補足

私は初心者で、まだ仕事としてはやっていません。
もちろん、それを目指しているわけですが・・・。
自分で考え試行錯誤して作ってみたわけですが、初心者はこちらで質問してはいけませんか?

ブラウザの表示のエンコードを見て判断したのですが、違っているのでしたらどのように調べるのか教えてください。
UTF-8にしてみましたが、やはり全体的に文字化けして更に酷くなってしまいます。
JSPのcharsetとServletのrequest.setCharacterEncoding()メソッドで統一するということですよね?
出来る限りのことはしてみたつもりですが、向いてないんでしょうか。

補足日時:2008/10/19 20:59
    • good
    • 0

JankenStart.jspのエンコーディングがShift_JISなので、


te1の値もShift_JISで送信されてきていると思いますが、
 String te=request.getParameter("te1");
だと、そのままJavaはunicodeだと思って読み込んでしまうので、
文字コード変換しなければならないと思います。
 String te=new String(request.getParameter("te1").getBytes("ISO-8859-1"), "Shift_JIS");
としてみたらどうでしょうか。

この回答への補足

教えて頂いた通りにしたら文字化けせずに表示することはできました。
後で、このことについて本でよく調べてみました。
[TomcatのGETパラメータのデコード]という記事にこんなことが書いてありました。

--------------------------------------------------------------------------------------------------------------------------------

 Tomcat5では、GETで送られるアドレス部のURL文字列のデコードに、必ずISO8859-1が使われるため、
サーブレット中でSetCharacterEncoding()メソッドにより文字エンコーディングを指定しても、デフォルトではそれが無視されてしまいます。
 Tomcatが悪いわけではありませんが、以前のバージョンのTomcatと振る舞いが異なるため混乱の原因となっています。

このデフォルト値を変更するには、以下の場所にあるserver.xmlを編集する必要があります。

<Tomcatをインストールしたディレクトリ>/conf/server.xml

server.xmlを開いたら、次の記述を追加します。
useBodyEncodingForURIの設定(80行目付近)
<conector port="8080" ・・・・・・・UseBodyEncodingForURI="true"/>

server.xmlはTomcatの動作を設定するためのファイルです。
UseBodyEncodingForURI="true"を指定することで、
URLデコード時にsetCharacterEncoding()メソッドで指定した文字エンコーディングが使われます。
この設定を行った後、Tomcatを再起動して、再び実行すれば文字化けせずに表示されます。

補足::
・POSTリクエストの場合はこの設定を行わなくても文字化けしません。
これはPOSTではGETと違ってパラメータをURLの一部として送信しないからです。
・サーブレットAPIの将来のリリースではsetCharacterEncoding()メソッドのエンコーディングがアドレス部分に適用されると
明記されるようになる予定なので、この設定を行うのが今のところベターな対処だと考えられます。

[COLUM]
getBytes()のnew String()
setCharacterEncoding()メソッドはサーブレットAPI2.3で導入されました。
それより前には以下のように自前でエンコーディングを行う必要がありました。

String message = request.getParameter("message");
message =new String(message.getBytes("ISO8859-1"),"Shift_JIS");

古い資料を見るとこのようなサンプルソースもあるかもしれませんが、現在はあまり利用されません。

--------------------------------------------------------------------------------------------------------------------------------

以上のような記述が本に書いてありましたが、POSTではなくGETパラメータであるということと、
server.xmlの設定をしていなかったことがいけなかったようです。

 そのようなことは基本的なことなのかもしれませんが知らないことがたくさんあり、まだまだ勉強することがいっぱいありそうです。
いろいろ調べるきっかけになり勉強になりました。
ありがとうございました。

補足日時:2008/10/23 04:01
    • good
    • 2
この回答へのお礼

ありがとうございます。
osumitanさんのおっしゃるとおりにしてみたら、一発で直りました。
すぐにちゃんと出来たので感激しています。
すごいですね、私もちゃんとそういう仕組みを理解してきちんと作れるように頑張りたいです。
ほんとうにありがとうございました。

お礼日時:2008/10/20 03:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!