JavaサーブレットとJSPファイルを使ったCRUDアプリケーションの作成

1.環境
(1)開発環境
OS: Windows 10 Pro
IDE:Eclipse IDE for Enterprise Java Developers Version: 2020-12 (4.18.0)
Java version:11.0.9、Tomcat v8.0
(2)データベース
XAMPPのmysql
mysql Ver 15.1 Distrib 10.4.17-MariaDB, for Win64 (AMD64)

2.アプリケーションの概要

 データベースに対して、ユーザー名の登録、参照、更新、削除を行う。

3.設計
(1)CRUD表

(2)ER図

(3)クラス図

(4)シーケンス図

4.実装
(1)プロジェクトフォルダ作成
ファイル>新規>その他を選択し、「動的Webプロジェクト」を選択

(2)mysqlドライバーのビルドパスを設定
 プロジェクトフォルダのWebContent/WEB-INF/libに
MysqlコネクタMysql-connector-java-8.0.12.jarをダウンロードし保存する。
https://dev.mysql.com/downloads/connector/j/
 プロジェクトを選択してマウス右ボタンで「ビルド・パス」>「ビルド・パスの構成」を選択して、「javaのビルドパス」の画面を表示する。(下図)
「JARの追加」を選択し、「JARの選択」画面で、WebContent/WEB-INF/lib配下の「Mysql-connector-java-8.0.12.jar」を選択して、適用する。

(3)ソースファイル
Index.jsp(ユーザー管理画面)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>メニュー</title>
</head>
<body>
<h2>【ユーザー管理】</h2>
<a href="/Crud_sample/view/UserReghist.jsp">『ユーザー登録』</a><br>
<a href="/Crud_sample/UserCnt2">『ユーザー一覧』</a>
</body>
</html>


UserReghist.jsp(ユーザー登録画面)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>登録</title>
</head>
<body>
	<h2>【ユーザー登録】</h2>
	<form action="/Crud_sample/UserCnt" method="post">
		名前:<input type="text" name="user_name"><br>
		<input type="submit" value="登録">
		<a href="/Crud_sample/index.jsp">戻る</a>
	</form>
</body>
</html>


UserList.jsp(ユーザー一覧画面)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="model.UserModel,java.util.ArrayList,java.util.Iterator" %>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>ユーザー一覧画面</title>
	<style type="text/css">
	/* 基本のテーブル定義 */
	.t {border:1px solid   #000000;border-collapse:collapse;table-layout:fixed;font-size:16px}
	.t td{border:1px solid #000000;height:16px;}
	.t th{border:1px solid #000000;font-size:16px}
	.t th{background-color:#FFBB88;color:#000000;}
	.t tr:nth-child(odd)  td{background-color:#C8C8E8;color:#000000;}
	.t tr:nth-child(even) td{background-color:#E8E8FF;color:#000000;}
	.t1{width:550px;}
	.t2{width:50px}
	.fixed{position: sticky;
		 top: 0;}
	#data {
	   overflow-x:scroll;overflow-y:scroll;
	   width:700px;height:245px;
	   }
	</style>
</head>
<body>
	<h2>【ユーザー一覧】</h2>
	<form action="/Crud_sample/UserCnt2" method="post" >
		<div id="data">
		<table class=t>
			<tr>
				<th class="t1 fixed">名前</th>
				<th class="t2 fixed">ボタン</th>
				<th class="t2 fixed">ボタン</th>
				<th class="t2 fixed">ID</th>
			</tr>
			<%
			//リクエストスコープからインスタンスを取得。
			ArrayList<UserModel> user_s=(ArrayList<UserModel>)request.getAttribute("userlist");
			//インスタンスがNULLでないとき、イテレータで1件づつ取り出す
			if(user_s!=null){
				Iterator<UserModel> iterator = user_s.iterator();
				while(iterator.hasNext()){
					 UserModel user = (UserModel)iterator.next();
					int uid=user.getUser_id();
			%>
				<tr>
				<td class="t1"><%=user.getUser_name() %></td>
				<td><button type="submit" name="ref" class="t2" value=<%=uid %> >変更</button></td>
				<td><button type="submit" name="del" class="t2" value=<%=uid %> >削除</button></td>
				<td class="t2"><%=user.getUser_id() %></td>
				</tr>
			<%
				}
			}
			%>
			</table>
		</div>
		<a href="/Crud_sample/index.jsp">戻る</a>
	</form>
</body>
</html>


UserUpdate.jsp(ユーザー変更画面)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="model.UserModel" %>
<%
//リクエストスコープからオブジェクト取得
UserModel user_m=(UserModel)request.getAttribute("user_m");
int id=user_m.getUser_id();
String user_name=user_m.getUser_name();
%>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>ユーザー変更</title>
</head>
<body>
	<h2>【ユーザー変更】</h2>
	<form action="/Crud_sample/UserCnt3" method="post">
		id:<%=id %>
		<input type="hidden" name="user_id" value=<%=id %>><br>
		名前:<input type="text" name="user_name" value=<%=user_name %>><br>
		<input type="submit" value="登録">
		<a href="/Crud_sample/index.jsp">戻る</a>
	</form>
</body>
</html>


OK.jsp(登録成功確認画面)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="model.UserModel" %>
<%
//リクエストスコープからオブジェクト取得
UserModel user_m=(UserModel)request.getAttribute("user_m");
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>登録確認画面</title>
</head>
<body>
	<h2>【登録確認】</h2>
	<%=user_m.getUser_name() %> さん登録しました<br>
	<a href="/Crud_sample/index.jsp">確認</a>
</body>
</html>


NG.jsp(登録失敗確認画面)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>登録確認画面</title>
</head>
<body>
	<h2>【登録確認】</h2>
	登録に失敗しました<br>
	<a href="/Crud_sample/index.jsp">確認</a>
</body>
</html>


DelOK.jsp(削除成功確認画面)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="model.UserModel" %>
<%
//リクエストスコープからオブジェクト取得
UserModel user_m=(UserModel)request.getAttribute("user_m");
%>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>削除確認画面</title>
</head>
<body>
	<h2>【削除確認】</h2>
	user_id:<%=user_m.getUser_id() %> さん削除しました<br>
	<a href="/Crud_sample/index.jsp">確認</a>
</body>
</html>


DelNG.jsp(削除失敗確認画面)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>削除確認画面</title>
</head>
<body>
	<h2>【削除確認】</h2>
	削除に失敗しました<br>
	<a href="/Crud_sample/index.jsp">確認</a>
</body>
</html>


UserCnt.java(コントローラ)
「ユーザー登録画面」からのpost受信処理

package controller;

import java.io.IOException;
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 model.UserModel;
import model.UserRegist;

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

    /**
     * @see HttpServlet#HttpServlet()
     */
    public UserCnt() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//リクエストパラメータの文字コードを指定
	    request.setCharacterEncoding("UTF-8");
	    //リクエストパラメータの取得
	    String user_name=request.getParameter("user_name");
	    System.out.println("user_name:"+user_name);
	    //Modelオブジェクト作成
	    UserModel user_m=new UserModel();
	    user_m.setUser_name(user_name);
	    //DAOのメソッドを使いDBに登録
	    UserRegist u=new UserRegist();
	    boolean res=u.user_create(user_m);
	    //リクエストスコープに保存(ユーザ名を表示するため)
	    request.setAttribute("user_m", user_m);
	    //DBへの保存結果でOK、又はNGのポップアップ表示
	    if(res==true) {
	    	//OK画面へフォワード
	    	 RequestDispatcher dispatcher=request.getRequestDispatcher("/view/OK.jsp");
		      dispatcher.forward(request, response);
	    }else {
	    	//NG画面へフォワード
	    	 RequestDispatcher dispatcher=request.getRequestDispatcher("/view/NG.jsp");
		      dispatcher.forward(request, response);
	    }
	}
}


UserCnt2.java(コントローラ)
「ユーザー管理画面」からのget受信処理
「ユーザー一覧画面」からのpost受信処理

package controller;

import java.io.IOException;
import java.util.ArrayList;
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 model.UserModel;
import model.UserRegist;

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

    /**
     * @see HttpServlet#HttpServlet()
     */
    public UserCnt2() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//DAOのインスタンス作成
		UserRegist s=new UserRegist();
		//DBの参照結果のArrayListオブジェクト作成
		ArrayList<UserModel> userlist=s.user_listget();
        //DBの参照結果をリクエストスコープに保存
        request.setAttribute("userlist", userlist);
  	    //ユーザー一覧画面にフォワード
  		RequestDispatcher dispatcher=request.getRequestDispatcher("/view/UserList.jsp");
        dispatcher.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
	    //リクエストパラメータの文字コードを指定
	    request.setCharacterEncoding("UTF-8");
	    //リクエストパラメータの取得
	    String button1=request.getParameter("ref");
	    String button2=request.getParameter("del");
	    //変更釦、又は削除釦の処理
	    if(button1==null && button2==null) {
	    	System.out.println("変更釦、削除釦の対象:NULL");
	    }else {
		    if(button1==null){
		    	System.out.println("変更釦の対象:NULL");
		    }else{
		    	System.out.println("変更釦の対象id:"+button1);
				UserRegist s=new UserRegist();
				int key=Integer.parseInt(button1);
				UserModel user_m=s.ref(key);//戻り値
				System.out.println("戻り値:"+user_m);
				System.out.println(user_m.getUser_id());
		      	System.out.println(user_m.getUser_name());

			      //リクエストスコープに保存
				  request.setAttribute("user_m", user_m);
			      //変更画面にフォワードする
			      RequestDispatcher dispatcher=request.getRequestDispatcher("/view/UserUpdate.jsp");
			      dispatcher.forward(request, response);
		    }

		    if(button2==null){
		    	System.out.println("削除釦の対象:NULL");
		    }else{
		    	System.out.println("削除釦の対象id:"+button2);

		   	//指定されたレコードの削除
		    	UserRegist s=new UserRegist();
		    	int key=Integer.parseInt(button2);

		    	//レコード削除メソッド
				boolean res=s.user_del(key);//戻り値boolean

				UserModel user_m=new UserModel();
				user_m.setUser_id(key);
				if(res==true) {
					//削除処理成功画面にフォワードする
					request.setAttribute("user_m", user_m);
				    RequestDispatcher dispatcher=request.getRequestDispatcher("/view/DelOK.jsp");
				    dispatcher.forward(request, response);
				}else {
					System.out.println("レコードの削除失敗");
					//削除処理失敗画面にフォワードする
				    RequestDispatcher dispatcher=request.getRequestDispatcher("/view/DelNG.jsp");
				    dispatcher.forward(request, response);
				}
		    }
	    }
	}
}

UserCnt3.java(コントローラ)
「ユーザー変更画面」からのpost受信処理

package controller;

import java.io.IOException;
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 model.UserModel;
import model.UserRegist;

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

    /**
     * @see HttpServlet#HttpServlet()
     */
    public UserCnt3() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		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 {
		//リクエストパラメータの文字コードを指定
	    request.setCharacterEncoding("UTF-8");
	    //リクエストパラメータの取得
	    String user_id=request.getParameter("user_id");
	    String user_name=request.getParameter("user_name");
	    //UserModelクラスのインスタンスに保存
	    UserModel user_m=new UserModel();
	    int id = Integer.parseInt(user_id);
	    user_m.setUser_id(id);
	    user_m.setUser_name(user_name);
	    //InfoRegistクラスのメソッドにDBに保存する値を値参照渡し
	    UserRegist u=new UserRegist();
	    boolean res=u.user_update(user_m);
	    //リクエストスコープに保存
	    request.setAttribute("user_m", user_m);
	    //DBに保存OK、又はNGのポップアップ表示
	    if(res==true) {
	    	//OK画面へフォワード
	    	 RequestDispatcher dispatcher=request.getRequestDispatcher("/view/OK.jsp");
		      dispatcher.forward(request, response);
	    }else {
	    	//NG画面へフォワード
	    	 RequestDispatcher dispatcher=request.getRequestDispatcher("/view/NG.jsp");
		      dispatcher.forward(request, response);
	    }
	}
}

UserModel.java(データモデル)

package model;

import java.io.Serializable;

public class UserModel implements Serializable {
	private int user_id;
	private String user_name;
	//コンストラクタ
	public UserModel(int user_id, String user_name) {
		super();
		this.user_id = user_id;
		this.user_name = user_name;
	}
	public UserModel(String user_name) {
		super();
		this.user_name = user_name;
	}
	public UserModel() {
		super();
	}
	//ゲッターセッター
	public int getUser_id() {
		return user_id;
	}
	public void setUser_id(int user_id) {
		this.user_id = user_id;
	}
	public String getUser_name() {
		return user_name;
	}
	public void setUser_name(String user_name) {
		this.user_name = user_name;
	}
}


UserRegist.java(DAOパターン)

package model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

public class UserRegist {
    static final String URL ="jdbc:mysql://localhost:3306/crud_sample?characterEncoding=UTF-8&serverTimezone=JST";
	static final String USERNAME ="root";
	static final String PASSWORD ="";

	public boolean user_create(UserModel user_m) {
	    try {
	        // MySQLのドライバを指定
	    	Class.forName("com.mysql.cj.jdbc.Driver");
            // MySQLデータベースに接続 (DB名,ID,パスワードを指定)
	    	Connection connection = DriverManager.getConnection(URL, USERNAME,PASSWORD);
	    	System.out.println("DB接続OK");
			String str1=user_m.getUser_name();
            // ステートメントを作成
            Statement stmt = connection.createStatement();
            String str="INSERT INTO tbl_user(user_name) VALUES('" + str1 + "')";
            //sql実行
            stmt.executeUpdate(str);
            // ステートメントをクローズ
            stmt.close();
            // 接続をクローズ
            connection.close();
        }
        catch (Exception e) {
            e.printStackTrace();
            return false;
        }
	    return true;
		}

	public  ArrayList<UserModel> user_listget() {
		//DBに登録してある一覧を検索して、List<String>に保存する
		int id=0;
		String user_name="";
        ArrayList<UserModel> userlist = new ArrayList<UserModel>();
        try {
	        //MySQLのドライバを指定
	    	Class.forName("com.mysql.cj.jdbc.Driver");
            // MySQLデータベースに接続 (DB名,ID,パスワードを指定)
            Connection connection = DriverManager.getConnection(URL, USERNAME,PASSWORD);
            System.out.println("DB接続OK");
            //DBに登録したデータから一覧の項目を取得する
			String sql="SELECT user_id,user_name FROM tbl_user";
            PreparedStatement pstmt=connection.prepareStatement(sql);
            ResultSet rs=pstmt.executeQuery();
            while(rs.next()) {
            	id=rs.getInt("user_id");
            	user_name=rs.getString("user_name");
            	//DBから取得したデータをリストに保存
        	    UserModel user_m=new UserModel(id,user_name);
        	    userlist.add(user_m);//※java.lang.NullPointerExceptionが発生
            }
            // ステートメントをクローズ
			rs.close();
            // 接続をクローズ
            connection.close();
	    }
        catch (Exception e) {
            e.printStackTrace();
        }
	   	return userlist;
	}


	//指定された1レコードを取得
	public UserModel ref(int key_id) {
		//DBを検索して、該当する1レコードをインスタンスに保存する
		UserModel user_m=new UserModel();
		int id=0;//
		String user_name="";
        try {
	        //MySQLのドライバを指定
	    	Class.forName("com.mysql.cj.jdbc.Driver");
            // MySQLデータベースに接続 (DB名,ID,パスワードを指定)
            Connection connection = DriverManager.getConnection(URL, USERNAME,PASSWORD);
            System.out.println("DB接続OK");
            //DBに登録したデータから一覧の項目を取得する
 			String sql="SELECT * FROM tbl_user WHERE user_id=?";
			PreparedStatement pstmt=connection.prepareStatement(sql);
			//key_idをintからStringに変換
			String key_ids=String.valueOf(key_id);
			pstmt.setString(1,key_ids);
			ResultSet rs=pstmt.executeQuery();
			rs.next();//これが必要
			id=rs.getInt("user_id");
			System.out.println("id"+id);
            user_name=rs.getString("user_name");
            user_m.setUser_id(id);
            user_m.setUser_name(user_name);
            // ステートメントをクローズ
			rs.close();
            // 接続をクローズ
            connection.close();
	    }
        catch (Exception e) {
            e.printStackTrace();
        }
        return user_m;
	}

	public boolean user_update(UserModel user_m) {
	    try {
	        //MySQLのドライバを指定
	    	Class.forName("com.mysql.cj.jdbc.Driver");
            // MySQLデータベースに接続 (DB名,ID,パスワードを指定)
	    	System.out.println("DB接続開始");
	    	Connection connection = DriverManager.getConnection(URL, USERNAME,PASSWORD);
	    	System.out.println("DB接続OK");
			String str1=user_m.getUser_name();
			int id=user_m.getUser_id();
            String sql="UPDATE tbl_user SET user_name=? WHERE user_id=?";
            PreparedStatement pstmt=connection.prepareStatement(sql);
            //key_idをintからStringに変換
			String key_ids=String.valueOf(id);
			pstmt.setString(1, str1);
			pstmt.setString(2, key_ids);
			pstmt.executeUpdate();
            // ステートメントをクローズ
            pstmt.close();
            // 接続をクローズ
            connection.close();
        }
        catch (Exception e) {
            e.printStackTrace();
            return false;
        }
	    return true;
		}

		//指定された1レコードを削除
		public boolean user_del(int key_id) {
		    try {
		        // 先程インストールしたMySQLのドライバを指定
		    	Class.forName("com.mysql.cj.jdbc.Driver");
		        // MySQLデータベースに接続 (DB名,ID,パスワードを指定)
		        Connection connection = DriverManager.getConnection(URL, USERNAME,PASSWORD);
		        System.out.println("DB接続OK");
		        //DBに登録したデータから一覧の項目を取得する
				//String sql="DELETE FROM tbl_info_sum WHERE id=?";
				String sql="DELETE FROM tbl_user WHERE user_id=?";//削除フラグの追加
				PreparedStatement pstmt=connection.prepareStatement(sql);
				//key_idをintからStringに変換
				String key_ids=String.valueOf(key_id);
				pstmt.setString(1,key_ids);
		        int line=pstmt.executeUpdate();
		        System.out.println("id="+key_ids+"を"+line+"行削除しました");
		    }catch (Exception e) {
		        e.printStackTrace();
		        return false;
	        }
		    return true;
		}
}

(4)データベースとテーブル作成
データベース作成
・データベースの作成
CREATE DATABASE crud_sample;
・DB接続
USE crud_sample;

・テーブル作成CREATE TABLE tbl_user(user_id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,user_name VARCHAR(100));

5.実行

(1)XAMPPのMySQLサーバを起動する

(2)アプリケーションを選択して、実行ボタン▷を押す

(3)ブラウザからWebサーバに接続http://localhost:8080/Crud_sample/

「ユーザー登録」ボタン押下

名前:テストネームを入力し、「登録」ボタン押下

「ユーザー管理」画面で「ユーザー一覧」ボタン押下

ID:47の「変更」ボタン押下

ID:47の「削除」ボタン押下

The subject ends herewith.