【Java: Todoアプリ作成】Todoをデータベースに追加する

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

その他の機能はこちらにまとめています。

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

Java x MySQLでWebアプリの作り方が学べるUdemy講座

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は既に作成されていますので、以下のコードを好きなところに追加してください。

<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変数で定義したクラスを準備することにしました。従って今まで作ったところに多少変更が入ります。ただ変更しなくても動くはずです。 デザインはお好きな感じでやってください笑

次の記事 -> https://uha-blog.com/java/staticvariable/

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

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

私はプログラミング学習はUdemyで行うのが以下のような理由で圧倒的におすすめです。

  • 動画で好きなときに学べる
  • 一流のエンジニアから教えてもらえる
  • 好きな技術を体系的に学べる
  • 実際に手を動かしながら学ぶことができる
  • セール時であれば1500円〜2000円ほどで購入できる(大半の技術書より安い)
  • 講座自体がアップデートされていくので情報が古くなりにくい

UdemyにはJava x MySQLでWebアプリの作り方が学べるUdemy講座 もあるので興味がある方は一度チェックしてみてください!なおUdemyは頻繁にセールをやっているので、セール時を狙って購入してください!

おすすめの参考書はこちら!

コメント

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