目次へ

6.3. DataSourceの利用

DataSourceを利用するには、JNDIというAPIを使用します。JNDIはNaming ServiceやDirectory Serviceなど、ツリー構造の情報に統一的にアクセスするためのAPIです。DataSourceを利用する上において、詳細な知識は不要ですので詳しい説明は省略します。以下はDataSourceを使用し、Connectionを取得しているサーブレットの例です。

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.io.PrintWriter;
import java.io.IOException;
  
public class DataSourceServlet extends HttpServlet{
  private DataSource dataSource=null;

  public void init() throws ServletException{
    try{
      Context context=new InitialContext();
      dataSource=(DataSource)context.lookup("java:comp/env/jdbc/datasource");
    }catch(NamingException e){
      throw new ServletException(e);
    }
  }
  
  protected void doGet(HttpServletRequest request,
                       HttpServletResponse response)
    throws ServletException, IOException{
    response.setContentType("text/html; charset=SJIS");
    PrintWriter writer=response.getWriter();
    writer.println("<html><body><ul>");
  
    Connection conn=null;
    try{
      conn=dataSource.getConnection();
      PreparedStatement statement
        =conn.prepareStatement("select name from meibo");
      ResultSet result=statement.executeQuery();
      while(result.next()){
        writer.println("<li>"+result.getString(1)+"</li>");
      }
    }catch(SQLException e){
      e.printStackTrace(writer);
    }finally{
      try{
       if(conn!=null) conn.close();
       }catch(SQLException e){}
    }

    writer.println("</ul></body></html>");
  }
}

まずDataSourceをTomcatから検索します。例ではサーブレットの初期化時(initメソッド内)で行っています。これはJNDIを使用して、javax.naming.Contextを作成してlookupメソッドを呼ぶことで可能です。lookupメソッドの定義は以下の通りです。

Object lookup(String name) throws javax.naming.NamingException

引数にはDataSourceが登録されている名前を指定します。その際の名前は、

java:comp/env/(server.xmlで指定した名前)

にして下さい。ここでは「jdbc/datasource」という名前で登録しましたので、「java:comp/env/jdbc/datasource」という名前を指定します。lookupメソッドの返り値はDataSourceですので、キャストして使用します。

DataSourceからはgetConnectionメソッドでjava.sql.Connectionを取得できます。DriverManagerと異なり、引数に値を指定する必要はありません。必要な情報はserver.xmlで指定しているためです。

(実習課題1)

サンプルのサーブレットを実行させなさい。また「product」テーブルにデータを追加する機能を、Webアプリケーションに追加しなさい。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp