2013年12月26日木曜日

TOMCAT:SERVLET最小構成(MYSQL接続)

eclipse 上で JSPやServlet のHello worldを作成しても、実際にはどのような構成でサーバー上に配備されるか解りづらい。SevletからMYSQLを利用する最小構成を確認してみた。

ServletのMYSQL接続


(1) ディレクトリ構成
$ tree test04
test04
├── META-INF
│   └── context.xml
└── WEB-INF
    └── classes
        ├── test04.class
        └── test04.java

3 directories, 3 files
s
(2) テーブルとデータ
$ mysql -unaoki -p sampledb
Enter password: 
mysql> create table foods(
    ->   code         varchar(8)   PRIMARY KEY,
    ->   name         varchar(100),
    ->   price        integer,
    ->   index(price)
    -> ) engine=InnoDB;
Query OK, 0 rows affected (0.12 sec)

mysql> insert into foods values('000001','りんご',398);
Query OK, 1 row affected (0.03 sec)

mysql> insert into foods values('000002','みかん',480);
Query OK, 1 row affected (0.04 sec)

mysql> insert into foods values('000003','柿'    ,450);
Query OK, 1 row affected (0.04 sec)

mysql> select * from foods;
+--------+-----------+-------+
| code   | name      | price |
+--------+-----------+-------+
| 000001 | りんご    |   398 |
| 000002 | みかん    |   480 |
| 000003 | 柿        |   450 |
+--------+-----------+-------+
3 rows in set (0.00 sec)
(3) コンテキストファイル

コネクションプールはDBCPとJDBCという2つの仕組みが提供されているらしい。TOCAT7ではデフォルトはDBCPらいしいが、切り替えるには、factory で指定できるらしい。jndi の定義は、本来は tomcat7/conf 配下の context.xml で設定するべきだと思うのだが、アプリケーション単位に設定できる。全く同じ jndi名で片方のアプリケーションがコネクションプールを使いきっても、もう一方のアプリケーションが独自に context.xml を使っていれば影響はなかった。サーバー管理としては、一箇所で管理したいところだとは思うが、個別にアプリをテストする時には便利な仕様である。
$ cat test02/META-INF/context.xml
<Context>
  <Resource name="jdbc/TestDB" 
            auth="Container" 
            type="javax.sql.DataSource"
            maxActive="100" 
            maxIdle="30" 
            maxWait="10000"
            username="naoki" 
            password="password" 
            driverClassName="com.mysql.jdbc.Driver"
            factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
            url="jdbc:mysql://localhost:3306/sampledb"/>

<!--      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" -->
</Context>
(4) SERVLEAT(JAVA)ファイル
$ cat test04/WEB-INF/classes/test04.javaimport java.io.*;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;

@WebServlet(name="test04", urlPatterns={"/test04"})
public class test04 extends HttpServlet { 
  @Override
  public void doGet(HttpServletRequest req,
                      HttpServletResponse res) 
                      throws ServletException,IOException {

    InitialContext initctx = null;
    Connection con = null;

    try {
      initctx = new InitialContext();
      DataSource ds = (DataSource)initctx.lookup("java:comp/env/jdbc/TestDB");
      con = ds.getConnection();

      res.setContentType("text/html; charset=UTF-8");
      PrintWriter out = res.getWriter();

      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery("select * from foods;");

      out.println("<html>");
      out.println("<head>");
      out.println("<title> SERVLET-TEST </title>");
      out.println("</head>");
      out.println("<body>");
      out.println("<h3>果物一覧</h3>");
      out.println("<table>");
      out.println("<tr>");
      out.println("<th>CODE</th>");
      out.println("<th>名前</th>");
      out.println("<th>値段</th>");
      out.println("</tr>");

      while(rs.next()) {
        out.println("<tr>");
        out.println("<td>" + rs.getString("code")  + "</td>" );
        out.println("<td>" + rs.getString("name")  + "</td>" );
        out.println("<td>" + rs.getString("price") + "</td>" );
        out.println("</tr>");
      }

      out.println("</body>");
      out.println("</html>");

      con.close();
      initctx.close();
    }
    catch(NamingException e) {
      e.printStackTrace();
    }
    catch(SQLException e) {
      e.printStackTrace();
    }
  }
}

(5)コンパイル
javac -cp ~/tomcat7/lib/servlet-api.jar test04/WEB-INF/classes/test04.java

(5)TOMCATへ配備
$ cp -rp test4 ~/tomcat7/webapps
(4)実行結果


0 件のコメント:

コメントを投稿