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.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>
No.2
- 回答日時:
> だと思うのですが
「だと思う」で仕事をしてはいけません。
TomcatのデフォルトはUTF-8なので、なにもかもUTF-8に統一するのがいちばん楽ですよ。
この回答への補足
私は初心者で、まだ仕事としてはやっていません。
もちろん、それを目指しているわけですが・・・。
自分で考え試行錯誤して作ってみたわけですが、初心者はこちらで質問してはいけませんか?
ブラウザの表示のエンコードを見て判断したのですが、違っているのでしたらどのように調べるのか教えてください。
UTF-8にしてみましたが、やはり全体的に文字化けして更に酷くなってしまいます。
JSPのcharsetとServletのrequest.setCharacterEncoding()メソッドで統一するということですよね?
出来る限りのことはしてみたつもりですが、向いてないんでしょうか。
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さんのおっしゃるとおりにしてみたら、一発で直りました。
すぐにちゃんと出来たので感激しています。
すごいですね、私もちゃんとそういう仕組みを理解してきちんと作れるように頑張りたいです。
ほんとうにありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby vscode 文字化け 1 2022/05/21 19:17
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript 画像の表示位置 3 2022/12/23 08:25
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラスを使った電卓のプログラム
-
javaのプログラミングで作るRPG...
-
JSP/Servletのパラメータの受け...
-
プログラミングの問題です。大...
-
Javaがうまく動作しない理由
-
TCPプログラミング
-
ArrayList でスタックを
-
Java プログラム public class ...
-
変数を動的に利用するには?
-
VBAで配列の計算
-
配列にnullを代入すると、null...
-
ループ処理の際、最後だけ","を...
-
配列をセッションに割り当てた後で
-
1~100までの数字を表示し、か...
-
Log4jで機能毎に別ファイルへ出...
-
Junitテストでvoid戻り値メッソ...
-
シャットダウンフックが呼ばれない
-
EXCEL VBA で、0から?1から?
-
テキストボックスに入力された...
-
べき乗
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングの問題です。大...
-
変数を動的に利用するには?
-
中カッコ{}だけの記述について
-
System.exit()の値を取得したい
-
Javaでlog4jを使ってログ出力を...
-
NoSuchMethodErrorが解決できま...
-
javaで特定の文字列から特定の...
-
Socketの接続のタイムアウトを...
-
Java プログラム public class ...
-
javaのプログラミングで作るRPG...
-
インタフェイス実装と抽象クラ...
-
コマンドライン引数の*(アフ...
-
【初心者です】javaで平均値を...
-
Javaで日本語の出力が文字化けする
-
(大至急)JavaでATMもどきを作成
-
コンストラクタの引数の中のnew?
-
Java 最大公約数 gcd
-
C# DatagridviewにExcelシート...
-
randomで
-
GetterとSetterをやったのに。
おすすめ情報