Servlet、JSP、Java、MVCパタンにJDBCを適応したDB連携~CRUDのC(Create)例文
前書き
前回から続けて、WEBページとDBを連携して、WEBページで入力したデータをDBに入れる例文になる。
前回の例文で、DBのデータを出力していたページから続ける。「データ登録ページ」を出力ページに使って、そのページを押すと他の登録ページに移動して、そこでデータを入力するとDBにそのデータを追加する構成になる。
コードの前に、プログラムの流れを簡単にまとめてみよう
前回のように、プログラムを始まってから実行されるコードの順番と、書くコードがどのような役目をするかを簡単にまとめてみる。
コードまとめ
前回のまとめでも、DBに関するコードでない、基本的な構成のためのコードはまとめたので、C(Create)を直接担当していないコードには注釈を最小限に付ける。
まずは、1番最初に実行する、「HomeController.java」Servletになる。
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して出力する役目をするファイルである。
<%@ 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」になる。
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」になる。データ出力のところのコードのまとめはここでしない。
<%@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」になる。
<%@ 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コードになっていて他に下でまとめる。
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」に戻って追加されたデータの確認ができる。
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