JSF(Java Server Faces)でMySQLに接続
May 16, 2010 – 10:00 pm前回、JSFを使って簡単なWebアプリを作成した。今回は、これを一歩進めて、MySQLと連携する簡単なWebアプリを作成してみた。Webアプリの作成から動作確認までの一連の手続きをメモしておいた。
コンテナー(Tomcat)にコネクタライブラリをコピー: JSFを使ったWebアプリとMySQLを連携させるためには、MySQL用のJDBCドライバ「MySQL Connector/J]を用いる。
具体的には、MySQLのサイトからダウンロードし、Jarファイル(本記事を書いた時点では、「mysql-connector-java-5.1.12-bin.jar」)をTomcatのlibに配置(コピー)すればよい。因みに、Tomcatのディレクトリ構成については、このブログ記事の「CentOS上でのTomcat6のインストール」に記述している。
テスト用DBの作成: テストに用いたMySQL データベースは、本ブログの「MySQLを学習(3):INSERT文を用いたData入力フォーム作成」と同一ものを用いた。まず、データベースBookDB上に、空のテーブルbook_tableを作成し、このテーブルに、Webアプリを通じてDataを書き込むことになる。
$ mysql -u user_name -ppassword BookDB Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.0.77 Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> show tables; +------------------+ | Tables_in_BookDB | +------------------+ | book_table | +------------------+ 1 row in set (0.00 sec) mysql> describe book_table; +-----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+----------------+ | book_id | int(5) | NO | PRI | NULL | auto_increment | | title | varchar(240) | NO | | NULL | | | author | varchar(240) | NO | | NULL | | | pub_date | date | NO | | NULL | | | publisher | varchar(10) | NO | | NULL | | | position | varchar(10) | NO | | NULL | | +-----------+--------------+------+-----+---------+----------------+ 6 rows in set (0.00 sec) mysql> select * from book_table; Empty set (0.00 sec)
JSPとJava(Class)の作成: Eclipse上で、前回と同様の手続きで、Java Beans用のソース(dao.java)とJSP(DB Sample.jsp)のソースをコーディングした。それぞれのソースプログラムは以下のものである。因みに、dao.javaをmanaged beansとして登録する手続きは、前回の例を参照して欲しい。
dao.java:
package com.yamasnet.db.dao; import java.sql.*; public class dao { private String title=""; private String author=""; private String shuppanbi=""; private String publisher=""; private String position=""; public void setTitle(String title) { this.title = title; } public String getTitle() { return title; } public void setAuthor(String author) { this.author = author; } public String getAuthor() { return author; } public void setShuppanbi(String shuppanbi) { this.shuppanbi = shuppanbi; } public String getShuppanbi() { return shuppanbi; } public void setPublisher(String publisher){ this.publisher = publisher; } public String getPublisher() { return publisher; } public void setPosition(String position) { this.position = position; } public String getPosition() { return position; } public String add() { String dataField ="(title,author,pub_date,publisher,position) "; String strValue = "VAlues(" + "'" + title + "'," + "'" + author + "'," + "{d'" + shuppanbi + "'}," + "'" + publisher + "'," + "'" + position + "')"; String queryStr = "INSERT INTO book_table " + dataField + strValue; try { Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/BookDB?" + "user=user_name&password=password"); Statement stmt = null; try { stmt = conn.createStatement(); stmt.executeUpdate(queryStr); } finally { if ( stmt != null) { try { stmt.close(); } catch (SQLException sqlEx) {} stmt=null; } } } catch (SQLException ex) { // handle any errors System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); } return "success"; } public String reset() { title = ""; author= ""; shuppanbi=""; publisher=""; position=""; return "reset"; } }
DB Sample.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>DB Sample</title> </head> <body> <f:view> <h2>Test for TABLE</h2> <h:form> <h:panelGrid columns="2"> <h:outputLabel value="Title:"></h:outputLabel> <h:inputText id="title" value="#{dao.title}"></h:inputText> <h:outputLabel value="Author:"></h:outputLabel> <h:inputText id="author" value="#{dao.author}"></h:inputText> <h:outputLabel value="Shuppanbi:"></h:outputLabel> <h:inputText id="shuppanbi" value="#{dao.shuppanbi}"></h:inputText> <h:outputLabel value="Publisher"></h:outputLabel> <h:inputText id="publisher" value="#{dao.publisher}"></h:inputText> <h:outputLabel value="Position"></h:outputLabel> <h:inputText id="position" value="#{dao.position}"></h:inputText> <h:commandButton action="#{dao.add}" value="add"></h:commandButton> <h:commandButton action="#{dao.reset}" value="reset"></h:commandButton> </h:panelGrid> </h:form> </f:view> </body> </html>
WebアプリをEclipse上で実行: 作成したWebアプリをEclipse上で実行する。前回と同様、「Project Explorer」上でタグ[DB Sample.jsp]にマウスカーソルを置き右クリックし、ここで現れるプルダウンメニューで、[Run AS] → [Run on Server]としてやればよい。
作成したWebアプリの実行が開始され、初期画面(DB入力用フォーム)が現れる。
フォーム上で適当なデータを入力し、[add]ボタンを押下する。
以上の操作で、テスト用に作成しておいたBookDBのテーブルbook_tableに入力データに対応したレコードが挿入され、JSFで作成したWebアプリが正常に動作していることが確認できる。
mysql> select * from book_table; +---------+--------------------+--------------+------------+-----------+----------+ | book_id | title | author | pub_date | publisher | position | +---------+--------------------+--------------+------------+-----------+----------+ | 1 | 免疫の意味論 | 多田富雄 | 1993-04-30 | 青土社 | A-02 | +---------+--------------------+--------------+------------+-----------+----------+ 1 row in set (0.00 sec) mysql>
php でのMySQLとの接続例との相違点: 上記したWebアプリは、上記の「テストDBの作成」で記述したように、「 MySQLを学習(3):INSERT文を用いたData入力フォーム作成」で作成したものと、基本的な機能は同等なものである。以下、実際に動作させてみて気づいた相違点等について触れておく:
- JSF上でのアプリの作成では、ステートフルであり、[add]ボタンを押下して入力データをMySQL上に書き込んだ後も、入力したデータはフォーム上に維持される。これは、ユーザーインタフェースとしてのJSFの優位性のひとつだ。プログラミング上の観点からも、容易になる。
- SQL文の扱いがphpの場合と異なることがある。例えば、phpでは、auto_incrementを指定している1カラム目のデータをNULL(””)とすればよかったが、JSFの場合はうけつけられない(カラム名を省略した場合)。
- 上記に関連するが、SQL文のなかのvalue値のデータの型がリジッドに取り扱われている。今回の例では、date形式のデータについては、phpの場合には’2010-05-13’というテキスト文でも取り扱い可能であったが、JSFの場合には、ODBCフォーマット(上記例では、{d ‘2010-05-13’})に従わねばならない。
- query文発行のメソッドは二つある: phpにおいてはquery文の発行はquery文の違いに関係なくひとつで間に合っていたが、Javaでは、executeUpdateとexecuteQueryの2種類がある。前者は、INSERT, UPDATE, DELETEなど結果セットが戻らないもの、後者はSELECTをもちいた結果セットが戻るものに用いられる。注意が必要である。
次回は、JSFの枠組みのなかでJavaScript、さらにはAJAXの取り込みについて調べてみたい。
1 Trackback(s)