JavaBeansを使ってみる
MVCでの、Modelを扱う方法を見てみましょう。モデルでは、データの処理などを担当します。データベースからデータを取得したり、データベースにデータを保存したり、更新したりします。Modelでのプログラム構成は様々ですが、データベースにアクセスするためのクラスとして「DAO(Database Access Object)」クラスを、取得したデータを扱うクラスとして「Bean」クラスを使うことがあります。
Beanクラスを作る際、次のルールでクラスを定義します。
- クラスはpublicを指定する
- カプセル化する
- アクセサーメソッドを準備する
- java.io.Serializableを実装する
- publicで引数なしのコンストラクターを定義する
- クラス名の最後はBeanにする
今回は、指定したIDの書籍データを画面に表示するサンプルを作成してみましょう。
○ ファイル
まず、Beanクラスを作成しましょう。booksテーブルのデータ1件分を扱うクラスを作成します。プロジェクトに次のようなクラスを追加してください。
パッケージ名 | test.bean |
---|---|
クラス名 | Book |
スーパークラス名 | java.io.Serializable |
○ プログラム
次のようにプログラムを入力してください。
Book.java
- package test.bean;
- import java.io.Serializable;
- public class Book implements Serializable {
- //フィールド
- private int id;
- private int categoryId;
- private String bookName;
- private String author;
- private String publish;
- private String isbn;
- private int price;
- private boolean rentalState;
- //コンストラクター
- public Book() {}
- public Book(int id, int categoryId, String bookName, String author, String publish, String isbn, int price, boolean rentalState) {
- this.id = id;
- this.categoryId = categoryId;
- this.bookName = bookName;
- this.author = author;
- this.publish = publish;
- this.isbn = isbn;
- this.price = price;
- this.rentalState = rentalState;
- }
- //メソッド
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public int getCategoryId() {
- return categoryId;
- }
- public void setCategoryId(int categoryId) {
- this.categoryId = categoryId;
- }
- public String getBookName() {
- return bookName;
- }
- public void setBookName(String bookName) {
- this.bookName = bookName;
- }
- public String getAuthor() {
- return author;
- }
- public void setAuthor(String author) {
- this.author = author;
- }
- public String getPublish() {
- return publish;
- }
- public void setPublish(String publish) {
- this.publish = publish;
- }
- public String getIsbn() {
- return isbn;
- }
- public void setIsbn(String isbn) {
- this.isbn = isbn;
- }
- public int getPrice() {
- return price;
- }
- public void setPrice(int price) {
- this.price = price;
- }
- public boolean isRentalState() {
- return rentalState;
- }
- public void setRentalState(boolean rentalState) {
- this.rentalState = rentalState;
- }
- }
○ ファイル
次に、データベースにアクセスして、データを取得するクラスを作成しましょう。プロジェクトに次のようなクラスを追加してください。
パッケージ名 | test.data |
---|---|
クラス名 | BooksDataAccess |
○ プログラム
次のようにプログラムを入力してください。
BooksDataAccess.java
- package test.data;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import test.bean.Book;
- public class BooksDataAccess {
- //フィールド
- private static final String DRIVER = "com.mysql.jdbc.Driver";
- private static final String URL = "jdbc:mysql://localhost:3306/books?characterEncoding=utf8";
- private static final String USER = "root";
- private static final String PASSWORD = "";
- private Connection con;
- //コンストラクター
- public BooksDataAccess() throws SQLException, ClassNotFoundException {
- //データベースに接続する
- Class.forName(DRIVER);
- con = DriverManager.getConnection(URL, USER, PASSWORD);
- }
- //メソッド
- public Book getBook(int id) throws SQLException {
- //SQL文を生成
- String sql = "SELECT * FROM books WHERE id=?";
- //PreparedStatementオブジェクトを生成
- PreparedStatement pst = con.prepareStatement(sql);
- //パラメーターをセットする
- pst.setInt(1, id);
- //SQL文を実行
- ResultSet rs = pst.executeQuery();
- //結果を格納するBookオブジェクトを用意
- Book book = null;
- //結果を取得する
- if(rs.next()){
- book = new Book(
- rs.getInt("id"),
- rs.getInt("category_id"),
- rs.getString("book_name"),
- rs.getString("author"),
- rs.getString("publish"),
- rs.getString("isbn"),
- rs.getInt("price"),
- rs.getInt("rental_state") == 1 ? true : false);
- }
- //データベースを切断する
- rs.close();
- this.close();
- //Bookオブジェクトを返す
- return book;
- }
- public void close() throws SQLException {
- this.con.close();
- }
- }
○ ファイル
次に、表示したい書籍IDを受け取り、データベースからデータを取得し、画面に表示する制御をするサーブレットを作成します。プロジェクトに次のようなServletを追加してください。
パッケージ名 | test.servlet |
---|---|
クラス名 | BookGetServlet |
スーパークラス名 | javax.servlet.http.HttpServlet |
○ プログラム
doGetメソッドを追加して、次のようにプログラムを入力してください。
BookGetServlet.java
- package test.servlet;
- import java.io.IOException;
- import java.sql.SQLException;
- import javax.servlet.ServletContext;
- 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 test.bean.Book;
- import test.data.BooksDataAccess;
- @WebServlet("/getbook")
- public class BookGetServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //指定されたIDを取得する
- int id = Integer.parseInt(req.getParameter("id"));
- try {
- //DAOを生成する
- BooksDataAccess dao = new BooksDataAccess();
- //書籍情報を取得する
- Book book = dao.getBook(id);
- //取得したBeanをリクエストに保存する
- req.setAttribute("book", book);
- //JSPに転送する
- ServletContext context = this.getServletContext();
- context.getRequestDispatcher("/ShowBook.jsp").forward(req, resp);
- }catch(SQLException e) {
- }catch(Exception e) {
- }
- }
- }
○ ファイル
結果を表示する画面を準備します。次のようなJSPファイルを追加してください。
ファイル名 | ShowBook.jsp |
---|
○ プログラム
次のようにプログラムを入力してください。
ShowBook.jsp
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <jsp:useBean id="book" scope="request" class="test.bean.Book" />
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>書籍情報</title>
- </head>
- <body>
- <table border="1">
- <tr>
- <th>ID</th>
- <td><%= book.getId() %></td>
- </tr>
- <tr>
- <th>カテゴリーID</th>
- <td><%= book.getCategoryId() %></td>
- </tr>
- <tr>
- <th>書籍名</th>
- <td><%= book.getBookName() %></td>
- </tr>
- <tr>
- <th>著者名</th>
- <td><%= book.getAuthor() %></td>
- </tr>
- <tr>
- <th>出版社</th>
- <td><%= book.getPublish() %></td>
- </tr>
- <tr>
- <th>ISBN</th>
- <td><%= book.getIsbn() %></td>
- </tr>
- <tr>
- <th>price</th>
- <td><%= book.getPrice() %></td>
- </tr>
- <tr>
- <th>貸出</th>
- <td><input type="checkbox" <%= (book.isRentalState()) ? "checked" : "" %>></td>
- </tr>
- </table>
- </body>
- </html>
○ 実行結果
次のURLを入力して実行してみましょう。
http://localhost:8080/WebApp/getbook?id=1
○ 解説
Book.javaでは、booksテーブルの1件分のデータを扱うために、列に対応したフィールドを準備しています。
BooksDataAccess.javaでは、データベースに接続して、指定したデータを取得します。28行目のメソッドで、引数に書籍IDを渡すと、そのIDの書籍をデータベースから検索し、取得し、Bookオブジェクトとして返します。46行目で、テーブルから取得したデータをもとに、インスタンス生成を行います。
BookGetServlet.javaでは、WebブラウザーのGET要求を受け付けます。クエリー文字列で、idキーで指定されたデータを受け取ります。26行目では、BooksDataAccessオブジェクトを生成し、データベースに接続します。そして29行目で、getBookメソッドを呼び出し、Bookオブジェクトを取得します。32行目では、HttpServletRequestオブジェクトに、取得したBookオブジェクトを保存しています。その後、ShowBook.jspに転送されます。
ShowBook.jspの3行目では、「
スコープ値 | 内容 |
---|---|
page | javax.servlet.jsp.PageContextに登録されているデータを参照。 |
request | javax.servlet.http.HttpServletRequestに登録されているデータを参照。 |
session | javax.servlet.http.HttpSessionに登録されているデータを参照。 |
application | javax.servlet.ServletContextに登録されているデータを参照。 |
「class」属性には、Beanのクラス名を指定します。「id」属性は、インスタンス変数名となります。このJSPファイル内では、bookという名前の変数で、取得した書籍情報を参照することができます。getterを使用してデータを参照することができます。