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. 1 Trackback(s)

  2. Jun 3, 2010: Eclipseで作成したJSFアプリの公開サイトへの展開 | Yama's Memorandum

Post a Comment