【Javaで作成するWebアプリケーション#6】データベースに登録されたデータをブラウザ上から削除する

Java



今回は「削除」リンクをクリックすることでデータベースに登録された顧客データを削除する処理に関しての実装を行っていきます。

ここまでの章(#1〜#6)で基本的なJavaのWebアプリケーションによるCRUD処理を学んだことになります。

※ここまで読んでいただき、本当にありがとうございます。

前回までの内容はこちら

【JavaWebアプリケーション#1】概要と学べること
【JavaWebアプリケーション#2】基本的なログイン機能
【JavaWebアプリケーション#3】登録データをブラウザで表示
【JavaWebアプリケーション#4】データの登録機能
【JavaWebアプリケーション#5】データの更新機能

※内容名は略称しています。

では作成していきます。



リンクの作成

「顧客一覧画面」に新たに「削除」リンクを作成


上記のように新たに「削除」リンクを作成します。このリンクを押下することで対象の顧客データをデータベースから削除します。

ただし、リンク押下後にすぐにデータを削除するのではなく、ブラウザ上に確認ダイアログを表示させ、間違い防止を行います。その確認ダイアログの処理にはJavaScriptを使用します。


まずは「顧客一覧画面」にコードを追記していきます。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.lang.*" %>
<%@ page import="java.util.List" %>
<%@ page import="object.Customer" %>
<% List<Customer> customer_list = (List<Customer>)request.getAttribute("customer"); %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>顧客一覧画面</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
</head>
<body>
	<div class="mx-auto text-center" style="width: 70%;">
	<h2 class="text-center mb-3">顧客一覧</h2>
	<table class="table table-striped">
		<thead>
			 <tr>
			 	<th scope="col">顧客ID</th>
			 	<th scope="col">お客様名</th>
			 	<th scope="col">住所</th>
			 	<th scope="col">登録日</th>
			 	<th scope="col">更新日</th>
			 	<th scope="col">操作</th>
			 </tr>
		</thead>
		<tbody>
			 <% for(Customer cus : customer_list) { %>
			 <tr>
			 	<td><%= cus.getCustomer_id() %></td>
			 	<td><%= cus.getName() %></td>
			 	<td><%= cus.getAddress() %></td>
			 	<td><%= cus.getRegistered_time() %></td>
			 	<td><%= cus.getUpdated_time() %></td>
				<!-- JSTLを使用して顧客IDのデータをリンクの -->
				<!-- パラメーターに設定してサーブレットで取得する -->
			 	<c:url var="update" value="/CustomerUpdateServlet">
			 		<c:param name="id" value="<%= String.valueOf(cus.getCustomer_id()) %>"></c:param>
			 	</c:url>
			 	<c:url var="delete" value="/CustomerDeleteServlet">
			 		<c:param name="id" value="<%= String.valueOf(cus.getCustomer_id()) %>"></c:param>
			 	</c:url>
			 	<td><a href="${update}" >編集</a> | <a href="${delete}" onclick="return Delete_Dialog()">削除</a></td>
			 </tr>
			<% } %>
		</tbody>
	</table>
	<a href="<%= request.getContextPath() %>/CustomerRegisterServlet">顧客登録画面へ</a>
</div>
</body>
<script type="text/javascript">
	function Delete_Dialog(){
		var res = confirm("選択した顧客データを削除します。よろしいですか?");
		if(res){
			return true;
		} else {
			return false;
		};
	};
</script>
</html>

追記:43〜46行目
「編集」リンクと同様に「削除」リンク押下時のURLに遷移先サーブレットと顧客ID(customer_id)を設定しています。

追記:54〜63行目
「削除」リンクを押下した際に、間違い防止として確認ダイアログを以下のように表示させます。これはブラウザ上の処理になりますので、JavaScriptを用いています。

「OK」の場合、削除処理を実行(この後作成)/「キャンセル」の場合、ダイアログを閉じる


JavaScriptを学びたい方はこちら icon

icon
icon





削除クラスの作成

では顧客IDを使用して、データベースにアクセスし、対象の顧客データを削除するメソッドを作成します。

パッケージ名:sql / クラス名:Delete.java

package sql;

import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import config.DBconfig;

public class Delete {
	public void customer_delete(int customer_id) throws FileNotFoundException {

		// データベースへの接続情報をプロパティファイルから取得
		DBconfig db_info = new DBconfig();
		String url = db_info.getDBinfo().get("url");
		String user = db_info.getDBinfo().get("user");
		String pass = db_info.getDBinfo().get("password");

		// 実行SQL
		String delete_sql = "delete from customer_tb where customer_id = ?;";

		// データベースへの接続
		// try〜catch〜resources構文を使用
		try(Connection conn = DriverManager.getConnection(url,user,pass)){
			// オートコミット機能を無効化
			conn.setAutoCommit(false);

			try(PreparedStatement stmt = conn.prepareStatement(delete_sql)){
				// 変数delete_sqlの一番目の?にcustomer_idをセット
				stmt.setInt(1, customer_id);
				// SQLの実行
				stmt.executeUpdate();
				// コミット
				conn.commit();
				System.out.println("削除処理が成功しました");
			} catch (SQLException e) {
				conn.rollback();
				System.out.println("ロールバック処理を行いました");
				e.printStackTrace();
			}
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
	}
}

更新処理(Update.java)とプログラム内容はほとんど同じです。実行するSQLにDELETE文を使用しています。


では作成したcustomer_deleteメソッドをCustomerDeleteServlet.javaで使用できるようにし、顧客情報削除処理を完成させます。

パッケージ名:servlet / クラス名:CustomerDeleteServlet.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 object.Admin;
import object.Customer;
import sql.Delete;
import sql.Login;

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 文字コードの設定
		response.setContentType("text/html; charset=UTF-8");
		request.setCharacterEncoding("UTF-8");

		// 「削除」リンクから対象の顧客IDを取得
		int id =Integer.parseInt(request.getParameter("id"));

		Delete sql = new Delete();
		// 顧客削除処理を実行
		sql.customer_delete(id);

		// 管理者のセッションを取得
		HttpSession session = request.getSession(true);
		Admin admin = (Admin) session.getAttribute("admin");

		Login login = new Login();
		List<Customer> customer = null;

		// データベースから取得した顧客情報を格納
		customer = login.getCustomerInfo(String.valueOf(admin.getId()));

		// 格納した顧客情報を遷移先の画面に渡す
		request.setAttribute("customer", customer);

		RequestDispatcher dispatcher =
				request.getRequestDispatcher("WEB-INF/jsp/customer_list.jsp");
		dispatcher.forward(request, response);
	}

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

}

36行目:「削除」リンクをクリックし、確認ダイアログの「OK」を押下後に、対象の顧客IDを用いて、顧客情報が処理されます。

選択した顧客情報が削除されたあとは、残った顧客情報が表示されます。




ブラウザ上で確認

実際に「削除」リンクを選択し、表示される確認ダイアログを「OK」すると顧客情報が削除されていることを確認しましょう。

http://localhost:8080/CustomerManagement/LoginServlet

今回は顧客ID「2」のデータを削除しています。

削除後は以下のように顧客ID「2」のデータがないことを確認できます。

※削除後の確認ダイアログで「キャンセル」を選択すると、顧客データが削除されないことも確認してください。

テーブル内の値も確認しておきます。

削除前
mysql> select * from customer_tb;
+-------------+----------+-----------------+--------------------+---------------------+---------------------+
| customer_id | admin_id | name            | address            | registered_time     | updated_time        |
+-------------+----------+-----------------+--------------------+---------------------+---------------------+
|           1 |        1 | 松藤春治郎      | 北海道札幌市       | 2022-12-11 23:58:22 | 2022-12-11 23:58:22 |
|           2 |        1 | 今川元春        | 兵庫県宍粟市       | 2022-12-18 15:59:52 | 2022-12-26 17:01:02 |
+-------------+----------+-----------------+--------------------+---------------------+---------------------+
2 rows in set (0.00 sec)

mysql> 

削除後
mysql> select * from customer_tb;
+-------------+----------+-----------------+--------------------+---------------------+---------------------+
| customer_id | admin_id | name            | address            | registered_time     | updated_time        |
+-------------+----------+-----------------+--------------------+---------------------+---------------------+
|           1 |        1 | 松藤春治郎      | 北海道札幌市       | 2022-12-11 23:58:22 | 2022-12-11 23:58:22 |
+-------------+----------+-----------------+--------------------+---------------------+---------------------+
1 row in set (0.00 sec)

mysql>

データも削除されていることが確認できました。

今回はデータベースに登録された値(顧客情報)をブラウザ上から削除するプログラムを作成していきました。

続きはこちら

icon
icon

コメント

タイトルとURLをコピーしました