トップ 新規 編集 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

JSPの実際:データベースとの連携

データベースサーバ

概要

Javaの開発環境に標準でバンドルされているApache Derbyデータベース(SQLで操作できる)を用いる。この授業はリレーショナルデータベースを主眼としたものではないため、簡単な操作(起動、終了)が可能になればよい。

データベースの保存場所

ネットワークドライブの授業用ディレクトリ以下にdatabaseディレクトリを作成し、以下の設定ファイルはそのディレクトリに保存し、コマンドはそのディレクトリ内で実行する。

データベースの設定ファイル

ファイルが存在しません。JSPの実際:データベースとの連携

上記のファイルにより認証が設定されるが、授業用ということで、単にユーザ名、パスワード、接続データベース名のすべてがtestという文字列となっている。また、Derbyサーバは標準でポート番号1527であるため、特に指定がなければそのポートでlistenしている。

データベースの起動と終了

データベースのホームディレクトリの設定
set DERBY_HOME="c:\Program Files\Sun\JavaDB"
データベースの起動
java -jar %DERBY_HOME%\lib\derbyrun.jar server start
データベースの終了
java -jar %DERBY_HOME%\lib\derbyrun.jar server shutdown -user test -password test
コマンドラインインターフェースでのデータベースへの接続
java -jar "%DERBY_HOME%\lib\derbyrun.jar" ij -p derby.properties

プロジェクト以下にドライバライブラリのインストール

データベースサーバに接続するためのderbyclient.jar(標準でJavaSE6をインストールしてある環境ではC:\Program Files\Sun\JavaDB\lib以下にある)をプロジェクトのWebContents\WEB-INF\libディレクトリにコピーする。

データベースとの接続

 JSTLタグライブラリを用いたデータベースとの接続

Databaseタグの準備

JSTLのタグライブラリを導入してある場合、JSPファイルの最初に以下のように記述することで、<sql:〜>タグを用いることができる。

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

Databaseタグの種類

タグ名 意味
<sql:setDataSource> データソースの設定、var属性でページ内で参照可能なデーターソース名を指定する
<sql:query> データベースへの問い合わせ処理。具体的にはPreparedStatement#executeQuery()を実行する。変更可能なパラメータはPreparedStatementと同様に?としておき、<sql:param>で実行時に指定する
<sql:update> データベースの更新処理。具体的にはPreparedStatement#executeUpdate()を実行する。変更可能なパラメータはPreparedStatementと同様に?としておき、<sql:param>で実行時に指定する
<sql:param> (日付型以外の)パラメータの設定
<sql:dateParam> 日付型パラメータの設定

データソースの設定

  • <sql:setDataSource>による接続
  • コネクションプーリングなどを使わず、jsp+JSTLによって直接、接続する場合、JDBCのドライバ名、ユーザ名、パスワードを設定することで、該当ページ内での接続という形でデータベースサーバに接続することができる。
    • 例えば、Derbyへの接続では以下のようになる。
<sql:setDataSource url="jdbc:derby://localhost:1527/test;create=true"
 driver="org.apache.derby.jdbc.ClientDriver" 
 user="test" password="test"
 var="ds"
/>

 サンプル

テーブルの作成

一般的にはテーブルの作成はJSPからではなく普通にSQLを入力することで作成するはずである。ただ、ここではJSPからでも作成できることを示すためにサンプルをあげておく。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<sql:setDataSource url="jdbc:derby://localhost:1527/test;create=true"
     driver="org.apache.derby.jdbc.ClientDriver" 
     user="test" password="test"
     var="ds"
/>
<html>
    <head>
    <title>データベース:テーブルの作成</title>
</head>
<body>
<% try { %>
<sql:transaction dataSource="${ds}">
    <sql:update>
        DROP TABLE TEST
    </sql:update>
</sql:transaction>
<% } catch(Exception e) {}
    //データベースが存在しない場合はSQLExceptionがThrowされるため
%>
<sql:update dataSource="${ds}" >
CREATE TABLE TEST (
    id        int,
    name    varchar(52),
    comment    varchar(256)
) 
</sql:update>
データベース中にTESTという名前のテーブルが作成されました。
</body>
</html>

  • CREATE文で実際に作成しているテーブルは以下のような構造になっている。
列名 内容
id int型
name 文字列型
comment 文字列型
  • 実際にデータが入ると、例えば、以下のようなテーブルになる。
id name comment
1 NaNaSHi ほげほげ
2 774 5963
3 名無し 特になし

テーブルの更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%     request.setCharacterEncoding("utf-8"); %>
<sql:setDataSource url="jdbc:derby://localhost:1527/test;create=true"
     driver="org.apache.derby.jdbc.ClientDriver" 
     user="test" password="test"
     var="ds"
/>
<html>
    <head>
    <title>データベース:テーブルへデータの追加</title>
</head>
<body>
<!-- テーブルへのデータ追加 -->
<c:if test="${!empty param.name}">
    <sql:transaction dataSource="${ds}">
        <c:set var="maxId" value="0" />
        <sql:query var="maxIdRs">
            SELECT MAX(ID) AS maxId FROM TEST
        </sql:query>
        <c:set var="maxId" value="${maxIdRs.rows[0].maxId}"/>
        <sql:update var="updateCount">
            INSERT INTO TEST VALUES (?, ?, ?)
            <sql:param value="${maxId+1}"/>
            <sql:param value="${param.name}"/>
            <sql:param value="${param.comment}"/>
        </sql:update>
    </sql:transaction>
</c:if>
<!-- 投稿フォームの表示 -->
<h3>投稿フォーム</h3>
コメントの投稿をお願いします。
<form action="${pageContext.request.requestURI}" method="post">
    名前:<input type="text" name="name" size="15">
    コメント:<input type="text" name="comment" size="50">
    <input type="submit" value="投稿">
</form>
<!-- いままで投稿されたコメントの表示 -->
<hr>
<h3>今までに投稿されたコメント</h3>
<sql:query dataSource="${ds}" var="rs">
    SELECT * FROM TEST
</sql:query>
<table>
    <c:forEach var="row" items="${rs.rows}" varStatus="status">
        <tr>
            <td>${status.count}</td>
            <td>${row.name}</td>
            <td>${row.comment}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

コネクションプーリングを用いたデータベースとの接続

 コネクションプーリングの設定

データベースドライバの設定

  • WebアプリケーションではなくTomcatのライブラリパスに含めておく必要がある。
  • つまりDerbyDBの場合、derbyclient.jarをTomcat自身のクラスパスにインストールすることになる。

server.xmlの設定

  • Webアプリケーション単位で行う場合、server.xml[1]のウェブアプリケーションの<Context>内に設定する
  • アプリケーションサーバ全体で同じデータソースを共有したい場合には、<GlobalNamingResources>に<Resource>を設定する
  • DerbyDBを"jdbc/derby"というデータソース名で参照することが可能にする
     	<Resource name="jdbc/derby"
     		auth="Container"
     		type="javax.sql.DataSource"
     		url="jdbc:derby://localhost:1527/test;create=true"
     		driverClassName="org.apache.derby.jdbc.ClientDriver"
     		maxActive="10"
     		maxIdle="1"
     		username="test"
     		password="test"
     	/>

web.xmlの設定

  • 上記の設定で書いたデータソース名をweb.xmlの<resource-ref>に設定しておく必要がある
 <resource-ref>
     <description>DB Connection</description>
     <res-ref-name>jdbc/derby</res-ref-name>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
 </resource-ref>

 コネクションプーリングを利用したサンプル

上記のサンプルをコネクションプーリングを利用した形に書き直したものである。

テーブルの作成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<html>
    <head>
    <title>データベース:テーブルの作成</title>
</head>
<body>
<sql:setDataSource dataSource="jdbc/derby"/>
<% try { %>
<sql:transaction>
    <sql:update>
        DROP TABLE TEST
    </sql:update>
</sql:transaction>
<% } catch(Exception e) {}
    //データベースが存在しない場合はSQLExceptionがThrowされるため
%>
<sql:update>
CREATE TABLE TEST (
    id        int,
    name    varchar(52),
    comment    varchar(256)
) 
</sql:update>
データベース中にTESTという名前のテーブルが作成されました。
</body>
</html>

テーブルの更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%     request.setCharacterEncoding("utf-8"); %>
<sql:setDataSource dataSource="jdbc/derby"/>
<html>
    <head>
    <title>データベース:テーブルへデータの追加</title>
</head>
<body>
<!-- テーブルへのデータ追加 -->
<c:if test="${!empty param.new}">
    <sql:transaction>
        <c:set var="maxId" value="0" />
        <sql:query var="maxIdRs">
            SELECT MAX(ID) AS maxId FROM TEST
        </sql:query>
        <c:set var="maxId" value="${maxIdRs.rows[0].maxId}"/>
        <sql:update var="updateCount">
            INSERT INTO TEST VALUES (?, ?, ?)
            <sql:param value="${maxId+1}"/>
            <sql:param value="${param.name}"/>
            <sql:param value="${param.comment}"/>
        </sql:update>
    </sql:transaction>
</c:if>
<!-- テーブルからの削除 -->
<c:if test="${!empty param.delete}">
    <sql:transaction>
        <sql:update>
            DELETE FROM TEST WHERE ID=?
            <sql:param value="${param.deleteId}"/>
        </sql:update>
    </sql:transaction>
</c:if>
<!-- 投稿フォームの表示 -->
<h3>投稿フォーム</h3>
コメントの投稿をお願いします。
<form action="${pageContext.request.requestURI}" method="post">
    名前:<input type="text" name="name" size="15">
    コメント:<input type="text" name="comment" size="50">
    <input type="submit" name="new" value="追加">
</form>
<!-- いままで投稿されたコメントの表示 -->
<hr>
<h3>今までに投稿されたコメント</h3>
<sql:query var="rs">
    SELECT * FROM TEST
</sql:query>
<table border="1">
    <tr>
        <th>名前</th>
        <th>コメント</th>
        <th>削除</th>
    </tr>
    <c:forEach var="row" items="${rs.rows}" varStatus="status">
        <tr>
            <td>${row.name}</td>
            <td>${row.comment}</td>
            <td><form action="${pageContext.request.requestURI}" method="post" style="margin: 0px;" onsubmit="return confirm('本当に削除しますか?');">
                    <input type="hidden" name="deleteId" value="${row.id}">
                    <input type="submit" name="delete" value="削除">
                </form>
            </td>
        </tr>
    </c:forEach>
</table>
</body>
</html>
  • [1]eclipseではここに設定するが、本来はcontext.xmlに指定すべき?実際にはserver.xmlで問題なし
create.jsp createWithDataSource.jsp update.jsp updateWithDataSource.jsp

最終更新時間:2013年07月01日 15時20分20秒