データベースが用意できたら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のように表示される。