• ベストアンサー

再:助けてください

消されてしまったので、もう一回w。 数字当てゲームを作ってコンパイルは出来たのですが、思い通りに動作しません。思い通りというのは数字を入力した後、判定する画面に飛ばしたいのですが、入力した数字が消えてしまいます。下にソースをさらします。で、800文字の字数制限がありますので、ソースの続きはどなたかが書き込んだ後、そこに補足と言う形で追加します。どなたかご教授願います。 <%@ page contentType="text/html;charset=Shift_JIS" %> <% int num;//正解の数字 boolean isRight;//解答が正解かどうか Integer numInt=(Integer)session.getAttribute("num");// Boolean isRightBoo=(Boolean)session.getAttribute("isRight");// if(numInt==null || isRightBoo==null){ //sessionオブジェクトに正解の情報がない isRight=true; }else{ //sessionオブジェクトより取得した値を使う isRight=isRightBoo.booleanValue(); } if(isRight){ //既に正解済、新たな正解の数字を乱数で決める num=(int)(Math.random()*13+1); isRight=false; session.setAttribute("num",new Integer(num)); session.setAttribute("isRight",new Boolean(isRight)); }else{ //sessionオブジェクトより取得した正解を使う num=numInt.intValue(); } %>

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

  • ベストアンサー
回答No.5

Lhacaさん、こんにちは。 最初に提示されたソースを元にしますと、 String s=request.getParameter("Intnum"); で、Intnumという名前で受け取るはずが、 <input type="text"name="answer"> ここで、answerと設定されているため、 Intnumには何も設定されず、数字が表示されません。 out.printlnしてみるとnullが表示されます。 ですから、Intnumをanswerに変えてあげれば、入力した 数値が受け取れます。 numに乱数で設定することを言い忘れていましたが、今回のソースでは直ってますね。 私の環境で試した限りでは正常に動きました。

Lhaca
質問者

お礼

ありがとーございました!! 私の環境でも動きました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.4

なんとなーく追ってみました。 ボタン押したら、入力された数字をリクエストかセッションに格納しないとダメじゃない?

Lhaca
質問者

お礼

そうですよね。次に進むには格納しなきゃいけないんですが、それが分からないんですよ。sessionを良く見直します。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

はい。表示されました。 載せられたjspのファイル名が GuessNumber.jsp とは知らなかったので、GuessNumber.jspという単なる文字列を表示する簡単なjspをを作って、 問題のjspはoshiete.jspとして自PCで試しましたが、クエリ送信ボタンを押下すると、簡単なjspのGuessNumber.jspが表示されました。 ちなみに、ページコンパイルされたhtmlは <html> <head> <title>Sample No11 Application</title> </head> <body> <h1>数字当てゲーム</h1> <br> <hr> 1~13の数字を当ててください<br> <form action="GuessNumber.jsp;jsessionid=FFC3758B6125AEF8F4D7023413CAE244"> <input type="text"name="answer"> <input type="submit"> </form> </body> </html> ですね。 GuessNumber.jspが自分自身なので、数字が消えてしまうのでは? 数字を消したくなければ、クエリ送信ボタン押下処理で、 入力された数字をリクエストに埋め込んで、 テキストフィールドにリクエストに埋め込まれた数字があれば表示、なければ表示しない。 という処理を入れないとダメなのでは?

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

前回質問されたソースで試しましたが、 GuessNumber.jsp というjsp(中身は単純な文字列のみ表示)を作成して、 数字を入力→クエリ送信ボタン押下 でちゃんと表示されましたけど? もしかして、ここに載せてるjspのファイル名が GuessNumber.jsp という名前だったりとかするのですかね??? だとしたらこの回答は間違いかも。

Lhaca
質問者

補足

え!? 表示されました?それは最初とは違う画面に移るということですよね?私の方では「クエリ送信」を押しても無反応なんですが。。。。 ここに載せたファイル名はGuessNumber.jspです。

全文を見る
すると、全ての回答が全文表示されます。
noname#161341
noname#161341
回答No.1

ソースが途中じゃないですか? ソースは全部書き込まないと分からないですよ。

Lhaca
質問者

補足

質問の続き <html><head><title>Sample No11 Application</title> </head><body><h1>数字当てゲーム</h1><br><% int ans; //requestオブジェクトからパラメータを(解答)を受け取る String s=request.getParameter("Intnum"); if(s!=null){ try{ ans=Integer.parseInt(s); if(num==ans){ //解答と正解が一致 isRight=true; HttpSession hs = request.getSession(true); out.println("<p>正解!</p>"); }else if(num>ans&&ans>=1){ //解答が正解より小さい out.println("<p>もっと上の数字です</p>"); }else if(num<ans&&ans<=13){ //解答が正解より大きい out.println("<p>もっと下の数字です</p>"); }else{ //解答が1~13の数字以外 out.println("<p>数字は1~13の範囲です</p>"); } }catch(NumberFormatException e){ //数字以外をフォームから受け取ったときの例外処理 out.println("<p>数字は整数で入力してください</p>"); } } %> <hr> <% String NextPage="GuessNumber.jsp"; NextPage=response.encodeURL(NextPage); if(!isRight){ //解答と正解が不一致 %> 1~13の数字を当ててください<br> <form action="<%=NextPage%>"> <input type="text"name="answer"> <input type="submit"> </form> <% }else{ //解答と正解が一致 %> <a href="<%=NextPage%>">もう一度する</a> <% } %> </body> </html> >momoti89さん すみません。字数があるそうなので、こういう形で追加させていただきます。 以上がソースです。みなさまご教授願います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • セッションオブジェクトにリンクするプログラムです。

    どこが間違ってますか? コンパイルできないんです。。。 セッションオブジェクトを使って カウンタを作り、リンクからカウンタの値を 変更できるようにしているつもりです。 SessionCount.java <前略> HttpSession session = req.getSession(); Integer count; count = (Integer)session.getAttribute("count"); if (count == null){ count = new Integer(1); }else{ count = new Integer(count.intValue() + 1); } session.setAttribute("count", count); out.println("<html>"); out.println("<head><title>Session Test</title></head>"); out.println("<body>"); out.println("Count = " + count.intValue());//確認用 out.println("<A HREF = "URL/SessionCount" onClick = "count=count+1">続行</A>"); out.println("<A HREF = "URL/SessionCount" onClick ="count=0">リセット</A>"); <後略>

    • ベストアンサー
    • Java
  • コンパイルエラー

    JBuiderでコンパイルしようとするとエラーがでてしまいます。ソースは以下の通りです。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class TestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); Integer count=(Integer)session.getAttribute("count"); if(count == null){  count = new Integer(0); }else{  count = new Integer(count.intValue()+1); } session.setAttribute("count",count); response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out= response.getWriter(); out.println("<html>"); out.println("<head><title>TestServlet</title></head>"); out.println("<body>"); out.println(session.getId()); out.println("<p>\"count\"という名前のattribute = " + count +"</p>"); out.println("</body></html>"); out.close(); } } これをコンパイルすると、 "TestServlet.java": エラー #: 300 : メソッド getAttribute(java.lang.String) が見つかりません: インターフェース javax.servlet.http.HttpSession 行 9, 列 36 "TestServlet.java": エラー #: 300 : メソッド setAttribute(java.lang.String, java.lang.Integer) が見つかりません: インターフェース javax.servlet.http.HttpSession 行 15, 列 13 というメッセージがでます。何が原因なのか教えてください。

  • テキストフィールドに何も入れない場合の動作について

    現在サーブレットについて勉強しているものです。 身近に聞ける人がおらず、お手数ですがご教授願います。 分からないところは、JSPでテキストフィールドがあるページを作成し、そこに何も入れないまま送信した場合の動作についてです。 以下に載せているサンプルAの通りに作成し、何も入れないで送信したところ、if( (numberStr == null) || (numberStr.length() == 0) )の条件文の中の処理が走るようで、”何かいれて”というメッセージが表示されるのを確認しております。 しかし、私が作成したファイルを使い、テキストフィールドに何も入れないまま送信した場合はエクセプション画面(例外レポート)に飛んでしまいます。 同じ条件を使い、同じように表示させているつもりなのですが、私が作成したソースが上手くいかず、参考書のソースが上手く動作している理由がどうしてもわかりません。 恐らくソースを見た方が早い、という方が多いと思いますので、見栄えは悪いのですが、ソースを張らせていただきます。 また、入力文字数の制限より、import等は全て削除しました。 また、何も入力しない場合に用いられている、try、catchの必要性についても、いまいち分かりません。 ifとelseで全て網羅するようにせず、なぜtry,catchを使うのでしょうか? ご存じの方、いらっしゃいましたら、是非教えて下さい。 サンプルA-start--------------------------------------------------------------------- public class GuessServlet extends HttpServlet { /* 当たりの数字をランダムに決定 */ private int hit = new Random().nextInt(10); public void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* jspファイルで入力した数字をひっぱってくる */ String numberStr = request.getParameter("number"); int input = Integer.parseInt(numberStr); response.setContentType("text/plain; charset=Windows-31J"); PrintWriter out = response.getWriter(); if( (numberStr == null) || (numberStr.length() == 0) ) { request.setAttribute("msg","何か入れて"); RequestDispatcher dispatcher = request.getRequestDispatcher("/reqattr/guess.jsp"); dispatcher.forward( request, response); } else if(hit == input) { request.setAttribute("msg","当たり。数字=" + input); RequestDispatcher dispatcher = request.getRequestDispatcher("/reqattr/guess_hit.jsp"); dispatcher.forward( request, response); } else{ request.setAttribute("msg","はずれ。数字=" + input); RequestDispatcher dispatcher = request.getRequestDispatcher("/reqattr/guess.jsp"); dispatcher.forward( request, response); } } } サンプルA-end--------------------------------------------------------------------- 私のソース-start--------------------------------------------------------------------- public class GuessServlet extends HttpServlet { /* 当たりの数字をランダムに決定 */ private int hit = new Random().nextInt(10); public void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* jspファイルで入力した数字をひっぱってくる */ String numberStr = request.getParameter("number"); String error = null; int number = -1; if( (numberStr == null) || (numberStr.length() == 0) ) { error = "何か入れて"; } if(error == null) { try{ number = Integer.parseInt(numberStr); if(number < 0 || 9 < number) { error = "0~9を入れて"; } } catch(NumberFormatException e) { error ="数字を入れてください"; } } String path; if(error != null) { request.setAttribute("msg", error); path = "/reqattr/guess.jsp"; } else { if(hit == number) { request.setAttribute("msg","当たり。数字=" + number); path = "/reqattr/guess_hit.jsp"; } else { request.setAttribute("msg","はずれ。数字=" + number); path = "/reqattr/guess.jsp"; } } RequestDispatcher dispatcher = request.getRequestDispatcher(path); dispatcher.forward( request, response); } } 私のソース-end---------------------------------------------------------------------

    • ベストアンサー
    • Java
  • 数字を当てさせるゲームについて

    #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void) { int limit=0; int no; /*当てさせる値*/ int num; /*入力する値*/ int max=9; srand(time(NULL)); no=rand()%1000; do{ printf("あと%d回入力できます。数字を入力してください。\n",max-limit); scanf("%d",&num); limit++; if(num>no) { printf("大きいです。\n"); } else if(num<no) { printf("小さいです。\n"); } }while(num!=no || limit<max) if(num==no) { printf("正解です。"); printf("%d回で当たりました。",limit); } else { printf("残念ながら不正解です。") } return 0; } これは、0以上999以下の整数を入力させて9回以内にランダムで 入力した値を当てさせるゲームです。 質問内容としては 当てさせる数字を「0以上999以下の数字」→「0以上999以下の3の倍数」に変更するにはどうすればよいかです。 よろしくお願いいたします。

  • application暗黙オブジェクトでのint型情報共有について

    application.setAttributeとapplication.getAttributeを使ってint型変数の値を共有したいと思っています。 String型だとうまくいくのですがint型だとうまくいかないのです。 下記の上のソースはString型でのソースです。これの String storedData = "JSPサンプル"; の部分をint型に変えたいと考えています。 下のソースはint型に変えたのですが, Object型からint型にキャスト変換できないようなエラーが出て動きませんでした。 int型の変数を方法をapplication.setAttributeで使う方法はどうすればいいのでしょう? ご存知のかたいらっしゃいましたら教えてください。よろしくお願いします。 ----------------------------------------------- <%@ page contentType="text/html;charset=Shift_JIS" %> <html> <head><title>Sample</title></head> <body> <% //applicationオブジェクトに保存 String storedData = "JSPサンプル"; application.setAttribute("appdata",storedData); //applicationオブジェクトから読み出し Object readData = application.getAttribute("appdata"); String readDataString=(String)readData; %> applicationオブジェクト保存データ:<b><%= readDataString %></b> </body> </html> ----------------------------------------------- <%@ page contentType="text/html;charset=Shift_JIS" %> <html> <head><title>Sample0</title></head> <body> <% int storedData = 10; application.setAttribute("appdata",storedData); //applicationオブジェクトから読み出し Object readData = application.getAttribute("appdata"); int readDataString=(int)readData; %> applicationオブジェクト保存データ:<b><%= read %></b> </body> </html>

    • ベストアンサー
    • Java
  • リフレクション

    Webアプリ上でリフレクションにてとあるクラスのメソッドを実行するサンプルを作成して 見たのですがうまく動きませんでした。最後のmethod.invoke()の処理にてExceptionが発生し、 java.lang.IllegalArgumentException: object is not an instance of declaring class と表示されてしまいます。 作成したサンプルは下記なのですがどこが原因かお分かりになりますでしょうか。 try { Class cls = Class.forName("dao.TestDao"); // 引数の型をセット Constructor constructor = cls.getDeclaredConstructor(HttpSession.class); constructor.setAccessible(true); // 引数を渡してオブジェクトを生成 Object obj = constructor.newInstance(session); Method method = cls.getDeclaredMethod("getDataDao", int.class); method.setAccessible(true); Object result = method.invoke(cls, new Integer(100)); } catch (Exception e) { e.printStackTrace(); } // このクラスのgetDataDao()をリフレクションにて実行 public class TestDao { HttpSession session = null; public TestDao(HttpSession session) { this.session = session; } public List<String> getDataDao(int iNo) { List<String> list = new ArrayList<String>(); list.add((String)session.getAttribute("1")); list.add((String)session.getAttribute("2")); list.add((String)session.getAttribute("3")); list.add((String)session.getAttribute("4")); list.add((String)session.getAttribute("5")); return list; } }

    • ベストアンサー
    • Java
  • for文を使った累乗の計算方法について

    質問させてください。 for文を使った累乗の計算プログラムを作っています。 数値はコマンドライン引数から取得し、0番目の数字を i番目の数字分累乗するというものです。 ソースを途中まで作成したのですが、0乗した場合のプログラムが よく分かりません。どなたか教えていただけないでしょうか? public class Mondai { public static void main(String[] args) { //変数の初期化 int k = 0; if ( 2 <= args.length && args.length < 3) { //コマンドライン引数の数だけ配列を用意する int[] num = new int[args.length]; //0,1番目のコマンドライン引数を整数に変換してnumに代入する num[0] = Integer.parseInt(args[0]); k = num[0]; k *= k; num[1] = Integer.parseInt(args[1]); //num[1]の掛け算をnum[1]回繰り返す for (int i = 0; i < num[1] -2; i++) { k *= num[0]; } System.out.println("\"" + num[0] +"の" + num[1] + "乗は"+ k + "\""); if(num[1] == 0) { System.out.println("\"" + num[0] +"の" + num[1] + "乗は1\""); } //args.length <= 1の条件の時 } else if(args.length <= 1) { System.out.println("引数が足りないため累乗の計算ができません。"); //指定された条件以外の時 } else { System.out.println("引数が多すぎるため累乗の計算ができません。"); } } }

    • ベストアンサー
    • Java
  • C言語 二分木探索

    今、int型の二分木にデータを追加する関数(引数は二分木へのポインタと追加する値、追加されたノードへのポインタを返す)をつくろうとしてます。 以前リストにデータを追加する関数をつくったのでそれを変更してつくろうとしているのですが途中までいってつまってしまいました。 つくりかたを教えてください。 よろしくお願いします! struct BinaryTreeNode{ int data; struct BinaryTreeNode *l_next; struct BinaryTreeNode *r_next; }; struct BinaryTree{ int node_num; struct BinaryTreeNode *root; }; BinaryTreeNode *BinaryTreeNodeAlloc(void) { BinaryTreeNode *node; node = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode)); if (node == NULL) { return (NULL); } node->l_next = NULL; node->r_next = NULL; return (node); } BinaryTreeNode *BinaryTreeDataAdd(BinaryTree *list, int x) { BinaryTreeNode *ptr; BinaryTreeNode *prev; BinaryTreeNode *new_node; ptr = list->root; prev = NULL; while (ptr) {       ←?? if (ptr->data < x) { prev = ptr; ptr = ptr->next; } else if (ptr->data == x) { return (NULL); } else { new_node = BinaryTreeNodeAlloc(); if (new_node == NULL) { exit (0);                ←?? } new_node->data = x; new_node->next = ptr; if (prev != NULL) { prev->next = new_node; } else { list->head = new_node; } list->node_num++; return (new_node); } } new_node = BinaryTreeNodeAlloc(); if (new_node == NULL) { exit (0); } new_node->data = x; new_node->r_next = NULL; new_node->l_next = NULL; if (prev != NULL) { prev->next = new_node; } else { list->head = new_node; } list->node_num++; return (new_node); }

  • struts2でのフィルターを使ったセッション管理

    はじめまして。 struts2,spring frameworkでソフトを作ってますが、セッション管理について質問があります。 1.ログイン画面で、ログイン後にセッションidを登録する。 session.setAttribute (USER_HANDLE, user); 2.他の画面に移動する時に、セッションid(user)が格納されているか確認する。格納されていない場合は、ログイン画面に戻る。 という処理をする場合、actionごとに HttpSession session = request.getSession (true); Object user = session.getAttribute (USER_HANDLE); if (user != null) { //処理1 return true; } else { //処理2 return false; } と記述すると手間がかかるので、下記の様なFilterでまとめて管理できないかと考えているのですが、こういう考え方は一般的なのでしょうか? public class TestAccessFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST); HttpSession session = request.getSession (true); Object user = session.getAttribute (USER_HANDLE); if (user == null) { //処理1 return "login-success"; } else { //処理2 return "login"; } } actionごとにセッションidが格納されているか確認する代わりに、Filterでまとめて確認できないかということなのですが.... struts2でこういう書き方をして良いのかわからず困っています。 アドバイスをお願いいたします。

    • ベストアンサー
    • Java
  • java while文です。教えてください(__)

    public class mondai2{ //プログラム開始 public static void main(String args[]){ BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int i; int ans=0; int seikai=0; for(i=0;i<5;i++){ try{ { Random ran = new Random(); int num1 = ran.nextInt(8)+1; int num2 = ran.nextInt(8)+1; ans = num1*num2; System.out.print("問題"+(i+1)+":"); System.out.print(num1 + "×" +num2 + "="); String s =in.readLine(); seikai = Integer.parseInt(s); if(seikai==ans){ System.out.println("正解"); }else{ System.out.println("不正解"); } } }catch(IOException e){ System.out.println("エラー"); } } } } このプログラムをwhile文か、do while文にして正解が出るまで問題が出続けるようにしたいんですけど、まったくわからなくて困っています>< 教えてください(+o+)

    • ベストアンサー
    • Java