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;
}
}
No.3ベストアンサー
- 回答日時:
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の設定をしていなかったことがいけなかったようです。
そのようなことは基本的なことなのかもしれませんが知らないことがたくさんあり、まだまだ勉強することがいっぱいありそうです。
いろいろ調べるきっかけになり勉強になりました。
ありがとうございました。
ありがとうございます。
osumitanさんのおっしゃるとおりにしてみたら、一発で直りました。
すぐにちゃんと出来たので感激しています。
すごいですね、私もちゃんとそういう仕組みを理解してきちんと作れるように頑張りたいです。
ほんとうにありがとうございました。
No.2
- 回答日時:
> だと思うのですが
「だと思う」で仕事をしてはいけません。
TomcatのデフォルトはUTF-8なので、なにもかもUTF-8に統一するのがいちばん楽ですよ。
この回答への補足
私は初心者で、まだ仕事としてはやっていません。
もちろん、それを目指しているわけですが・・・。
自分で考え試行錯誤して作ってみたわけですが、初心者はこちらで質問してはいけませんか?
ブラウザの表示のエンコードを見て判断したのですが、違っているのでしたらどのように調べるのか教えてください。
UTF-8にしてみましたが、やはり全体的に文字化けして更に酷くなってしまいます。
JSPのcharsetとServletのrequest.setCharacterEncoding()メソッドで統一するということですよね?
出来る限りのことはしてみたつもりですが、向いてないんでしょうか。
No.1
- 回答日時:
クライアント側(ブラウザ側)のエンコーディングに統一して下さい。
この回答への補足
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>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
Eclipseで、プロジェクト名のところに赤いバッテンのエラーマークが
Java
-
文字化け対策について
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数を動的に利用するには?
-
System.exit()の値を取得したい
-
インタフェイス実装と抽象クラ...
-
Javaでlog4jを使ってログ出力を...
-
プログラミングの問題です。大...
-
JavaでJTableの行の追加方法に...
-
Java 最大公約数 gcd
-
JSP/Servletのパラメータの受け...
-
C# DatagridviewにExcelシート...
-
TCPプログラミング
-
中カッコ{}だけの記述について
-
NoSuchMethodErrorが解決できま...
-
System.err. printlnとSystem.o...
-
JSPやサーブレットでSystem.out...
-
C#で、あるクラスのメンバーす...
-
System.out.printlnの出力先
-
オブジェクトの中のプロパティ...
-
ORA-01858: 数値を指定する箇所...
-
Path型をString型へ変換する(Java)
-
IF関数でEmpty値を設定する方法。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数を動的に利用するには?
-
中カッコ{}だけの記述について
-
プログラミングの問題です。大...
-
NoSuchMethodErrorが解決できま...
-
Javaでlog4jを使ってログ出力を...
-
System.exit()の値を取得したい
-
コンストラクタの引数の中のnew?
-
Javaで日本語の出力が文字化けする
-
インタフェイス実装と抽象クラ...
-
randomで
-
Java プログラム public class ...
-
日本語が文字コードによっては...
-
Socketの接続のタイムアウトを...
-
GetterとSetterをやったのに。
-
javaで特定の文字列から特定の...
-
JSP/Servletのパラメータの受け...
-
(1)を表示するには
-
【初心者です】javaで平均値を...
-
javaのプログラミングで作るRPG...
-
【java】同ディレクトリ別ファ...
おすすめ情報