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

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

ただいまの
回答率

88.58%

HTMLとjavaSetvlet間の値の受け渡しについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 875

totogawa

score 18

 前提・実現したいこと

htmlで入力した値をjava(servlet)に送り、所定の計算を行った後、jpsファイルに値を送り表示させること。

 発生している問題・エラーメッセージ

一回目の実行では正常に処理させるのですが、そこからブラウザバックを行い、再度異なる値を選択し実行すると、前回のままでの表示がされてしまうこと。
例:1回目1と1を選択>servletで計算>1+1=2>jpsファイルで表示(1と1と結果の2)
2回目:ブラウザバックを行う>2と3を選択>servletで計算(?)>jspの表示が1回目と同じ

下記に例のコードを載せますが、これはあくまでも例で、実際にはより多くの計算処理をさせてからjspに表示させることを目標としています。ただし原理原則は同じです。

そして最大の問題は、目標とする構造とシンプルにしたものの同じ構造であるにもかかわらず、この例ではブラウザバックしても正常にservletで計算を行い、jspで表示できているということです。

なぜ例で作ったものが正常に動き、実際に作っているものではできないのかが、皆目見当がつきません。

こうしたらいいのではないのか、これを試したらどうか等何でも構いませんので、ご回答のほどよろしくお願いします。

 製作しているソースコード(問題が発生しているもの)

    private static final long serialVersionUID = 1L;

    public Imput_Action() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //    各種必要な変数等の定義
        String bf_gender;
        String bf_age;
        String bf_day;

        bf_gender = request.getParameter("num_Gender");
        bf_age = request.getParameter("num_Age");
        bf_day = request.getParameter("Day_data");

        num_Gender = Integer.parseInt(bf_gender);
        num_Age = Integer.parseInt(bf_age);
        num_Day = Integer.parseInt(bf_day);

        //    GA自体の実行部分
        ALL_FileRead();
        Firast_Population();
        Satisfaction();

        for(int generation = 0 ; generation < GENERATION_SIZE ; generation++) {
            strat();
            elite_SRST = Collections.max(SRST);
            Generation_Elite.add(elite_SRST);

            // 各世代で最大満足度個体を保存
            for(int i = 0 ; i < SRST.size() ; i++) {
                double a = SRST.get(i);
                if(elite_SRST == a) {
                    ArrayList<Integer> ESRN = new ArrayList<>(SNRList.get(i));
                    ArrayList<Integer> EPRN = new ArrayList<>();
                    Generation_EliteS.add(ESRN);

                    //    競技Noを会場Noに変換
                    for(int y = 0 ; y < ESRN.size() ; y++) {
                        for(int x = 0 ; x < noExchange.length ; x++) {
                            if(noExchange[ESRN.get(y)][x] == 1) {
                                EPRN.add(x);
                            }
                        }
                    }
                    //    会場ルートの先頭にNo,0…JR東京駅を追加
                    EPRN.add(0 , 0);
                    Generation_EliteP.add(EPRN);
                    break;
                }
            }
        }

        //    全世代間で最大満足度の個体を探索。
        double TOP_ELITE = 0.0;
        ArrayList<Integer> TOP_ELITE_PROOT = new ArrayList<>();
        ArrayList<Integer> TOP_ELITE_SROOT = new ArrayList<>();
        int TOP_ELITE_NO = 0;

        TOP_ELITE = Collections.max(Generation_Elite);
        TOP_ELITE_NO = Generation_Elite.indexOf(TOP_ELITE);
        TOP_ELITE_SROOT = Generation_EliteS.get(TOP_ELITE_NO);
        TOP_ELITE_PROOT = Generation_EliteP.get(TOP_ELITE_NO);

        //    output.jspに送る際に先頭にダミーを置く。
        TOP_ELITE_SROOT.add(0 , 1000);
        TOP_ELITE_PROOT.add(0 , 1000);

        //    競技・会場Noから名前への変換と配列への保存
        ArrayList<String> result_SNroot = new ArrayList<>();
        ArrayList<String> result_PNroot = new ArrayList<>();

        for(int i = 1 ; i < TOP_ELITE_SROOT.size() ; i++) {
            String numS = Sname.get(TOP_ELITE_SROOT.get(i));
            result_SNroot.add(numS);
        }

        for(int i = 1 ; i < TOP_ELITE_PROOT.size() ; i++) {
            String numP = Pname.get(TOP_ELITE_PROOT.get(i));
            result_PNroot.add(numP);
        }

        //    output.jspに送る際に先頭と最後尾にダミーを置く。
        result_SNroot.add(0 , "ダミー");
        result_PNroot.add(0 , "ダミー");
        result_SNroot.add(result_SNroot.size() , "ダミー");
        result_PNroot.add(result_PNroot.size() , "ダミー");

        //    output.jspに各種数値等を送る
        request.setAttribute("result_Sroot" , TOP_ELITE_SROOT);
        request.setAttribute("result_Proot" , TOP_ELITE_PROOT);
        request.setAttribute("result_SNroot" , result_SNroot);
        request.setAttribute("result_PNroot" , result_PNroot);
        request.setAttribute("result_Satisfaction" , TOP_ELITE);

        getServletConfig().getServletContext().
        getRequestDispatcher("/output-action.jsp").forward(request , response);
    }

    //    GAの流れを構成(フローチャートでいう繰り返しの部分)
    public void strat() {
        Selection_R();
        crossover2();
        mutation();
        time_limit();
        Satisfaction();
**上記のコードは文字数の関係上省略しました。**
    }

    // HTMLからの使用者の性別年代情報の入力
    public void User_Choice() {

        //    性別の選択
        int Gender_data = num_Gender;

        //    男女別の満足度表取り込み
        switch (Gender_data) {
        case 0:
            for (int y = 0; y < 38; y++) {
                for (int x = 0; x < 6; x++) {
                    GENDER[y][x] = womanSatisfaction[y][x];
                }
            }
            break;

        case 1:
            for (int y = 0; y < 38; y++) {
                for (int x = 0; x < 6; x++) {
                    GENDER[y][x] = manSatisfaction[y][x];
                }
            }
            break;
        }

        //    年代を選択
        int Age_data = num_Age;
        age = Age_data - 1;
        for(int x = 0 ; x < GENDER.length ; x++) {
            AGE[x] = GENDER[x][Age_data];
        }

        //    年代の表示
        switch (num_Age) {
        case 0:
            PAge = ("20代");
            break;
        case 1:
            PAge = ("30代");
            break;
        case 2:
            PAge = ("40代");
            break;
        case 3:
            PAge = ("50代");
            break;
        case 4:
            PAge = ("60代");
            break;
        case 5:
            PAge = ("70代以上");
            break;
        }

        //    性別の表示
        switch (num_Gender) {
        case 0:
            PGender = ("女性");
            break;
        case 1:
            PGender = ("男性");
            break;
        }

        //    対象の日程情報を取り出し
        int Day = num_Day;
        //各日程の開催競技Noの読み込み
        for(int x = 0 ; x < dayHolding.length ; x++) {
            if(dayHolding[Day][x] == 1) {
                DH.add(x);
            }
        }
    }
}
**form部分のみ掲載します**
<form method = "post" action = "/imput-test/Imput_Action" onSubmit = "return check()">

<h2><label for="GENDER">~~性別を教えてください~~</label></h2>

<div class="table">
<table border="1" align="center">
<tr>
<th id="man-table">男性</th>

<th id="woman-table">女性</th>
</tr>

<tr>
<td id="man-table">
<div class="select-gender" >
<input id="man" type="radio" name="num_Gender" value="1">
<label for="man">
<img src="img/man.jpg"  width="150px" height="150px" alt="エラー">
</label>
</div>
</td>

<td id="woman-table">
<div class="select-gender">
<input id="woman" type="radio" name="num_Gender" value="0">
<label for="woman">
<img src="img/woman.jpg"  width="150px" height="150px" alt="エラー">
</label>
</div>

</td>
</tr>
</table>
</div>

<h2><label for="AGE">~~年代を教えてください~~</label></h2>

<select name="num_Age" style="font-size:100% ; border:0.5px">
<option value="0">20代</option>
<option value="1">30代</option>
<option value="2">40代</option>
<option value="3">50代</option>
<option value="4">60代</option>
<option value="5">70代以上</option>
</select>

<h2><label for="DAY">~~調べたい日程を教えてください~~</label></h2>

<select name="Day_data" style="font-size:100% ; border:0.5px">
<option value="0">1日目</option>
<option value="1">2日目</option>
<option value="2">3日目</option>
<option value="3">4日目</option>
<option value="4">5日目</option>
<option value="5">6日目</option>
<option value="6">7日目</option>
<option value="7">8日目</option>
<option value="8">9日目</option>
<option value="9">10日目</option>
<option value="10">11日目</option>
<option value="11">12日目</option>
<option value="12">13日目</option>
<option value="13">14日目</option>
<option value="14">15日目</option>
<option value="15">16日目</option>
<option value="16">17日目</option>
</select>

<p><input type = "submit" value = "情報をサーブレットに送信">
<input type = "reset" value = "入力した情報をリセットする">
</p>

<script>function check(){
    num_Gender = 0 ;
    num_Age = 0 ;
    Day_data = 0 ;
    if(window.confirm("送信してよろしいですか?")){
        return true;
    }
    else{
        window.alert("キャンセルしました\n再度入力してください");
        return false;
    }
}</script>
</form>
**script部分のみ掲載します**
<script type="text/javascript">
    SNnum = new Array;
    Sport_Name_Root = new Array;
    var SNroot = '<%=request.getAttribute("result_SNroot")%>';
    SNnum = SNroot.split(",");
    for(var i = 1 ; i < SNnum.length-1 ; i++){
        Sport_Name_Root[i] = SNnum[i];
        document.write(i + "番目…" + Sport_Name_Root[i] + "<br>");
    }
    document.write("~~finish~~");
</script>
</div>

<div class="public_root">
<h2>~~会場ルート~~</h2>
<script type="text/javascript">
    Pnum = new Array;
    Public_No_Root = new Array;
    var Proot = '<%=request.getAttribute("result_Proot")%>';
    Pnum = Proot.split(",");
    for(var i = 1 ; i < Pnum.length ; i++){
        Public_No_Root[i] = parseInt(Pnum[i]);
    }
    document.write("finish" + "<br>");

    PNnum = new Array;
    Public_Name_Root = new Array;
    var PNroot = '<%=request.getAttribute("result_PNroot")%>';
    PNnum = PNroot.split(",");
    for(var i = 1 ; i < PNnum.length-1 ; i++){
        Public_Name_Root[i] = PNnum[i];
        document.write(i + "番目…" + Public_Name_Root[i]);
        document.write('<center>');
        document.write(point[ Public_No_Root[i] ]);
        document.write('</center>');
    }
    document.write("~~finish~~");
</script>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/11/26 17:35

    「ダメだった」だけだと何をどうしてどうなったか分からないので具体的に記載いただきたいところではあるのですが(こちらの意図通りのことを試したかわかりませんし)、そもそもJavaScriptでhtmlをwriteしてるのはなぜでしょうか?

    キャンセル

  • totogawa

    2018/11/26 17:45

    「ダメだった」の具体的な内容について…質問内容の解決の手段として、提案していただいた方法。つまりリンクを新たに製作。そこから数値の入力画面へと戻る方法を取りました。実際に動かした結果1回目は正常に成功。そこからリンクから最初の画面に戻り2回目を1回目とは異なる数値で実行。しかし1回目と全く同じ結果が表示させていました。

    キャンセル

  • totogawa

    2018/11/26 17:48

    javascriptでhtmlをwriteしている理由について…htmlで入力した数値をservletに送り再びhtmlと同じ形で表示できることが目標でした。それを実現するために模索していた中で見つけた方法がこの方法でした。自分自身勉強しながらの製作のため知識不足であることは事実です。別の方法が在りましたら、是非ともご教授いただければ幸いです。

    キャンセル

回答 1

checkベストアンサー

0

「ブラウザの戻る」を使ったとしても、サーブレットへ送信されるパラメータは送信時に入力された値に必ずなります。
それでも変化しない場合は、それは正しく受け取れていないか、同じ名前のパラメータを送信しているか、ないしは他の処理で上書きしているのではないでしょうか。

IntelliJやEclipseのようなIDEを使ってデバッグモードで起動し、変数が正しく格納されているのかを確かめるのが良いでしょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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