今回は「削除」リンクをクリックすることでデータベースに登録された顧客データを削除する処理に関しての実装を行っていきます。
ここまでの章(#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を用いています。
JavaScriptを学びたい方はこちら
削除クラスの作成
では顧客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>
データも削除されていることが確認できました。
今回はデータベースに登録された値(顧客情報)をブラウザ上から削除するプログラムを作成していきました。
続きはこちら
コメント