GAE/Jで掲示板を作成しています。入力値チェックについての問題

このQ&Aのポイント
  • GAE/Jの掲示板での入力値チェックについて問題が発生しています。テキストボックスに入力した値が正常に取得できず、文字化けしてしまっています。
  • この問題は、リクエストパラメータからの値の取得時に発生しています。取得した値を変数ビューで確認すると、文字化けした状態で表示されています。
  • 掲示板の出力は問題なく行えていますが、文字数制限による入力値チェックが正常に行えないため、解決策を模索しています。
回答を見る
  • ベストアンサー

GAE/Jによる入力値チェック

GAE/Jによる入力値チェック GAE/Jで掲示板を作成しています。 入力フォームのテキストボックスで「あああ」と入力して、ServletにGETリクエストします。 その後、Servlet側で該当のリクエストパラメータをgetParameterしたところで処理を止めて(ブレークポイントで止めて)取得した値をeclipseの変数ビューで確認すると「$B$"$"$"(B」となっています。 Servletで「あああ」に戻すのはどうすればいいのでしょうか。 ※「$B$"$"$"(B」の状態でDBに保存し、その後対象データをJSPに書き出すと「あああ」と表示されています。ですから、出力は問題なく(文字化けすることなく)行えるのですが、問題は入力値チェックです。 文字数をシステム側で制限しているので、「~文字まで」というように制限しているのでgetParameterした値のlengthで文字数を判断しようとしているのですが、「$B$"$"$"(B」のように変換されたままでは正常に文字数チェックができません。 ※ちなみに「$B$"$"$"(B」をコピー(CtrlC)して、メモ帳に貼り付けすると「あああ」と表示されます→これについてはよくわかりません

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

「$B$"$"$"(B」は「あああ」をISO-2022-JPという文字コードでエンコードしたものでしょう。正確には、$Bの前と(Bの前にそれぞれESCが入った12バイトあると思います。 byte[]型の変数bにこのデータが入っている状態でnew String(b, "ISO-2022-JP");とすれば、「あああ」というStringになります。

hiyama15
質問者

お礼

ありがとうございます。 無事に解決しました。JSPのpageディレクティブのcontenttypeでISO-2022-JPと指定していたから、パラメータがISO-2022-JPとなっていたのですね。 JSPでのリクエストパラメータはUTF-8でURLエンコードされるもの、という間違った既成概念があったので気づきませんでした。 助かりました。感謝します。

関連するQ&A

  • JSPからのパラメータチェック

    いつもお世話になっております。 開発環境はeclipse SDK。OSはWInXP。 現在JSPより送られてきた値のチェックを行うプログラミングをしているのですがうまくいきません。 JSP側で"すべて"という文字列を送信してサーブレットでその文字列を受け取り、if文で判定を行おうとしています。 デバッグでみるとサーブレットにきちんと"すべて”の文字が送られてきています。 サーブレット内のif文をどうしてもとおりません。 問題のif文は以下のような感じです。 String msg = request.getParameter("msg"); if(msg == "すべて") msg = "すべてが入力されました"; request.setAttribute("msg",msg); JSPから送られている"すべて"とデバッグで調べても同じに見えます。 型がおかしいのかと思い、ためしに以下のようなことをしてみました。 String msg = request.getParameter("msg"); String chekmsg = "すべて"; if(msg == chekmsg) msg ="すべてが入力されました"; request.setAttribute("msg",msg); としても結果が同じです。 残る可能性は、デバッグモードで見ると、msgとchekmsgのhashの数字が違うところぐらいです。 お分かりなる方がいましたらよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 入力チェックとエラーメッセージの表示

    Javaについて勉強している者です。 現在、エントリー(登録)画面で入力した文字の検証処理をサーバーサイドで行い、 エラーがある場合は再度ページを表示し、その際には一緒に エラーメッセージを添える処理を作成したいと考えております。 入力チェックを行うクラスを作ってみたものの、 エラーメッセージをどのように組み込めば良いかという点に悩んでおります。 まとめてみると、期待する処理の流れは次の通りです。 1、エントリー画面に入力された文字の検証処理を行う 2、エラーがある場合にはJSPを再度表示(entry.jsp) 3、再度表示した際にエラーメッセージを添える。 下記はコードの一部です。 //INSERTChecker.java //未入力チェック public boolean requiredCheck(String input){ if(input.equals("")){ return false; } return true; } //数値チェック// public boolean numberCheck(String input){ for(int i = 0; i < input.length(); i++){ if(!Character.isDigit(input.charAt(i))){ return false; } } return true; } } //Validator.java public class Validator extends HttpServlet{ public boolean validate(HttpServletRequest req) throws ServletException,IOException{ request.setCharacterEncoding("Windows-31J"); String id = req.getParameter("id"); String pass = req.getParameter("pass"); String name = req.getParameter("name"); String tel = req.getParameter("tel"); InputChecker check = new InputChecker(); //未入力事項がないかチェック check.requiredCheck(id); check.requiredCheck(pass); check.requiredCheck(name); check.requiredCheck(tel); //数字のみが入力されているかをチェック check.numberCheck(tel); return true; //Servlet else if(select != null && select.equals("エントリー")){ String id = req.getParameter("id"); String pass = req.getParameter("pass"); String name = req.getParameter("name"); String tel = req.getParameter("tel"); Bean bean=new Bean(); bean.setId(id); bean.setPass(pass); bean.setName(name); bean.setTel(tel); Entry cEntry=new Entry();//登録クラス cEntry.entry(bean); Validator vEntry=new Validator(); vEntry.validate(req); req.setAttribute("INSERT",cEntry); target = "/top.html";//登録後、topページに戻る } request辺りがキーワードになるのかな、と考え、色々調べたのですが 解決策は見つかりませんでした。 記述方法やアドバイス等御座いましたら、ご教授お願いいたします。 長文失礼いたしました。

  • ブラウザーでの入力値をサーブレットで取得する方法

    サーブレットの開発を行っていますが、ブラウザー側で 入力したパラメーターをサーブレットで受け取りたいのですがうまくいきません。 受け取りたいのは、以下のHTMLで作成したテキストボックスへの入力値です <form name="form7" method="post" action=""> <p> <input type="text" name="textfield2" size="4" maxlength="4"> 年 <input type="text" name="textfield" size="2" maxlength="2"> 月</p> </form> ブラウザー側からは <form action="http://localhost/servlet/yuushi" method=post> の指定を行っています。 サーブレットでの受け取り方は、 String p=request.getParameter("textfield2"); String p1=request.getParameter("textfield"); としましたが、p、p1とも何の値も入りませんでした。 getParameterで取得できると思ったのですが取得できませんでした。 値の取得方法の御教示をお願いいたします。

    • ベストアンサー
    • Java
  • request.getparameterで取得した値を次のファイルでも使う方法は?

    a.jspのフォームに入力された値を b.jspで表示するためにrequest.getparameterで取得します。 その後、c.jspでもさき程のrequest.getparameterで取得した値を 使用したいと思っているのですが 何か方法はありませんか? わかる方、よろしくお願い致します。

    • ベストアンサー
    • Java
  • excelで次のようなことをチェックできますか?

    excelで次のようなことをチェックできますか? もし、合致していれば(真であれば)決められた得点を表示する というようなことです。 1.A3セルに入力した文字列が中央ぞろえされている。 2.A4に入力したデータは、’0120といように数字が文字列化されている。 3.B4セルには「セルポインタ」という文字列が入力されている。 3.A5セルに入力されている数式が=sum(b5:b11)である。値ではチェックしない。 4.A6セルに表示されている値が1234である(数式で表示)。 5.A7セルにrankで表示した値が 北海道 である。

  • JSPからServletへの値の引渡し

    JSPからServletへパラメータを渡そうとしています。 JSP同士のやり取りのようにrequest.getParameter でやろうとするとNullPointerExceptionが出てしまいます。 ひょっとして私って何も分かってないのかも…。 JSPで、 <input type=hidden name="nickname" value="pinky"> として渡すべき値を設定しました。 そして、PostでServletを呼び出します。 呼び出されたServlet側で、この"nickname"を受け取りたいのです。 必要な情報があれば仰って下さい。補足致します。 よろしくお願いします。

    • ベストアンサー
    • Java
  • エクセルで入力文字のチェック

    エクセルのセルに入力された値がUnicodeで****から****までの範囲内のみの文字で記述されているかのチェックをしたいのですが、 例:B3には電話番号を入力したいので半角数字と()のみで構成されているかをチェックする。 VBAでどのように記述すればよいのでしょうか? もう一つ、 セルB3に文字を入力し終えた時または、B3にあるカーソルを他のセルに動かした時に VBAが走る…と言う記述方法はあるのでしょうか? ボタンを用意し、入力後[CHECK]を押すとVBAが動くと言うのは出来るのですが… 以上よろしくお願いいたします。

  • JSPからサーブレットを呼び出す際に404エラー

    現在、tomcatとeclipseでサーブレット/JSPの勉強をしています。 参考書に載っている、jspの入力画面で入力した値をサーブレットで受け取り、そのまま表示させるようなサンプルを作成しています。 JSPの入力画面は表示できるのですが、値を入力してサーブレットに移動する際、404エラーが出てしまいます。 ■eclipseのパッケージエクスプローラー basic |-WEB=INF/src |..|input |...|EchoServlet.java |-WEB-INF |..|web.xml |.|echo.jsp (WEB-INF直下に作成) ■echo.jsp内のサーブレットのパスに関する記述 <FORM ACTION="/servlet/EchoServlet"> ■web.xmlの記述 <servlet> <servlet-name>EchoServlet</servlet-name> <servlet-class>input.EchoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>EchoServlet</servlet-name> <url-pattern>/servlet/EchoServlet</url-pattern> </servlet-mapping> ■EchoServlet.javaの記述 package input; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class EchoServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String msg = request.getParameter("message"); response.setContentType("text/plain; charset=Windows-31J"); PrintWriter out = response.getWriter(); out.println("message=" + msg); } } お気づきの点がございましたらご査収の程よろしくお願いいたします。

  • 入力チェック・・・

    何が違うのかわからないんです・・・ どうか教えてください。 /**== 入力値をチェック ==**/ /* 入力値が0以下の数字、或いは数字以外の文字の場合 */ while((number <= 0) || (isdigit(number) == 0)) { /* エラーメッセージを表示します */ printf("2以上の数字を入力してください。\n"); /* 数を入力させる準備メッセージを表示 */ printf("number = "); /* キーボードからの入力を受け付ける */ fgets(str, sizeof(str), stdin); /* 文字列を数値に読み替える */ number = atoi(str); } …とソースを書いたのですが、無限ループになってしまいます…。 isdigitがうまく働いていないようなのですが、どう したらよいか、わかりません…。 解決方法を教えてください!

  • eclipse 3.5 pleiades all in one にてJ

    eclipse 3.5 pleiades all in one にてJavaのコーディングを行っています。 debugモードにて起動した後ブラウザにてリクエストすると、ブレークポイントの設定箇所にて処理が止まるのですが、画面には「ソースが見つかりませんでした。」と表示されてしまいます。どのようにすれば改善できるでしょうか。 なお、すでに検索エンジンにてエラーメッセージをキーに対処方法を検索し、試せるものは全て試しました。試した内容は以下のとおりです。 試行1.ウィンドウ→設定→Tomcat→ソースパスで該当プロジェクトにチェックが入っていることを確認 試行2.全てのブレークポイントを除去後、eclipse起動時にcleanオプションを付加して起動 ※JavaのビルドパスのJREシステム・ライブラリにはjdk1.6を指定しています ※GAE/Jの開発です