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

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

ただいまの
回答率

88.03%

java Servlet において正常に処理が行われていない。

解決済

回答 1

投稿 編集

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

score 18

 前提・実現したいこと

htmlから任意に入力した情報をもとに、java Servletで所定の計算を行った後、その結果を表示させること。
これを繰り返し実行できるようにすること。

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

htmlにおいて所定の値(num_gender , num_age , num_dayの3つ)をjava Servletに渡し、これをもとに所定の計算を行った後、結果を表示させるととを目標としています。
tomcatを起動して初めの1回目は正常に動くのですが、そこから再び所定の値を入れなおして実行することができません。

所定の値自体はServletに送られているのですが、その後の処理が2回目以降行ってくれません。

 該当のソースコード

package imput_action;

/**
 * Servlet implementation class GA
 */
@WebServlet("/Imput_Action")
public class Imput_Action extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */

    //    初期個体数の指定
    int Population = 10;

    //    世代数
    int GENERATION_SIZE = 3;

    int num_Gender = 0 ;
    int num_Age = 0 ;
    int num_Day = 0 ;

    //    各種入力データの取り扱い用変数の定義
    int Day = 0;
    int gender = 0;
    int age = 0;

    public Imput_Action() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
//        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //    各種必要な変数等の定義
        String bf_gender;
        String bf_age;
        String bf_day;

        int gender = 0 ;
        int age = 0 ;
        int day = 0 ;

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

        gender = Integer.parseInt(bf_gender);
        age = Integer.parseInt(bf_age);
        day = Integer.parseInt(bf_day);

        num_Gender = gender ;
        num_Age = age ;
        num_Day = day ;

        /*
            System.out.println(num_Gender);
            System.out.println(num_Age);
            System.out.println(num_Day);
         */
        //    GA自体の実行部分
        ALL_FileRead();
        Firast_Population();
        Satisfaction();

        for(int generation = 0 ; generation < GENERATION_SIZE ; generation++) {
            //    System.out.println("~~~~~第" + (generation+1) + "世代~~~~~");
            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);
                            }
                        }
                    }
                    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 , 114);
        TOP_ELITE_PROOT.add(0 , 514);

        //    競技・会場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);
        request.setAttribute("num_Age" , age);
        request.setAttribute("num_Gender" , gender);
        request.setAttribute("num_Day" , day);

        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() {

        //    性別の選択

        //    男女別の満足度表取り込み
        switch (num_Gender) {
        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;
        }

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

        //    対象の日程情報を取り出し
        //各日程の開催競技Noの読み込み
        for(int x = 0 ; x < dayHolding.length ; x++) {
            if(dayHolding[num_Day][x] == 1) {
                DH.add(x);
            }
        }
    }

    //    最初期の個体を生成(制約条件内で)
    public void Firast_Population() {
        //    入力情報等の取り込み
        User_Choice();
**文字数の関係上、処理内容は削除します。**
    }

    //    選択した性別・年代での満足度の計算
    public void Satisfaction() {
**文字数の関係上、処理内容は削除します。**    
    }

    //    選択の実施(エリート選択で選択した以外の個体でルーレット選択)
    public void Selection_R() {
**文字数の関係上、処理内容は削除します。**
    }

    //    突然変異確率のもと、突然変異を行う(入替)
    public void mutation() {
**文字数の関係上、処理内容は削除します。**
    }

    //    制約条件の計算
    public void time_limit() {
**文字数の関係上、処理内容は削除します。**
    }

    //    CSVファイルを全て取り込み
    public void ALL_FileRead() {
        FileRead_DH();
        FileRead_PD();
        FileRead_MSF();
        FileRead_WSF();
        FileRead_EC();
        FileRead_SName();
        FileRead_PName();
        FileRead_TL();
        FileRead_SF();
        FileRead_MP();
    }

    //    各種CSVファイルの読み込み
    public void FileRead_DH() {
**文字数の関係上、処理内容は削除します。**
    }
    public void FileRead_PD() {
**文字数の関係上、処理内容は削除します。**
    }
    public void FileRead_MSF() {
**文字数の関係上、処理内容は削除します。**
    }
    public void FileRead_WSF() {
**文字数の関係上、処理内容は削除します。**        
    }
    public void FileRead_EC() {
**文字数の関係上、処理内容は削除します。**        
    }
    public void FileRead_SName() {
**文字数の関係上、処理内容は削除します。**        
    }
    public void FileRead_PName() {
**文字数の関係上、処理内容は削除します。**        
    }
    public void FileRead_SWT() {
**文字数の関係上、処理内容は削除します。**        
    }
    public void FileRead_TL() {
**文字数の関係上、処理内容は削除します。**        
    }
    public void FileRead_SF() {
**文字数の関係上、処理内容は削除します。**        
    }
    public void FileRead_MP() {
**文字数の関係上、処理内容は削除します。**
    }
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- スタイルシート -->
<link rel="stylesheet" href="css/stylesheet.css">
<title></title>
</head>

<body>
<div class="name">
<h1>東京オリンピックのルートを調べよう‼</h1>
<p>~遺伝的アルゴリズムで最適なルートを探索しよう~</p>
</div>

<h1>下記の情報を入力すると探索ができます!!</h1>
<form method = "post" action = "../imput-test/Imput_Action"  onSubmit = "return check()">
<h2><label for="GENDER">~~性別を教えてください~~</label></h2>

<select name="num_Gender" style="font-size:100% ; border:0.5px">
<option value="0">女性</option>
<option value="1">男性</option>
</select>

<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="num_Day" 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>
</form>

</body>
</html>


文字数の関係上、処理の具体的な内容については省略しましたが、所定の情報の3つを直接使用するところは残しました。
省略部分は、それ以外を使用した各種計算処理だと考えていただければ間違えではないと思います。

 まとめ

htmlとServlet間の値の受け渡しはできている。
tomcat(サーバー)を起動して初めの処理は正常に動く。
ただし、戻って再び処理を行おうとすると、Servlet内の「//    GA自体の実行部分」以下が動かない模様(これはあくまで推測です)
上記の問題点を解決し、複数回戻っても正常に処理が行えることを目標としている。

不明な点等御座いましたら、何なりとお申し付けください。
ご回答よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kaputaros

    2018/11/27 09:19

    HTML側のソースはどのようになってるのでしょうか?また、tomcatのバージョン等でターゲットの指定方法が変わってくると思うので、使用しているjavaやtomcatのバージョンを記載するといいと思います。

    キャンセル

  • totogawa

    2018/11/27 09:28

    Javaのバージョンは10.0.1です。tomcatのバージョンは、7.0で行っています。

    キャンセル

  • wwbQzhMkhhgEmhU

    2018/11/27 19:01

    デバッガを使えるようになりましょう

    キャンセル

  • A-pZ

    2018/11/27 23:56

    https://teratail.com/questions/160410 に類似する内容があり、回答しています。何が動作していないのかを正しく知りましょう。

    キャンセル

回答 1

checkベストアンサー

0

お疲れさまです。回答ではありません。
ソースコードが掲載されていますが、スキルがないので良くわかりません。
私なら、
「htmlとServlet間の値の受け渡しはできている。tomcat(サーバー)を起動して初めの処理は正常に動く。」とありますが、protected void doPost()で何も計算しないでダミーデータを返す処理を書いて、htmlとServlet間の通信が繰り返しできるのかどうか確認する。
これができるのであれば、次はソースコードのprotected void doPost()を細かく分けて、思った値が帰るか確認するしかないと思います。
ご自身が「Servlet内の「//    GA自体の実行部分」以下が動かない模様(これはあくまで推測です)」と記載していますが、この部分でエラーとなる値が返っていないか確認するのが近道だと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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