JavaBeansを使ってみる

MVCでの、Modelを扱う方法を見てみましょう。モデルでは、データの処理などを担当します。データベースからデータを取得したり、データベースにデータを保存したり、更新したりします。Modelでのプログラム構成は様々ですが、データベースにアクセスするためのクラスとして「DAO(Database Access Object)」クラスを、取得したデータを扱うクラスとして「Bean」クラスを使うことがあります。

Beanクラスを作る際、次のルールでクラスを定義します。

今回は、指定したIDの書籍データを画面に表示するサンプルを作成してみましょう。

○ ファイル

まず、Beanクラスを作成しましょう。booksテーブルのデータ1件分を扱うクラスを作成します。プロジェクトに次のようなクラスを追加してください。

パッケージ名 test.bean
クラス名 Book
スーパークラス名 java.io.Serializable

サンプルダウンロード

○ プログラム

次のようにプログラムを入力してください。

Book.java

  1. package test.bean;
  2. import java.io.Serializable;
  3. public class Book implements Serializable {
  4.     //フィールド
  5.     private int id;
  6.     private int categoryId;
  7.     private String bookName;
  8.     private String author;
  9.     private String publish;
  10.     private String isbn;
  11.     private int price;
  12.     private boolean rentalState;
  13.     
  14.     //コンストラクター
  15.     public Book() {}    
  16.     public Book(int id, int categoryId, String bookName, String author, String publish, String isbn, int price, boolean rentalState) {
  17.         this.id = id;
  18.         this.categoryId = categoryId;
  19.         this.bookName = bookName;
  20.         this.author = author;
  21.         this.publish = publish;
  22.         this.isbn = isbn;
  23.         this.price = price;
  24.         this.rentalState = rentalState;
  25.     }
  26.     //メソッド
  27.     public int getId() {
  28.         return id;
  29.     }
  30.     public void setId(int id) {
  31.         this.id = id;
  32.     }
  33.     public int getCategoryId() {
  34.         return categoryId;
  35.     }
  36.     public void setCategoryId(int categoryId) {
  37.         this.categoryId = categoryId;
  38.     }
  39.     public String getBookName() {
  40.         return bookName;
  41.     }
  42.     public void setBookName(String bookName) {
  43.         this.bookName = bookName;
  44.     }
  45.     public String getAuthor() {
  46.         return author;
  47.     }
  48.     public void setAuthor(String author) {
  49.         this.author = author;
  50.     }
  51.     public String getPublish() {
  52.         return publish;
  53.     }
  54.     public void setPublish(String publish) {
  55.         this.publish = publish;
  56.     }
  57.     public String getIsbn() {
  58.         return isbn;
  59.     }
  60.     public void setIsbn(String isbn) {
  61.         this.isbn = isbn;
  62.     }
  63.     public int getPrice() {
  64.         return price;
  65.     }
  66.     public void setPrice(int price) {
  67.         this.price = price;
  68.     }
  69.     public boolean isRentalState() {
  70.         return rentalState;
  71.     }
  72.     public void setRentalState(boolean rentalState) {
  73.         this.rentalState = rentalState;
  74.     }
  75. }

○ ファイル

次に、データベースにアクセスして、データを取得するクラスを作成しましょう。プロジェクトに次のようなクラスを追加してください。

パッケージ名 test.data
クラス名 BooksDataAccess

サンプルダウンロード

○ プログラム

次のようにプログラムを入力してください。

BooksDataAccess.java

  1. package test.data;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import test.bean.Book;
  8. public class BooksDataAccess {
  9.     //フィールド
  10.     private static final String DRIVER = "com.mysql.jdbc.Driver";
  11.     private static final String URL = "jdbc:mysql://localhost:3306/books?characterEncoding=utf8";
  12.     private static final String USER = "root";
  13.     private static final String PASSWORD = "";
  14.     
  15.     private Connection con;
  16.     
  17.     //コンストラクター
  18.     public BooksDataAccess() throws SQLException, ClassNotFoundException {
  19.         //データベースに接続する
  20.         Class.forName(DRIVER);
  21.         con = DriverManager.getConnection(URL, USER, PASSWORD);
  22.     }
  23.     
  24.     //メソッド
  25.     public Book getBook(int id) throws SQLException {
  26.         //SQL文を生成
  27.         String sql = "SELECT * FROM books WHERE id=?";
  28.         
  29.         //PreparedStatementオブジェクトを生成
  30.         PreparedStatement pst = con.prepareStatement(sql);
  31.         
  32.         //パラメーターをセットする
  33.         pst.setInt(1, id);
  34.         
  35.         //SQL文を実行
  36.         ResultSet rs = pst.executeQuery();
  37.         
  38.         //結果を格納するBookオブジェクトを用意
  39.         Book book = null;
  40.         
  41.         //結果を取得する
  42.         if(rs.next()){
  43.             book = new Book(
  44.                     rs.getInt("id"),
  45.                     rs.getInt("category_id"),
  46.                     rs.getString("book_name"),
  47.                     rs.getString("author"),
  48.                     rs.getString("publish"),
  49.                     rs.getString("isbn"),
  50.                     rs.getInt("price"),
  51.                     rs.getInt("rental_state") == 1 ? true : false);
  52.         }
  53.         
  54.         //データベースを切断する
  55.         rs.close();
  56.         this.close();
  57.         
  58.         //Bookオブジェクトを返す
  59.         return book;
  60.     }
  61.     
  62.     public void close() throws SQLException {
  63.         this.con.close();
  64.     }
  65. }

○ ファイル

次に、表示したい書籍IDを受け取り、データベースからデータを取得し、画面に表示する制御をするサーブレットを作成します。プロジェクトに次のようなServletを追加してください。

パッケージ名 test.servlet
クラス名 BookGetServlet
スーパークラス名 javax.servlet.http.HttpServlet

サンプルダウンロード

○ プログラム

doGetメソッドを追加して、次のようにプログラムを入力してください。

BookGetServlet.java

  1. package test.servlet;
  2. import java.io.IOException;
  3. import java.sql.SQLException;
  4. import javax.servlet.ServletContext;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import test.bean.Book;
  11. import test.data.BooksDataAccess;
  12. @WebServlet("/getbook")
  13. public class BookGetServlet extends HttpServlet {
  14.     @Override
  15.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  16.         //指定されたIDを取得する
  17.         int id = Integer.parseInt(req.getParameter("id"));
  18.         
  19.         try {
  20.             //DAOを生成する
  21.             BooksDataAccess dao = new BooksDataAccess();
  22.             
  23.             //書籍情報を取得する
  24.             Book book = dao.getBook(id);
  25.             
  26.             //取得したBeanをリクエストに保存する
  27.             req.setAttribute("book", book);
  28.             
  29.             //JSPに転送する
  30.             ServletContext context = this.getServletContext();
  31.             context.getRequestDispatcher("/ShowBook.jsp").forward(req, resp);
  32.         }catch(SQLException e) {
  33.         }catch(Exception e) {
  34.         }
  35.     }
  36. }

○ ファイル

結果を表示する画面を準備します。次のようなJSPファイルを追加してください。

ファイル名 ShowBook.jsp

サンプルダウンロード

○ プログラム

次のようにプログラムを入力してください。

ShowBook.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2.     pageEncoding="UTF-8"%>
  3. <jsp:useBean id="book" scope="request" class="test.bean.Book" />
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta charset="UTF-8">
  8. <title>書籍情報</title>
  9. </head>
  10. <body>
  11.     <table border="1">
  12.         <tr>
  13.             <th>ID</th>
  14.             <td><%= book.getId() %></td>
  15.         </tr>
  16.         <tr>
  17.             <th>カテゴリーID</th>
  18.             <td><%= book.getCategoryId() %></td>
  19.         </tr>
  20.         <tr>
  21.             <th>書籍名</th>
  22.             <td><%= book.getBookName() %></td>
  23.         </tr>
  24.         <tr>
  25.             <th>著者名</th>
  26.             <td><%= book.getAuthor() %></td>
  27.         </tr>
  28.         <tr>
  29.             <th>出版社</th>
  30.             <td><%= book.getPublish() %></td>
  31.         </tr>
  32.         <tr>
  33.             <th>ISBN</th>
  34.             <td><%= book.getIsbn() %></td>
  35.         </tr>
  36.         <tr>
  37.             <th>price</th>
  38.             <td><%= book.getPrice() %></td>
  39.         </tr>
  40.         <tr>
  41.             <th>貸出</th>
  42.             <td><input type="checkbox" <%= (book.isRentalState()) ? "checked" : "" %>></td>
  43.         </tr>
  44.     </table>
  45. </body>
  46. </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行目では、「」タグを使用しています。このタグを使って、サーブレットで保存しておいたBeanクラスを取得することができます。「scope」属性では「request」としていますが、サーブレットではリクエストオブジェクトにBeanを保存しておいたので「request」と指定します。この「scope」属性は次のような設定値が用意されています。

スコープ値 内容
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を使用してデータを参照することができます。

各クラスの関係
各クラスの関係

前へ