データベースが用意できたらDataSourceを登録する。プロジェクトのMETA-INFディレクトリにリスト8のような内容でcontext.xmlを用意する。Resourceタグで定義されているのがDataSourceとなる。名前は「sampledatabase」、使用するドライバは「org.apache.derby.jdbc.ClientDriver」で、接続先のURLは「jdbc:derby://localhost:1527/sampledb」としてある。

リスト8 context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/Tomcat6Sample">
<Resource auth="Container"
driverClassName="org.apache.derby.jdbc.ClientDriver"
maxActive="20" maxIdle="10" maxWait="-1"
name="sampledatabase"
username="test" password="test"
type="javax.sql.DataSource"
url="jdbc:derby://localhost:1527/sampledb" />
</Context>

この設定は$CATALINA_HOME/confディレクトリのcontext.xmlに記述することもできる。その場合は全アプリケーションにおける共通の設定になる。あるいは$CATALINA_HOME/conf/server.xmlのGlobalNamingResources要素内に記述することで、グローバルな名前空間にリソースを定義し、Webアプリケーションのcontext.xmlにおいてResourceLink要素を使用して参照することも可能である。詳細はTomcatのドキュメント内のJNDI Resources HOW-TO( http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html )を参照のこと。

サーブレットプログラムはリスト9のようになる。リソースのインジェクションは@Resourceアノテーションによって行う。nameパラメータで指定した名前のリソースが変数datasourceにインジェクトされる。あとはDataSourceからgetConnectionメソッドでデータベース接続を取り出して、通常通りテーブルからデータを取得するだけだ。

リスト9 ResourceInjectionSample.java - アノテーションを使ったRI

package sample;
 
import java.io.*;
import java.net.*;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.annotation.Resource;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.sql.DataSource;
 
public class ResourceInjectionSample extends HttpServlet {
    @Resource(name="sampledatabase")
    private DataSource datasource;
 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<html><head>");
        out.println("<title>Resource Injection Sample</title>");
        out.println("</head><body>");
        out.println("<h1>Resource Injection Sample</h1>");
        out.println("<table border=\"1\">");   
        out.println("<thead><tr><th>ID</th><th>Item</th></tr></thead>");   
        out.println("<tbody>");   
        
        try {
 
            Connection con = this.datasource.getConnection();
            Statement stat = con.createStatement();
            String sql = "select * from item";
            ResultSet resultSet = stat.executeQuery(sql);
            while(resultSet.next()) {
                out.println("<tr><td>" + resultSet.getInt("id") + "</td><td>" + resultSet.getString("name") + "</td></tr>");
            }
        }
        catch (SQLException ex) {
            ex.printStackTrace();
        }
        
        out.println("</tbody></table>");
        out.println("</body></html>");
        out.close();
    }
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    
    public String getServletInfo() {
        return "Short description";
    }
}

WEB-INF/web.xmlにはResourceInjectionSampleのためにリスト10のような設定を追加する。

リスト10 WEB-INF/web.xmlに設定を追加

<servlet>
    <servlet-name>ResourceInjectionSample</servlet-name>
    <servlet-class>sample.ResourceInjectionSample</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ResourceInjectionSample</servlet-name>
    <url-pattern>/ResourceInjectionSample</url-pattern>
</servlet-mapping>

以上で準備完了。デプロイするファイルの構成は図22のようになる。これをTomcat 6.0にデプロイし、Webブラウザから「http://localhost/Tomcat6Sample/ResourceInjectionSample」にアクセスすると図23のように表示される。

図22 ファイル構成

図23 サンプルプログラムの実行結果