【Javaサーブレット&jsp入門#4】Todoをデータベースに追加する

Java

今回の記事はこちらの記事の続きとなっております。サーブレットとjspを使ってTodoWebアプリを作成しています。今回は画面でTodoを入力してデータベースに登録を行うTodoの新規作成機能を作ります。

その他の機能はこちらにまとめています。
ご質問等あればこちらのTwitterアカウントまでお願いします。

InsertDAOの作成

まずはデータベースに登録処理を行うInsertDAOを作成します。model.daoパッケージ内にInsertDAO.javaを作成します。以下がそのコードになります。データベースに登録処理を行うinsertTodoメソッドを作ります。一つづつ解説していきます。

こちらの記事でもJavaを使ってInsertを実行する方法を詳しく解説しています。

package model.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import model.DBConnection;

/**
 * Todoをデータベースに登録するクラス
 * @author yuhablog
 */
public class InsertDAO {

	/**
	 * Todoをデータベースに登録する
	 *
	 * @param todoの内容
	 * @param 期限
	 * @return 登録数
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public int insertTodo(String todo, Date timeLimit)throws ClassNotFoundException, SQLException {
		// 更新した行数を返却するための変数
		int processingNumber = 0;

		// 実行するSQL
		String sql = "INSERT INTO todo (todo, timeLimit) VALUES (?, ?)";

		// SQLを実行する
		try(Connection con = DBConnection.getConnection();
				PreparedStatement pstmt = con.prepareStatement(sql)) {
			// パラメータに値を設定する
			// 1つ目のパラメータにtodoの内容を設定
			pstmt.setString(1, todo);
			// 2つ目のパラメータにtimeLimitの内容を設定
			pstmt.setDate(2, timeLimit);
			// SQLを実行し、実行行数を受け取る
			processingNumber = pstmt.executeUpdate();
		}
		return processingNumber;
	}
}

insertTodoメソッドについて解説します。こちらのメソッドは追加するTodoの内容と、期限を引数として受け取ります。戻り値はデータベースに登録された実行行数をint型で返却します。

public int insertTodo(String todo, Date timeLimit)throws ClassNotFoundException, SQLException

次にinsertTodoメソッドの内部の処理についてです。まずはSQLの準備をしています。文字列内の「?」に後から受け取った引数を当てはめます。SQLの内容としてはtodoテーブルのtodoカラムとtimeLimitカラムに新規でデータを登録します。

// 実行するSQL
String sql = "INSERT INTO todo (todo, timeLimit) VALUES (?, ?)";

次に実際にSQLを実行してデータベースに登録処理を行う部分です。引数で受け取った値をパラメータに設定しています。todoはString型で受け取るので、setStringメソッドを使用しています。timeLimitはjava.sql.Date型なのでsetDateを使用しています。これを行った後のSQLは「INSERT INTO todo (todo, timeLimit) VALUES (todo, timeLimit)」このようになります。ただし実際には引数で受け取った値がVALUESの後の()の中に入っています。

// SQLを実行する
try(Connection con = DBConnection.getConnection();
	PreparedStatement pstmt = con.prepareStatement(sql)) {
	// パラメータに値を設定する
	// 1つ目のパラメータにtodoの内容を設定
	pstmt.setString(1, todo);
	// 2つ目のパラメータにtimeLimitの内容を設定
	pstmt.setDate(2, timeLimit);
	// SQLを実行し、実行行数を受け取る
	processingNumber = pstmt.executeUpdate();
}

InsertServletの作成

次にservletパッケージ内にInsertServletを作成します。今回はとりあえずPOSTメソッドのリクエストを受け付けて処理を行うdoPostメソッドを作成します。内容としてはクライアントから受け取ったリクエストパラメータを使って先ほど作成したInsertDAOを使ってデータベースにTodoの新規登録処理をします。

/**
  * Todoをデータベースに登録するためのサーブレット
  */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	request.setCharacterEncoding("UTF-8");
	// リクエストパラメータのname属性がtodoの値を受け取る
	String todo = (String) request.getParameter("todo");
	// リクエストパラメータのname属性がtimeLimitの値を受け取る
	Date timeLimit = Date.valueOf(request.getParameter("timeLimit"));

	// DAOを生成し、Todoをデータベースに登録する
	InsertDAO dao = new InsertDAO();
	try {
		// 受け取ったパラメータを引数に渡す
		dao.insertTodo(todo, timeLimit);

	}catch(SQLException | ClassNotFoundException e) {
		e.printStackTrace();
	}

	response.sendRedirect("list-servlet");
}

まず送られてきたリクエストパラメータを受け取って変数に格納します。具体的にはtodoの内容と期限を受け取っています。なおリクエストパラメータはString型で送られてくるため、期限はDate.valueOfメソッドを使ってDate型に変換しています。

// リクエストパラメータのname属性がtodoの値を受け取る
String todo = (String) request.getParameter("todo");
// リクエストパラメータのname属性がtimeLimitの値を受け取る
Date timeLimit = Date.valueOf(request.getParameter("timeLimit"));

次に最初に作成したInsertDAOを使ってデータベースに登録処理を行います。InsertDAOのinsertTodoメソッドに先ほど受け取ったパラメータを引数として渡しています。

// DAOを生成し、Todoをデータベースに登録する
InsertDAO dao = new InsertDAO();
try {
	// 受け取ったパラメータを引数に渡す
	dao.insertTodo(todo, timeLimit);

}catch(SQLException | ClassNotFoundException e) {
	e.printStackTrace();
}

最後に一覧画面を表示するサーブレットにリダイレクトしています。フォワードでなく、リダイレクト にすることでフォームの再送信を防ぎ、同じ内容のTodoが登録されてしまうことを防止します。

response.sendRedirect("list-servlet");

またInsertServletのクラスの上部に以下のようにパスの設定を行ってください。

// ↓ここの設定。これで「insert-servlet」にリクエストが送られた時にInsertServletが実行される
@WebServlet("/insert-servlet")
public class InsertServlet extends HttpServlet 

list.jspにフォームを追加

最後にlist.jspにフォームを追加します。このフォームに値を入力して値をサーブレットに送ります。list.jspは既に作成されていますので、以下のコードをbodyタグ内の好きなところに追加してください。

<form action="insert-servlet" method="post">
	<label>Todo: </label><input type="text" name="todo"><br>
	<label>Limit: </label><input type="date" name="timeLimit"> <br>
	<input type="submit" value="Todoを登録する">
</form>

先ほど作成したInsertServletの中でname属性がtodoのものとtimeLimitのものを受け取るという処理を記述しました。そのためこちらのフォームでもそれに対応したname属性がtodoとtimeLimitのものを準備します。さらにフォームをサーブレットに送信するためのsubmitボタンを配置しています。

フォーム自体の設定としてaction属性をinsert-servletにしています。これによってInsertServletにフォームが送られます。またメソッドをpostにしておくことで、InsertServlet内のdoPostメソッドが実行されます。

動作確認

動作確認をします。まずListServletをサーバーで実行してTodo一覧画面を表示します。狂おしいほどデザインが絶望的な点お許しください。

一番下のフォームに入力してTodoを登録するボタンをクリックします。

入力したTodoが新しく一覧に追加されていたら、成功です!お疲れ様でした。

独学が不安、何を勉強したら良いかわからないという方はテックアカデミーの無料メンター相談を検討してみてください!
独学での勉強方針やキャリアプランなどについて現役のプロに相談することができます。
詳しくはコチラの記事を参考にしてみてください。

次回予告

次はパラメータ名をstatic変数で定義したクラスを準備することにしました。
従って今まで作ったところに多少変更が入ります。ただ変更しなくても動くはずです。

その後はTodoの編集・削除を行えるようにしようと考えています。
さらにその後は何しようか考え中です。ログイン機能を追加したり他の機能を追加したりするか、全く別のことやろうか、どうしようか

ご質問等あればこちらのTwitterアカウントまでお願いします。

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