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)