
こんにちは、大学時代にプログラミングを始め、現在はエンジニアをしているuhablog(ウハブログ)です。
今回の記事はこちらの記事の続きとなっております。サーブレットとjspを使ってTodoWebアプリを作成しています。
今回は画面でTodoを入力してデータベースに登録を行うTodoの新規作成機能を作ります。
その他の機能はこちらにまとめています。
挫折せずにプログラミングを学ぶために必要なこと
僕はプログラミングで挫折した経験があります。
それは周りに聞ける人がいなく、一人でエラーと戦っていたからです。
Freeksは月額10,780円という破格の値段で、現役エンジニアに質問する環境を手に入れることができるプログラミングスクールです。
次のような悩みを少しでも抱えていたら、まずは無料カウンセリングを受けてみてください。
申込みは1分でできます。学習する環境にお金を使うというのは良い自己投資になります。
>>Freeksの無料カウンセリングはこちら
InsertDAOの作成
まずはデータベースに登録処理を行うInsertDAOを作成します。
model.daoパッケージ内にInsertDAO.javaを作成し、データベースに登録処理を行うinsertTodoメソッドを作ります。
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を実行してデータベースに登録処理を行う部分です。
先ほどのSQLで「?」としていた箇所に実際に値を当てはめていきます。
それぞれの型に合わせてsetStringメソッドやsetDateメソッドを使って、「?」部分に実際にデータベースに追加する値を設定することが可能です。
// 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が新しく一覧に追加されていたら、成功です!お疲れ様でした。

次回予告
挫折せずにプログラミングを学ぶためには?
挫折せずにプログラミングを学ぶために必要なこと
僕はプログラミングで挫折した経験があります。
それは周りに聞ける人がいなく、一人でエラーと戦っていたからです。
Freeksは月額10,780円という破格の値段で、現役エンジニアに質問する環境を手に入れることができるプログラミングスクールです。
次のような悩みを少しでも抱えていたら、まずは無料カウンセリングを受けてみてください。
申込みは1分でできます。学習する環境にお金を使うというのは良い自己投資になります。
>>Freeksの無料カウンセリングはこちら
【関連記事】Freeks評判、口コミ