Java Java Todo Webアプリ開発

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

uhablog

こんにちは、大学時代にプログラミングの勉強を始め現在はエンジニアをしているuhablogです。
当ブログでは現役エンジニアがプログラミング初学者の方向けにプログラミングの学習法を発信しています。

今回の記事はこちらの記事の続きとなっております。サーブレットとjspを使ってTodoWebアプリを作成しています。

今回は画面でTodoを入力してデータベースに登録を行うTodoの新規作成機能を作ります。

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

\\一流講師に学ぼう!!//

Udemyでサーブレット&jspを学ぶ!!

返金保証付き

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が新しく一覧に追加されていたら、成功です!お疲れ様でした。

次回予告

次の記事はこちら!

プログラミング学習はUdemyがおすすめ

私はプログラミングの学習はUdemyで行うのが一番おすすめです。
Udemyでは動画講座でプログラミングなどのスキルを身につけることができます。
現役エンジニアがUdemyをオススメする理由は
・動画で好きなときに学べる
・一流の講師に学ぶことができる
・講師の方に質問ができる
・返金保証もある
・セールを頻繁に開催している
といったたくさんの理由があります。

現在Udemyではセールを開催しています!
通常時1万円から2万円前後の価格で講座が販売されていますが、セール時には1500円前後(ランチ代くらい)で一つの講座を購入することができます。
UdemyにはサーブレットでWebアプリ開発が学べる講座iconもあるので、JavaでWebアプリ開発する方法を学んでみたい!という方は今がチャンスです!

\\今ならセール開催中!//

Udemyでサーブレット&jspを学ぶ!!

返金保証付き

独学が不安な人へ

独学で学んでいく意志がある方にはUdemyなどで学習するのがおすすめですが、プログラミングを独学するにはそれなりにハードルがあります。

  • プログラミングで一度挫折した経験がある
  • 一人で学習する自信がないので、サポートが欲しい

という方にはプログラミングスクールを検討してみるのがおすすめです。

-Java, Java Todo Webアプリ開発
-, , , , ,