感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

TomcatプロジェクトでDataSourceを利用して、DBに接続したときのまとめ(eclipseの例含む)

<スポンサーリンク>

Tomcatでデータソースを利用する。

Tomcatでデータソースを利用するには以下の前準備が必要。
1.JDBCドライバを適切なディレクトリに配置する。
2.コンテキストファイルの編集

データソースを利用するには、「アプリケーションサーバが利用するクラスパス」にJDBCドライバを配置する必要がある。
Tomcatは以下。
/lib

コンテキストファイルの編集というのは、Tomcatでデータソースを登録するポピュラーな方法らしい。
コンテキストルート/META-INF/context.xml
を作成する。

Eclipseを使って開発しているTomcatプロジェクトでDataSourceを利用してみる

EclipseTomcatプラグインを利用している場合は、
META-INF/context.xmlみたいにやってもうまくいかない。

/conf/Catalina/localhost/以下にある<プロジェクト名>/xmlを編集する必要がある。
自分の場合はココ。

C:\Program Files (x86)\Apache Software Foundation\apache-tomcat-6.0.35\conf\Catalina\localhost

この下にプロジェクト名のxmlファイルがある。
デフォルトでは

<Context path="/rest" reloadable="true" docBase="C:\Users\sho\workspace\rest" workDir="C:\Users\sho322\workspace\rest\work" />

みたいに、EclipseTomcatを紐付ける設定が書かれているから、これを編集しよう。
閉じタグになってるから注意。
で、編集したXMLはこんな感じ。自分はrestなんていうプロジェクト名なので、rest.xmlってのがあった。

<Context path="/rest" reloadable="true" docBase="C:\Users\workspace\rest" workDir="C:\Users\workspace\rest\work">
	<Resource name="jdbc/myds" auth="Container"
		type="javax.sql.DataSource"
		username="root"
		password="1234"
		driverClassName="com.mysql.jdbc.Driver"
		url="jdbc:mysql://localhost/testdb" />
</Context>

あと、EclipseJDBCにパスを通すにはどうしたらいいか迷ったんだけど、
コンテキストルート(プロジェクト名)/WEB-INF/libの下に「mysql-connector-java-5.0.5-bin.jar」を突っ込んで、
右クリック→ビルドパス→ビルドパスに追加
でうまくいった(ちゃんとJDBCドライバを利用できた)

さて、サンプルのサーブレットはこんな感じ。

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import javax.sql.DataSource;
//import sun.jdbc.odbc.ee.DataSource;

public class DBTestServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) 
                throws ServletException, IOException {
        res.setContentType("text/plain; charset=Windows-31J");
        PrintWriter out = res.getWriter();
        
        InitialContext ctx;
        try {
            ctx = new InitialContext();
            DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/myds");
            Connection con = ds.getConnection();
            out.println("con=" + con);
        } catch (NamingException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
    }

}

web.xmlはこう。

    <servlet>
        <servlet-name>dbtest</servlet-name>
        <servlet-class>servlet.DBTestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>dbtest</servlet-name>
        <url-pattern>/dbtest</url-pattern>
    </servlet-mapping>

ブラウザからアクセス(ttp://localhost:8082/rest/dbtest)してみると、こんなエラーが。
なんだこれ?

java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.BasicDataSource cannot be cast to sun.jdbc.odbc.ee.DataSource
	servlet.DBTestServlet.doGet(DBTestServlet.java:26)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

例外の内容を詳細に見ていってみると、

org.apache.tomcat.dbcp.dbcp.BasicDataSource cannot be cast to sun.jdbc.odbc.ee.DataSource

っていうのがあった。
つまり、デフォルトのSUNのDataSourceにTomcatのDataSourceをキャストできない、と。
なので、importするDataSourceをjavax.sql.DataSourceにした。

import javax.sql.DataSource;
//import sun.jdbc.odbc.ee.DataSource;

するとブラウザにはこんな風に、コネクションが取得できたような表示が!

con=jdbc:mysql://localhost/testdb, UserName=root@localhost, MySQL-AB JDBC Driver

これでTomcatプロジェクトでDBを利用できるようになった!
次は、DBから吸い上げた値をJSONに変換してブラウザに表示してみよう。
データソースとJNDIの説明はまた別の記事で(どっかに書いたと思うけど)

context.xmlのResource要素に指定する値についての説明

属性名 設定した値 説明
name jdbc/myds リソースにつける名前。任意でよい。ただ、サーブレットなどはこの名前を利用してデータソースを取得する。いわゆるJNDI名。
type javax.sql.DataSource クラス名
auth Container 認証のタイプ。ApplicationかContainerを指定する。Applicationにした場合は、Webアプリ側で認証のコードを書く必要がある。
username root ユーザー名
password 1234 パスワード
driverClassName com.mysql.jdbc.Driver JDBCドライバのクラス名
url jdbc:mysql://localhost/testdb JDBCのURL

ちなみに、Eclipseで使っているTomcatのディレクトリを調べる方法は、
「ウィンドウ」→「設定」→「Tomcat」をクリックすると、Tomcatホームとあると思うけれど、それがEclipseで使っているTomcat

参考書籍

基礎からのサーブレット/JSP 第3版 (基礎からのシリーズ)

基礎からのサーブレット/JSP 第3版 (基礎からのシリーズ)


これには本当にサーブレットの基礎的なことが何でも載ってる。
日本史でいう山川みたいな本。

感謝のプログラミング

今回で感謝のプログラミングは【476時間目】
10000時間まで、あと【9524時間】