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

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

ただいまの
回答率

88.09%

データ削除後のデータが残る

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,894

score 19

年月をweb上で指定すると、DBから該当の体重データを表示するというものです.
問題が以下の画面のような場合において発生します。
イメージ説明

上の写真のように、データが一つしかない時に、削除ボタンを押すと、DBからデータは削除できるのですが、再読み込みをしても以下のように、画面上には消す前のデータが表示されっ放しとなってしまいます。(DB内は確実に削除されています)
イメージ説明

・削除時のServlet(HistoryDelete.java)は以下のようにコーディングしております。

↓History.java

package servlet;

import java.io.IOException;
import java.util.List;

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 model.HistoryLogic;
import model.User;
import model.WeightHistory;

@WebServlet("/History")
public class History extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        session.setAttribute("weightHistoryLength", null);
        User user = (User) session.getAttribute("loginUser");

        if(user != null) {
            if(session.getAttribute("year") != null) {
                if(!session.getAttribute("year").equals("")) {
                    String year = session.getAttribute("year").toString();
                    String month = session.getAttribute("month").toString();
                    HistoryLogic historyLogic = new HistoryLogic();
                    List<WeightHistory> weightHistoryList = historyLogic.execute(user.getUserId(), Integer.parseInt(year), Integer.parseInt(month));
                    if(!weightHistoryList.isEmpty()) {
                        session.setAttribute("historiesLength",weightHistoryList);
                    }
                    session.setAttribute("year", "");
                    session.setAttribute("month", "");
                }
            }
            RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/jsp/history.jsp");
            requestDispatcher.forward(request, response);
        }
        else {
            response.sendRedirect("/bodyMassIndex/");
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // リクエストパラメータの取得
        request.setCharacterEncoding("utf-8");
        String year = request.getParameter("year");
        String month = request.getParameter("month");
        HttpSession session = request.getSession();
        session.setAttribute("weightHistoryLength", null);
        User user = (User) session.getAttribute("loginUser");

        try {
            if(!(year.equals("-1") || month.equals("-1"))) {
                HistoryLogic historyLogic = new HistoryLogic();
                List<WeightHistory> weightHistoryList = historyLogic.execute(user.getUserId(), Integer.parseInt(year), Integer.parseInt(month));

                if(!weightHistoryList.isEmpty()) {
                    session.setAttribute("historiesLength",weightHistoryList);
                }
                else {
                    request.setAttribute("errorMessage", "対象の年月にデータが入力されていません。");
                }
            }
            else if(year.equals("-1")) {
                request.setAttribute("errorMessage", "年が選択されていません。");
            }
            else if(month.equals("-1")) {
                request.setAttribute("errorMessage", "月が選択されていません。");
            }
            else {
                request.setAttribute("errorMessage", "なぜかダメです。");
            }
            RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/jsp/history.jsp");
            requestDispatcher.forward(request, response);
        }
        catch(Exception e) {
            e.printStackTrace();
            request.setAttribute("errorMessage", "進捗、ダメです。");
        }
    }
}

↓history.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.List" %>
<%@ page import="model.WeightHistory" %>
<!DOCTYPE html">
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/menu.css"/>
<link rel="stylesheet" type="text/css" href="css/history.css?20170619"/>
<meta charset="UTF-8">

<title>体重管理アプリケーション</title>
<script src="js/lib/jquery-3.2.1.min.js"></script>
<script src="js/menu.js"></script>
</head>
<body onload="selectColorChange(2);">
    <jsp:include page="menu.jsp"/>
    <div id="div1">
        <div id="div2">
            <form action="/bodyMassIndex/History" method="post">
            <div id="errorMessage"><p><%= request.getAttribute("errorMessage") != null ? request.getAttribute("errorMessage") : " " %></p></div>

                <!-- 年のセレクトボックスの作成 -->
                <select name="year"id="box1">
                    <option value="-1"></option>
                    <option value="2017">2017</option>
                    <option value="2018">2018</option>
                    <option value="2019">2019</option>
                    <option value="2020">2020</option>
                </select>

                <!-- 月のセレクトボックスの作成 -->
                <select name="month"id="box2" style="margin-left:50px">
                    <option value="-1"></option>
                    <option value="1">1月</option>
                    <option value="2">2月</option>
                    <option value="3">3月</option>
                    <option value="4">4月</option>
                    <option value="5">5月</option>
                    <option value="6">6月</option>
                    <option value="7">7月</option>
                    <option value="8">8月</option>
                    <option value="9">9月</option>
                    <option value="10">10月</option>
                    <option value="11">11月</option>
                    <option value="12">12月</option>
                </select>

                <!-- ボタンの作成 -->

                <input type="submit" value="表示する" id="button2">
            </form>
            <a href="/bodyMassIndex/Record"><input type="button" value="記録する" id="button1"/></a>
        </div>

         <div id="div3">
                <h3 id="text1"><pre>    日付            体重        </pre></h3>
             <% List<WeightHistory> historyList = (List<WeightHistory>)session.getAttribute("historiesLength");
             if (historyList != null) {
                 for(int i = 0; i < historyList.size(); i++) { %>
                     <span id="line">
                         <pre><%= (historyList.get(i).getTargetDate().getYear() + 1900) + "/" + (historyList.get(i).getTargetDate().getMonth() + 1) + "/" + historyList.get(i).getTargetDate().getDate() %>          <%=(int) historyList.get(i).getWeight() %><span id="kgwasshoi">kg</span>         <a href="Record?logId=<%= historyList.get(i).getLogId() %>" id="tag1">編集</a>   <a href="HistoryDelete?logId=<%= historyList.get(i).getLogId() %>" id="tag2">削除</a></pre>
                     </span>
                 <% }
             } %>
        </div>
     </div>
</body>
</html>


↓HistoryLogic.java

package model;
import java.sql.Date;
import java.util.List;
import dao.WeightHistoryDAO;

public class HistoryLogic {

    public List<WeightHistory> execute(int userId, int targetYear, int targetMonth) {
        WeightHistoryDAO dao = new WeightHistoryDAO();
        return dao.weightHistoryFindAll(userId, targetYear, targetMonth);
    }

    public WeightHistory execute(int userId,Date targetDate){
        WeightHistoryDAO dao=new WeightHistoryDAO();
        return dao.weightHistoryFind(userId, targetDate);
    }
}
↓HistoryDelete.java

```Java package servlet;

import java.awt.Frame; import java.io.IOException; import java.util.List;

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 javax.swing.JOptionPane;

import model.HistoryDeleteLogic;

@WebServlet("/HistoryDelete") public class HistoryDelete extends HttpServlet { private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession();                                        // セッションを取得するための準備 int logId;                                                                            // ログインIDを保存しておくための変数 StringBuffer urlBuffer = request.getRequestURL();                                    // 変数 urlBuffer に現在のページのURLを格納する(ただし、?以降のパラメータ情報は取得できない) String url = urlBuffer.append("?").append(request.getQueryString()).toString();        // 先ほど取得したURL文字列の後ろに、現在のパラメータ情報をドッキングする int indexOfParam = url.indexOf("=");                                                // パラメータ付きURLかどうかを調べる(=マークがあるかどうか) if(session.getAttribute("loginUser") != null && indexOfParam != -1) { logId = Integer.parseInt(url.substring(indexOfParam + 1));                        // =マークから先を切り取り、取得した文字列を変数 logId に格納する(int型へキャスト) HistoryDeleteLogic hdl=new HistoryDeleteLogic(); List<Integer> list = hdl.act(logId); int result; Frame frame = new Frame(); Object[] options = { "OK", "CANCEL" }; frame.setAlwaysOnTop(true); result = JOptionPane.showOptionDialog(frame, "選択した履歴を削除してよろしいですか?", "Warning", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]); switch (result) { case JOptionPane.OK_OPTION: hdl.execute(logId); Frame frame2 = new Frame(); Object[] options2 = { "OK" }; frame2.setAlwaysOnTop(true); JOptionPane.showOptionDialog(frame2, "削除しました", "Information", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options2, options2[0]); case JOptionPane.NO_OPTION: case JOptionPane.CANCEL_OPTION: default: session.setAttribute("year", list.get(0)); session.setAttribute("month", list.get(1)); session.setAttribute("weightHistoryLength", null); response.sendRedirect("/bodyMassIndex/History"); break; } } else { response.sendRedirect("/bodyMassIndex/"); }

}

}

```

やりたいこととして、データが一つしかない時に、削除ボタンを押して、削除後にリロードすると、データが何も表示されない状態で、表示させたいと考えております。

拙い文章で申し訳ありませんが、回答よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • tkturbo

    2017/06/19 15:59

    java.awt.Frameもjavax.swing.JOPtionPaneもクライアントサイドのGUIを作るためのクラスなわけですが、なぜ混在しているのでしょう?

    キャンセル

  • cayribaka

    2017/06/19 16:04 編集

    @tkturbo様 回答ありがとうございます。調べた限り、このクラスを入れなければ、削除するときの[OK,CANCEL]ダイアログを表示する方法がなかったためです。エラーを消す時に入れてしまったわけではありませんでした。

    キャンセル

  • tkturbo

    2017/06/19 16:18

    History.javaはありますが、HistoryDelete.javaはどこでしょう?

    キャンセル

回答 1

checkベストアンサー

+1

Sessionに入れて表示した場合には、Sessionに残るので削除する際はSessionに残った情報も
削除してください。
Session切れるまで残ります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/19 16:09

    @kanimaru様 回答ありがとうございます。Sessionにいれてしまうと、残ってしまうのですね。コードを確認して、書き直します。ありがとうございます。

    キャンセル

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

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

関連した質問

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