- Tomcatとは
  
 Tomcat とは Java を利用した、Webアプリケーションサーバーで、サーバー上で動くデーモンプログラムです。
 Tomcat をインストールするだけで、Webアプリケーションサーバーとして利用できます。
図1 Tomcat がすべてのクライアント処理を行う

    Apache のほうがパフォーマンスと拡張機能の面で優れているため、静的なコンテンツは Apache 、動的なコンテンツは Tomcat と2つのサーバープログラムを連携させて使用することが可能です。
図2 動的なコンテンツのみTomcatが処理を行う

    Tomcat は Apache のサブプロジェクト Jakarta プロジェクトの成果物でサーブレット/JSPのリファレンス実装です。
 
  サーブレットとは
 Java で記述された、サーバー上で動くプログラムです。
 言語は Java を使用しますので、PHP や Perl など新たな言語の習得が必要ありません。
 JDBC によるデータベースアクセス、XML によるデータ処理等を Java によって記述することができます。
  JSPとは
 ASP や PHP と同様に、HTML タグの中に Java プログラムを記述することができます。
 また、デザイン変更等ファイルの修正を行った場合もサーブレットと違ってコンパイルする必要がありません。
 JSP はスクリプト言語ですが、実行時にはサーブレットにコンパイルされますので、
2回目以降はサーブレットと同様のスピードで動作します。
  サーブレット/JSP と他のWebアプリケーションプラットホームとの比較
- セキュリティ上問題となる、シェルエスケープ、バッファオーバーフローが、ありません。
 
- Java が動作するほとんどのプラットホームで動作します。
 
- PHP、CGI、ASPなどと違い、Oracle9iAS、WebLogic、iPlanet、Websphere等、
J2EEに準拠する商用サーブレット/JSPプラットホームが多数存在しており、
Tomcat で開発、利用したアプリケーションを、少ない工数でスケールアップすることが可能です。
 
  対 CGI のアドバンテージ
 CGIは開発時にセキュリティ上非常に注意を必要とします。
 CGIはユーザー要求があるたびに新しいプロセスを作りますが、
サーブレット/JSP は Tomcat プロセス内のスレッドで処理が行われるため、
サーバーリソース、プロセス起動のオーバーヘッドの面で高いアドバンテージがあります。
  対 ASP のアドバンテージ
 ASP はMicrosoft社のIIS、PWS 上でしか動作しません。
 また、IIS は近年話題に上った Nimda に代表されるようにセキュリティの問題が多数みつかりました。
  対 PHP のアドバンテージ
 PHP は JSP と同様な方法で開発可能であり、さまざまなプラットホームで動作しますが、
分散オブジェクト、データベースアクセスなどのエンタープライズ拡張の領域においては、
サーブレット/JSP のほうが有利と思われます。
 
  - MIRACLEINUXでのTomcatの利用方法
  
 MIRACLE LINUX では、RPM パッケージをインストールするだけで、サーブレット/JSP 環境をサーバー上に構築できます。
 また、Apache と Tomcat の連携を行うための mod_jk パッケージという Apache のモジュールもご用意しています。
- 
  
Tomcat を動作させるために必要なパッケージは以下の通りです。
  
tomcat4-4.0.6-full.3jppml.noarch.rpm →ダウンロード
Tomcat パッケージ本体です。
※MIRACLE LINUX Standard Edition V2.1 とRed Hat Linux Advanced Server 2.1 powered by MIRACLE には tomcat4-4.0.3 パッケージが付属していますが、クロスサイトスクリプティングの危険性が見つかっています。弊社Webよりダウンロードされるか、R2対応キットのtomcatディレクトリにも収録されていますので、tomcat4-4.0.6をご利用ください。
ご注意  tomcat4-4.0.3 からtomcat4-4.0.6 へのアップデートは注意事項をよくお読みになってから実行してください。
tomcat4-webapps-4.0.6-full.3jppml.noarch.rpm →ダウンロード
付属のサンプルプログラムが収録されています。
今回のサンプルでも使用しますのでインストールしてください。
  この他にJava2 SDKが必要となります。
 Tomcat からインストールされている Java2 SDK を指定している設定ファイルは /etc/tomcat4/tomcat4.conf です。この中で、以下のような形で JAVA_HOME を設定してあります。他のJava2 SDKをご利用になる場合は環境にあわせて修正してください。
  
   MIRACLE LINUX Standard Edition V2.1の場合は Sun Java(TM) 2 SDK, Standard Edition 1.3.1_04 が /usr/java/jdk1.3.1_04 にインストールされています。またシンボリックリンクが /usr/lib/jdk に作成されています。
 Red Hat Linux Advanced Server 2.1 powered by MIRACLEの場合は MIRACLE value CD より 「Tomcat: JSP, Servlet Tools」をインストールするとSun Java(TM) 2 SDK, Standard Edition 1.3.1_04が/usr/java/jdk1.3.1_04にインストールされます。またシンボリックリンクが /usr/lib/jdk に作成されます。
 
- 
  
Apache と Tomcat を連携させるために以下のパッケージも必要になります。
apache-1.3.27-2ml.i686.rpm →ダウンロード
通常の静的なコンテンツを処理するWebサーバープログラムです。
 
今回のサンプルでも使用しますのでインストールしてください。
mod_jk-4.0.6-1ml.i686.rpm →ダウンロード
apache と Tomcat を連携させる際に使用する apache のモジュールです。
今回のサンプルでも使用しますのでインストールしてください。
 
  Tomcat サーバーの設定方法
まず最初に、tomcat4パッケージが正常にインストールされているか確認してください。
  
| 以下のコマンドを実行して Tomcat を起動します。 | 
    
      | # service tomcat4 start |  
    
  
URL http://localhost:8080 にアクセスして、以下の画面が表示されればインストールは成功です。
(この:8080という URL は Tomcat だけでクライアントに応答しています。)
  ここからは、実際にTomcatとApacheを連携させ、新規のディレクトリを作成しサーブレット/JSPの配置していきます。
  Apache と Tomcat を連携させた test ディレクトリの設定方法
ここでは、http://localhost/test以下にテストサーブレット/JSPを配置する例とします。
  test ディレクトリの作成
テスト用サーブレットとテスト用JSPを置くためのディレクトリを作成します。
サーバー上で、以下のコマンドを実行してください。
  
    
      | # mkdir -p /var/tomcat4/webapps/test/WEB-INF/classes |  
    
  
  Tomcat設定ファイルの編集
新たにアプリケーションを配置ディレクトリを追加する場合、
変更を行う設定ファイルは以下の2つです。
- /etc/httpd/conf/mod_jk.conf <--Apacheとの連携に必要です。
 
- /etc/tomcat4/server.xml <--Tomcatの設定ファイルです。
 
  1. /etc/httpd/conf/mod_jk.confの編集
一番下行の</IfModule>より上に、以下の行を追加します。
※通常は追加作業が必要ですが、今回はあらかじめ mod_jk.conf に
記述がありますので追加作業は必要ありません。記述があるか確認だけ行ってください。
  
    
      
Alias /test "/var/tomcat4/webapps/test" 
<Directory "/var/tomcat4/webapps/test"> 
	Options Indexes FollowSymLinks 
</Directory> 
jkMount /test/servlet/* ajp13 
jkMount /test/*.jsp ajp13 
<Location "/test/WEB-IF/"> 
	AllowOverride None 
	deny from all 
</Location>
 | 
    
  
  2. /etc/tomcat4/server.xmlの編集
207行目付近に以下のような記述がありますので、その下にtest用のエントリを追加します。
  
    
      
<-- 
  <Context path="" docBase="ROOT" debug="0"/> 
--> 
<Context path="/test" docBase="test" debug="0"/>
 | 
    
  
  Tomcatの設定作業は以上です。
  設定を反映させるため、Apache と Tomcat 両方のサービスを再起動してください。
  
| Tomcat の再起動 | 
    
      | # service tomcat4 restart |      
| Apache の再起動 | 
      | # service httpd restart | 
    
  
  以下のサーブレットとJSPは、同種の処理を実行し結果としてブラウザに表示を行います。
同様な処理を行う2つのファイルの違いを確認してみてください。
  JSPのテスト、jsptest.jspファイル
以下の内容のファイルをjsptest.jspとして作成するか、リンクよりダウンロードしてください。
  
    
      
<%@ page contentType="text/html;charset=euc-jp" %> 
<html> 
<head> 
<title>JSP TEST</title></head> 
<body> 
JSP のテストページです。 
<br> 
現在のサーバの時刻は<%= new java.util.Date() %>です。 
</body> 
</html> 
 | 
    
  
  jsptest.jspファイルを/var/tomcat4/webapps/test/に置きます。
  URL http://localhost/test/jsptest.jspにアクセスすると以下の表示が帰ってきます。
  サーブレットのテストservlettest.javaファイル
以下の内容のファイルをservlettest.javaとして作成するか、リンクよりダウンロードしてください。
  
    
      
import java.io.*; 
import java.util.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
 
public class servlettest extends HttpServlet { 
 public void doGet(HttpServletRequest req, HttpServletResponse res) 
  throws IOException, ServletException { 
   	res.setContentType("text/html; charset=euc-jp"); 
   	PrintWriter out = res.getWriter(); 
   	out.println("<html><head>"); 
   	out.println("<title>Servlet TEST</title>"); 
   	out.println("</head><body>"); 
   	out.println("サーブレットのテストページです。<br>"); 
   	out.println("現在のサーバーの時刻は"); 
   	Date nowtime = new Date(); 
   	out.println(nowtime); 
   	out.println("です。"); 
   	out.println("</body></html>"); 
 } 
} 
 | 
    
  
  servlettest.javaコンパイルします。
※コンパイル前に以下3つの環境変数を設定してください。
  
| 1.JAVA_HOME環境変数の設定 | 
    
      | $ export JAVA_HOME=/usr/lib/jdk |      
| 2.javac コマンドを実行するためのパス設定 | 
      | $ export PATH=$PATH:$JAVA_HOME/bin |      
| 3.基本的なservletをコンパイルするためのCLASSPATH設定 | 
      | $ export CLASSPATH=$CLASSPATH:/var/tomcat4/common/lib/servlet.jar | 
    
  
  
| 以下のコマンドを実行して servlettest.java ファイルをコンパイルします。 | 
    
      | $ javac servlettest.java |  
    
  
  
同じディレクトリにservlettest.classが生成されますので、
/var/tomcat4/webapps/test/WEB-INF/classes/に置きます。
サーブレットファイルを変更した場合、Tomcatの再起動が必要になりますので、rootユーザーで以下のコマンドを実行し再起動します。
(再起動が必要ない設定も可能です。)
  
    
      | 
# service tomcat4 restart
 | 
    
  
  
URL http://localhost/test/servlet/servlettestにアクセスすると以下の表示が帰ってきます。
  
※/var/tomcat4/webapps/test以下にはservletというディレクトリはありませんが、サーブレットの場合デフォルトではこのURLでアクセスします。
 
  - TomcatとOracleを連携させる方法
  
 Tomcatで動作しているアプリケーションから、Oracleに接続する場合、JDBCを利用します。
 例にはOracleデータベースが動作している環境が必要です。
 また、scott/tigerのサンプルデータベースも必要ですので、作成していない場合は、$ORACLE_HOME/rdbms/admin/utlsampl.sqlを実行して作成してください。
  Tomcat環境でOracleのJDBCドライバが利用できるようにします。
$OARCLE_HOME/jdbc/lib/classes12.jarファイルを/var/tomcat4/common/lib/にコピーします。
  
  
    
      | 
# cp $ORACLE_HOME/jdbc/lib/classes12.jar /var/tomcat4/common/lib/
 |  
    
  
  サーブレットにOracleへの接続処理を追加したテストoracletest.javaファイル
(ダウンロードしてご参照ください)
今回のJDBCによるデータベース接続処理は以下のステップ行います。
  
- JDBCドライバのロード
 
- 接続先データベースのURLを指定
 
- データベースとの接続を確立
 
- Statementオブジェクトを生成
 
- SQLを実行
 
- SQLの結果を処理
 
- データベースとの接続を切断
 
  ※エラー処理は解説していません、実際の開発時は必ず必要となります。
また、オーバーヘッドのより少ない他の接続処理方法もあります。
- クラスローダーによりJDBCドライバを呼び出します。
このメソッドに渡す引数は利用するデータベースとJDBCドライバにより変化します。
Class.forName("oracle.jdbc.driver.OracleDriver");
 
- 接続先のデータベースURLを指定します。URLはhttpのURLとは違います。
3.の getConnection のメソッドに直接記述することも可能ですが、いったん dburl 変数に格納しています。
記述例
jdbc:oracle:thin:@Oracleサーバー名:ポート番号:ORACLE_SID
String dburl = "jdbc:oracle:thin:@lknode1.miraclelinux.com:1521:o9202";
 
 
- 2.で設定した dburl を利用してデータベースとの接続を確立します。
dburl の後ろの引数はユーザー名とパスワードです。
Connection conn = DriverManager.getConnection(dburl,"scott","tiger");
 
 
- データベースとのSQL処理の橋渡しを行う Statementオブジェクトを生成します。
3.で確立されたコネクションオブジェクト conn  の createStatementメソッドを利用します。
Statement stmt = conn.createStatement();
 
- Statementオブジェクト の executeQuery()メソッド を利用して、SQL文を実行します。
実行するSQL文はexecuteQueryの引数として直接記述できますが、いったん sqlstr 変数に格納して利用しています。
SQL文の実行結果は、ResultSet オブジェクトの rsetとして取得します。
String sqlstr = "select empno,ename,sal from emp";
ResultSet rset = stmt.executeQuery(sqlstr);
 
- 5.で rset として取得されたSQL文の実行結果を上から順番に処理する場合は以下のような記述になります。
この例は結果からEMPNO列とENAME列とSAL列の値を上から下に向かって、すべて表示する処理です。
while (rset.next()) {
              String empno = rset.getString("empno");
              String ename = rset.getString("ename");
              String sal = rset.getString("sal");
              out.println("<tr><td> " + empno + "</td><td> " 
		+ ename + "</td><td>" + sal + "</td></tr>");
 
- 表示処理が終わり使わなくなったオブジェクトをクローズします。
  
    
      
rset.close(); 
stmt.close(); 
conn.close(); 
 | 
    
  
 
JDBCによるデータベース接続のステップは以上です。
以上のデータベース接続処理を記述したサーブレットファイル oracletest.javaをコンパイルします。
※コンパイル前に以下の環境変数を追加で設定してください。
  
| OracleのJDBCドライバclasses12.jar をコンパイルするユーザーのCLASSPATH環境変数に追加します。 | 
    
      | $ export CLASSPATH=$CLASSPATH:/var/tomcat4/common/lib/classes12.jar |     
  
  
| 以下のコマンドを実行して servlettest.java ファイルをコンパイルします。 | 
    
      | $ javac oracletest.java |  
    
  
コンパイルが正常に終了するとoracletest.classが同じディレクトリにできますので、/var/tomcat4/webapps/test/WEB-INF/classesに置きます。
サーブレットファイルを変更した場合、Tomcatの再起動が必要になりますので、rootユーザーで以下のコマンドを実行し再起動します。
(再起動が必要ない設定も可能です。)
  
    
      | 
# service tomcat4 restart
 | 
    
  
  
http://localhost/test/servlet/oracletestにアクセスすると以下のような結果が得られます。
 
  - Oracle9iASとの比較
Oracle9iASの特徴
   Oracle9iASはJ2EE準拠のアプリケーションサーバーです。
 EJBを利用した複雑かつ高機能なアプリケーションが開発可能です。
 Oracle独自の実装により、高速に動作します。CPUを効率良く利用していますので、Tomcatとくらべると、100ユーザーで2倍、200ユーザーで5倍とユーザー数が増えたときの処理能力差は歴然です。
 クラスタリングに対応しており、Oracle9iRACと連携したUnbreakableな環境が構築可能です。
 Oracle9i JDeveloperを利用した統合開発環境でのOracle9iDB他、多数のOracle製品と連携したアプリケーション開発が可能です。
|   | Oracle9iAS Release2 | Tomcat-4.0.6 | 
| J2EE | J2EE-1.3準拠 | JBossとの組み合わせで実現 | 
| クラスタ | EJBクラスタリング | Tomcat単体では不可 | 
| 統合開発環境 | Oracle9i JDeveloper | Eclipseプラグインを利用 | 
| GUIベースの管理機能 | Oracle Enterprise Manager | Tomcat-4.1.xより搭載 | 
   Oracle9iAS との比較のように商用製品ほどの機能は充実していませんが、Tomcat で利用していたほとんどのプログラムは、そのまま商用J2EE製品への移行が可能です。
 Tomcat は Servlet/JSP のためのリファレンス実装として開発が続けられ、すでに Tomcat-5 は一歩先のServlet2.4/JSP2.0へ向けて開発が着手されています。
 ぜひJAVAを利用したWebアプリケーション環境として体験してみてください。