質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Java

    14102questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1709questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

  • JSP

    948questions

    JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

  • Tomcat

    569questions

  • サーブレット

    118questions

    サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

JSPで乱数を使用したい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,538
退会済みユーザー

退会済みユーザー

前提・実現したいこと

JSPで乱数を使おうと考えています。
ツールはeclipse Version: Mars.2 Release (4.5.2)を使用しています。

JSPページにて乱数を2つ表示し、それらを足した答えを
テキストボックスに入力してもらい、答え合わせをするプログラムです。
もし未入力だった場合には、エラーにせず同じ問題画面をもう一度
表示したいと考えています。
未入力のとき、JSP⇒サーブレット⇒JSPと遷移すると
乱数が再生生成され、問題が変わってしまいます。

ここを変えずに、未入力の場合には同じ問題を出題し、
テキストボックス欄に何かしら入力されていれば
別の問題へ移るというプログラムを作りたいです。

いくらか調べてみたのですが、理解できなかったのでご質問させていただきました。

該当のソースコード

''''JSP''''''''''''''''''''''''''
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>足し算演算ゲーム</title>
</head>
<!-- JavaBeansオブジェクトを生成 -->
>
<jsp:useBean id="addbean" class="addBean.AddBean" scope="session" />
<jsp:useBean id="ransuu" class="addBean.AddBean" scope="page"/>
    <body>
        ########################################################################
        <br>
        <font size="5">足し算演習ゲーム</font>
        <br>
        <br>

        <table border="1" width="100%">
            <tr>
                <%-- requestスコープを持つ、JavaBeansオブジェクトaddbeanを
            通して、JavaBeansに保存されたデータを参照します。 --%>
                <td align="center">残り<jsp:getProperty name="addbean"
                        property="times" />問
                <td align="right"><jsp:getProperty name="addbean"
                        property="userName" /></td>
            </tr>
        </table>
        計算問題
        <br>
        <%=ransuu.getRan1()%>
        +
        <%=ransuu.getRan2()%>
        =
        <form method="GET" action="./AddAnswerServlet">
            <input type="text" name="answer"> <input type="submit"
                name="nextButton" value="決定して次へ">
        </form>
    </body></html>

''''''''''''''''''''''''
''''サーブレット'''''''''''''''''''''''''''''''''''''''''''''''''''''''
package addServlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import addBean.AddBean;

/**
 * Servlet implementation class AnswerServlet
 */
@WebServlet("/AddAnswerServlet")
public class AddAnswerServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static int sum = 0;
    String forward = null;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public AddAnswerServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try{
            AddBean addbean;
            HttpSession session = request.getSession();

            addbean = (AddBean) session.getAttribute("addbean");
            if (addbean == null) {
                forward = "/jsp.add.error/addErrorSession.jsp";
            }

            // 正しい答えを呼び出す
            int result = addbean.getResult();

            // 正誤チェック
            // AddBeanから計算に用いられる二つの数値を呼ぶ
            // それらを足し合わせた計算結果が回答とあっているか確かめる
            // あっていれば、正解数カウント+1
            // 間違っていれば正解数カウント+0
            String strAnswer = request.getParameter("answer");
            if (strAnswer != null) {
                int answer = Integer.parseInt(strAnswer);
                if (answer == result) {
                    sum++;
                    addbean.setSum(sum);
                } else {
                }
            }
            // 問題数分回す
            // AddBeanから問題数を取得する
            // times>0ならもう一度問題画面へ
            // times==0なら、計算結果画面へ
            // timesに入力された値が上2つ以外のものであれば、エラー画面へ

            int times = addbean.getTimes();
            if(times>0){
                forward = "/jsp.add/addAnswer.jsp";
                times--;
                addbean.setTimes(times);
            }else if(times==0){
                forward = "/jsp.add/addResult.jsp";
            }else{
                forward = "/jsp.add.error/addErrorNumberOutOfRange.jsp";
            }

        }catch(Exception e){
            forward = "/jsp.add/addAnswer.jsp";
        }finally{
            RequestDispatcher dispatcher = request.getRequestDispatcher(forward);
            dispatcher.forward(request, response);
        }
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
'''''''''''''''''''''''''''''''''''''''''''''''''''''
''''JavaBeans''''''''''''''''''''''''''''''
package addBean;

import java.util.Random;

public class AddBean {

    private String userName=null;

    private String userPassword=null;

    private int times;

    Random rnd = new Random();
        private int ran1 = rnd.nextInt(99)+1;
        private int ran2 = rnd.nextInt(99)+1;

    private int result = ran1 + ran2;

    private int sum = 0;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    public int getTimes() {
        return times;
    }

    public void setTimes(int times) {
        this.times = times;
    }

    public int getRan1() {
        return ran1;
    }

    public void setRan1(int ran1) {
        this.ran1 = ran1;
    }

    public int getRan2() {
        return ran2;
    }

    public void setRan2(int ran2) {
        this.ran2 = ran2;
    }

    public int getResult() {
        return result;
    }

    public int getSum() {
        return sum;
    }

    public void setSum(int sum) {
        this.sum = sum;
    }

}

試したこと

ネットで調べてscopeを変えてみたりしたのですが、うまくいきませんでした。

補足情報(言語/FW/ツール等のバージョンなど)

Java
Tomcat 8.0
eclipse Version: Mars.2 Release (4.5.2)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

JSPにあるransuuが不要なのではないかと思います。
その理由は、AddBeanのインスタンスを2つ取得していますが、

<jsp:useBean id="addbean" class="addBean.AddBean" scope="session" />
<jsp:useBean id="ransuu" class="addBean.AddBean" scope="page"/>

セッション属性へ AddBeanインスタンスをaddBeanの名前で、
ページ属性へ ransuuの名前で、別々に保存していますね。
計算問題を表示するところで、

<%=ransuu.getRan1()%>


と、セッションに保存したのとは別のインスタンスである ransuu から出力しています。
addbeanから取得すればよいかと思います。

問題に正解した場合は、再度セッションに新しいAddBeanを格納すればよいかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/06 16:55

    ありがとうございます!解決しました!

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Java

    14102questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1709questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

  • JSP

    948questions

    JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

  • Tomcat

    569questions

  • サーブレット

    118questions

    サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。