今回の記事ではサーブレットとjspでデータベースにデータを登録する方法について、解説していきます。
jspのフォームからデータを送信し、受け取ったデータをデータベースに登録します。
利用しているデータベースはPostgreSQLです。
挫折せずにプログラミングを学ぶために必要なこと
僕はプログラミングで挫折した経験があります。
それは周りに聞ける人がいなく、一人でエラーと戦っていたからです。
Freeksは月額10,780円という破格の値段で、現役エンジニアに質問する環境を手に入れることができるプログラミングスクールです。
次のような悩みを少しでも抱えていたら、まずは無料カウンセリングを受けてみてください。
申込みは1分でできます。学習する環境にお金を使うというのは良い自己投資になります。
>>Freeksの無料カウンセリングはこちら
今回作成するもの
今回データを登録するテーブルは次のように本のタイトルと値段を管理するテーブルです。
id | title(タイトル) | price(値段) |
本の一覧を表示している画面から、新規で本を登録することが出来ます。
入力して、「登録」ボタンを押すと本が登録されます。
一覧画面が再表示され、登録した本が新しく表示されます。
一覧表示についてはこちらの記事を参考にしてみてください。
books.jsp(パラメータを送信)
最初に入力する画面であるbooks.jspを作成します。
books.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.List" %>
<%@ page import="model.dao.dto.Book" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>本の一覧を表示する</title>
</head>
<body>
<% List<Book> books = (List<Book>)request.getAttribute("books"); %>
<p>テーブルに保存されている本のタイトル一覧</p>
<table>
<tr>
<td>id</td>
<td>タイトル</td>
<td>値段</td>
</tr>
<% for(Book book: books) { %>
<tr>
<td><%= book.getId() %></td>
<td><%= book.getTitle() %></td>
<td><%= book.getPrice() %></td>
</tr>
<% } %>
</table>
<p>本を登録する</p>
<form action="insert" method="POST">
<label>タイトル</label><input type="text" name="title"><br>
<label>値段</label><input type="number" name="price"><br>
<input type="submit" value="登録">
</form>
</body>
</html>
今回大切になるのは、画面下の方の「form」の箇所です。
<form action="insert" method="POST">
<label>タイトル</label><input type="text" name="title"><br>
<label>値段</label><input type="number" name="price"><br>
<input type="submit" value="登録">
</form>
このformはactionとして「insert」に値を送信します。
送信するのは本のタイトルと値段です。
InsertServlet.java
次に画面から送信されてきたパラメータを受け取って、データベースに登録する「InsertServlet.java」です。
先ほどの画面のフォームはpostメソッドでパラメータが送信されてくるので、doPostメソッドを作成します。
InsertServlet.java
package uhablog;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.dao.InsertBookDao;
@WebServlet("/insert")
public class InsertServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* データベースにデータを登録する
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8"); // 文字化け防止
// フォームの値を受け取る
String title = request.getParameter("title");
int price = Integer.parseInt(request.getParameter("price"));
// データベースに登録する
InsertBookDao dao = new InsertBookDao();
try {
int result = dao.insertBook(title, price);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
// 一覧画面にリダイレクトする
response.sendRedirect("/BlogApplication/books-list");
}
}
パラメータの受け取り
// フォームの値を受け取る
String title = request.getParameter("title");
int price = Integer.parseInt(request.getParameter("price"));
画面から送られてくる本のタイトルと、値段を取得しています。
画面から送られてくるパラメータは全てString型です。
タイトルはそのままString型として受け取れば問題ありません。
しかし、値段はint型に変換する必要があります。
そのためInteger.parseIntメソッドを使って、文字列をint型に変換しています。
データベースへの登録
// データベースに登録する
InsertBookDao dao = new InsertBookDao();
try {
int result = dao.insertBook(title, price);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
こちらでは受け取ったパラメータをもとにデータベースに登録しています。
ここで使っているInsertBookDaoとそのメソッドであるinsertBookはこの後詳しく解説します。
一覧画面にリダイレクト
// 一覧画面にリダイレクトする
response.sendRedirect("/BlogApplication/books-list");
登録後に一覧画面にリダイレクトしています。
リダイレクトすることで、データベースから本を再取得することが出来ます。
それによって登録した新しい本も一覧に表示することが出来ます。
InsertBookDao.java
次にInsertBookDaoeです。
この「InsertBookDao」でSQLを実行して、データベースにデータを登録します。
package model.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class InsertBookDao {
// データベースのURL
private static final String URL = "jdbc:postgresql://localhost:5432/BlogDB";
// データベースにアクセスするユーザー
private static final String USER = "uhablog";
// データベースにアクセスするユーザーのパスワード
private static final String PASSWORD = "P@ssword";
/**
* データベースの接続を取得する
* @return
* @throws SQLException
*/
public static Connection getConnection() throws ClassNotFoundException, SQLException{
Class.forName("org.postgresql.Driver");
return DriverManager.getConnection(URL, USER, PASSWORD);
}
/**
* データベースにデータを登録する
* @param title
* @param price
* @return
* @throws ClassNotFoundException
* @throws SQLException
*/
public int insertBook(String title, int price) throws ClassNotFoundException, SQLException {
// 登録した行数を保持する変数
int result = 0;
// 実行するSQL
String sql = "INSERT INTO BooksInfo(title, price) values(?, ?);";
// DBに接続する
try (Connection con = getConnection();
PreparedStatement pstmt = con.prepareStatement(sql);) {
// パラメータの設定
pstmt.setString(1, title);
pstmt.setInt(2, price);
// SQLの実行
result = pstmt.executeUpdate();
}
return result;
}
}
データベースへの接続
// データベースのURL
private static final String URL = "jdbc:postgresql://localhost:5432/BlogDB";
// データベースにアクセスするユーザー
private static final String USER = "uhablog";
// データベースにアクセスするユーザーのパスワード
private static final String PASSWORD = "P@ssword";
/**
* データベースの接続を取得する
* @return
* @throws SQLException
*/
public static Connection getConnection() throws ClassNotFoundException, SQLException{
Class.forName("org.postgresql.Driver");
return DriverManager.getConnection(URL, USER, PASSWORD);
}
データベースへの接続を取得するためのフィールドとメソッドです。
フィールドとして、URL、ユーザー名、ユーザーのパスワードを保持しています。
getConnectionメソッドで、先ほどのフィールドを利用して接続を取得し、返却しています。
insertBookメソッド
/**
* データベースにデータを登録する
* @param title
* @param price
* @return
* @throws ClassNotFoundException
* @throws SQLException
*/
public int insertBook(String title, int price) throws ClassNotFoundException, SQLException {
// 登録した行数を保持する変数
int result = 0;
// 実行するSQL
String sql = "INSERT INTO BooksInfo(title, price) values(?, ?);";
// DBに接続する
try (Connection con = getConnection();
PreparedStatement pstmt = con.prepareStatement(sql);) {
// パラメータの設定
pstmt.setString(1, title);
pstmt.setInt(2, price);
// SQLの実行
result = pstmt.executeUpdate();
}
return result;
}
このメソッドでSQLを実行し、本をデータベースに登録します。
準備
// 登録した行数を保持する変数
int result = 0;
// 実行するSQL
String sql = "INSERT INTO BooksInfo(title, price) values(?, ?);";
データベースに対して、新規登録や更新、削除などの処理を行うと、変更があった行数がint型で返却されます。
そのため、その行数を保持するための変数を宣言しています。
また実行するSQLをString型の変数に格納しています。
実際に登録するタイトルや値段は後から設定するため、この時点では「?」としておきます。
DBへの接続
// DBに接続する
try (Connection con = getConnection();
PreparedStatement pstmt = con.prepareStatement(sql);) {
次にデータベースに接続します。
先ほどのgetConnection()メソッドを使って、DBへの接続を取得しています。
その後、その接続を使って、prepareStatementメソッドで、先ほど作成したsqlを引数として渡しています。
SQLの実行
// パラメータの設定
pstmt.setString(1, title);
pstmt.setInt(2, price);
// SQLの実行
result = pstmt.executeUpdate();
こちらでSQLの実行をしています。
まず、pstmtに対してsetXXXXを使って、パラメータを設定しています。
先ほどString型の変数にsqlを記述した際、「?」を使っていた箇所があります。
ここに対して、値を設定しています。
String型の値を設定する場合はsetStringメソッドを使い、int型の値を設定する場合はsetIntメソッドを使います。
パラメータの設定を行う前のSQLは次のようになっていました。
INSERT INTO BooksInfo(title, price) values(?, ?);
パラメータの設定を行うことで次のようになります。
INSERT INTO BooksInfo(title, price) values(引数titleに設定されている値, 引数priceに設定されている値);
そしてパラメータの設定を行なったSQLを実行しているのが次の箇所です。
// SQLの実行
result = pstmt.executeUpdate();
ここまで完成したら、完成です。
サーバーを起動し、動作確認してみましょう。
挫折せずにプログラミングを学ぶためには?
挫折せずにプログラミングを学ぶために必要なこと
僕はプログラミングで挫折した経験があります。
それは周りに聞ける人がいなく、一人でエラーと戦っていたからです。
Freeksは月額10,780円という破格の値段で、現役エンジニアに質問する環境を手に入れることができるプログラミングスクールです。
次のような悩みを少しでも抱えていたら、まずは無料カウンセリングを受けてみてください。
申込みは1分でできます。学習する環境にお金を使うというのは良い自己投資になります。
>>Freeksの無料カウンセリングはこちら
【関連記事】Freeks評判、口コミ