👻

Servlet、JSP、Java、MVCパタンにJDBCを適応したDB連携~CRUDのC(Create)例文

2023/09/21に公開

前書き

前回から続けて、WEBページとDBを連携して、WEBページで入力したデータをDBに入れる例文になる。

前回の例文で、DBのデータを出力していたページから続ける。「データ登録ページ」を出力ページに使って、そのページを押すと他の登録ページに移動して、そこでデータを入力するとDBにそのデータを追加する構成になる。

コードの前に、プログラムの流れを簡単にまとめてみよう

前回のように、プログラムを始まってから実行されるコードの順番と、書くコードがどのような役目をするかを簡単にまとめてみる。

コードまとめ

前回のまとめでも、DBに関するコードでない、基本的な構成のためのコードはまとめたので、C(Create)を直接担当していないコードには注釈を最小限に付ける。

まずは、1番最初に実行する、「HomeController.java」Servletになる。

HomeController.java

package com.inchel.Sep141.main;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/HomeController")
public class HomeController extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	//メインページである「index.jsp」でinclude方式に出力する、ページの名前「"home.jsp"」をAttributeに入れておく。
	if(!request.getParameterNames().hasMoreElements()) {
		request.setAttribute("cp", "home.jsp");
	}
	
	//メインページである「index.jsp」に移動する。
	request.getRequestDispatcher("index.jsp").forward(request, response);
		
	}

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

}


次は、メインページである「index.jsp」になる。特別な機能はなくて、このページの中に、他のページをincludeして出力する役目をするファイルである。

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

<!-- <link rel = "stylesheet" href="css/style.css"> -->

<script type = "text/javascript" src = "js/ValidCheck.js"></script>

</head>
<body>

	<header><h2> 題目 </h2></header>
	
	<main>
	<div>
	<!--各ServletでincludeするページをAttributeで送って、ここで出力する -->
	<jsp:include page = "${cp}" />
	</div>
	</main>
	
	<nav>
	//ここを押してDBを扱うページに移動する
	<div> <a href = "AppleDBController"> AppleDB </a> </div>
	</nav>
	
</body>
</html>

次は、DBを追加する前に、DBにあるデータを出力するページを担当する「AppleDBController」になる。

AppleDBController

package com.inchel.Sep141.apple;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class AppleDBController
 */
@WebServlet("/AppleDBController")
public class AppleDBController extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//データを分けるページを計算するメソッド(この例文では説明しない。)
		AppleDB.getAppledb().getPageCount(request);
		//データを分けるページを計算するメソッド(この例文では説明しない。)
		AppleDB.getAppledb().getAppleDB(request);
		
		//「index.jsp」でincludeする「appleoutput.jsp」をAttributeに入れる
		request.setAttribute("cp", "appleoutput.jsp");
		//「index.jsp」に移動
		request.getRequestDispatcher("index.jsp").forward(request, response);
	}

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

}


次は、データを出力しながら、データを追加するために過ぎるページである「appleoutput.jsp」になる。データ出力のところのコードのまとめはここでしない。

appleoutput.jsp

<%@page import="com.inchel.Sep141.apple.AppleDTO"%>
<%@page import="java.util.ArrayList"%>
<%@ taglib prefix= "c" uri= "http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix= "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<hr>
	ここは AppleDB <br>
	DB 連結結果 : ${result}<p><p>
	<%
		ArrayList<AppleDTO> aList = (ArrayList<AppleDTO>)request.getAttribute("alist");
		for(int i = 0; i < aList.size(); i++){
	%>
		<div> <a href = "AppleInfoController?getinfolocation=<%=aList.get(i).getLocation()%>"> 
		地域 : <%=aList.get(i).getLocation() %> 値段 : <%=aList.get(i).getPrice() %>
		</a>
		</div>
		 <p><p>
	<% 	
		}
	%>
	<hr>
	<jsp:include page = "pages.jsp" />
	<hr>
	<!--ここをWEBページで押すと、データを登録する新しいページに移動する -->
	<div> <a href = "appleregister.jsp"> データ登録ページに移動 </a> </div>
	<hr>
</body>
</html>

次は、DBに追加するデータを入力する「appleregister.jsp」になる。

appleregister.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h1 align = "center"> データ登録</h1><p>
	
	<!-- この<form>の中でデータを入力すると、属性に書かれたnameの名前として「AppleCreateController」Servletに送られる。 -->
	<!-- <input>ごとに設定されたnameを覚えておこう。-->
	<!-- <form>の属性に「method = "post"」があって、次のServletでは「doPost」メソッドにコードを書かないといけない。-->
	<form action = "AppleCreateController" id = "FORM" method = "post">
	地域 <input name = "inputlocation">  <br><input name = "inputcolor"> <br><input name = "inputtaste"> <br>
	値段 <input name = "inputprice"> 		   <br>
	紹介 <input name = "inputintroduce"> 	   <br>
	<button> データを登録!! </button>
	</form>
</body>
</html>

次は、「appleregister.jsp」で入力したデータを処理するメソッドを実行して、その結果と共に「appleoutput.jsp」に戻してくれる「AppleCreateController」Servletになる。このServletで使われたメソッドは、他のjavaコードになっていて他に下でまとめる。

AppleCreateController

package com.inchel.Sep141.apple;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/AppleCreateController")
public class AppleCreateController extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	}

	//送るデータがURLに見えなくするため、「doPost」メソッドにコードを書く。
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//DBにデータを追加するメソッド。下で詳しくまとめる。
		AppleDB.getAppledb().createAppleDB(request);
		//DBにデータの追加が終わると、データを分けるページを数えなおす。
		AppleDB.getAppledb().getPageCount(request);
		//ページ数に当たって、出力するデータをDBからもらう。
		AppleDB.getAppledb().getAppleDB(request);
		//実際にデータを出力するページの名前をAttributeに入れる。
		request.setAttribute("cp", "appleoutput.jsp");
		//メインページである「index.jsp」に移動
		request.getRequestDispatcher("index.jsp").forward(request, response);
	}

}


最後に、実際にDBに接続して、「appleregister.jsp」からもらったデータをDBに追加するメソッドを持っている「AppleDB.java」になる。ここにはC(Create)以外にも他の機能をするメソッドがいっぱいあるが、この例文ではデータ追加を担当するコードだけをまとめる。

ここのメソッドが「AppleCreateController」Servletでうまく実行されたなら、DBにデータが追加され、また「appleoutput.jsp」に戻って追加されたデータの確認ができる。

AppleDB.java

package com.inchel.Sep141.apple;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;

import com.inchel.db.manager.InchelDBManager;

public class AppleDB {
	public void createAppleDB(HttpServletRequest request) {
		//DBに接続するためのインスタンス
		Connection con = null;
		//DBにデータを入れるためのインスタンス
		PreparedStatement pstmt = null;
		//DBに関する作業をするには、try-catch文を使うべき。規則である。
		try {
		//DBPoolを通じて、DBに接続する。
		con = InchelDBManager.connect("inchelPool");
		//DBに要請するSQL文を作成する。
		//SQL文の内容:「まだ決まってない「?」5個のデータをDBにあるテーブルに追加する。」
		String sql = "INSERT INTO sep14_apple VALUES(?, ?, ?, ?, ?)";
		//SQL文を書いて、DBに伝送するためのコード
		pstmt = con.prepareStatement(sql);
		
		//このメソッドを呼び出すServletで「doPost」メソッドを使っているなら、下のコードを書くべき。
		//伝送するデータをUTF-8に変換する。
		request.setCharacterEncoding("UTF-8");
		//上のSQL文にあった「?」に、数字順にデータを代入する。
		//SQL文に、入力された地域のnameの名前を設定
		pstmt.setString(1, request.getParameter("inputlocation"));
		//SQL文に、入力された色のnameの名前を設定
		pstmt.setString(2, request.getParameter("inputcolor"));
		//SQL文に、入力された味のnameの名前を設定
		pstmt.setString(3, request.getParameter("inputtaste"));
		//SQL文に、入力された値段のnameの名前を設定。これはint系であるので追加に変換する。
		pstmt.setInt(4, Integer.parseInt(request.getParameter("inputprice")));
		//紹介文の場合、改行をしておいた可能性がある。
		//だから、「String.replace」メソッドを通じてjava上の改行コードをhtml上の改行コードに変換して代入する。
	pstmt.setString(5,request.getParameter("inputintroduce").replace("\r\n", "<br>"));
		//pstmt.executeUpdate()メソッドで上のSQL文をDBに伝送する。
		//そして、その結果によって変化があったデータの数が「1」であったら。
		//つまり、上のSQL文がDBにうまく届いて、DBにデータが1個増えたならif文を実行する。
		if(pstmt.executeUpdate() == 1) {
			//追加が成功したlogをconsoleに出よくする。(伝送結果確認用)
			System.out.println("DBにうまくデータが追加されました。");
		}
		
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		try {
			pstmt.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		try {
			con.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

}


以上で、DBにデータを追加するコードをまとめてみた。つぎは、DBにもう入っているデータを修正する、CRUDのU(Update)のコードをまとめる。

Discussion