Tomcat5中的Embeded版本,為應用中集成完整的Web服務提供了盡可能大的空間,不僅使開發者容易獲得對標準HTTP的處理,還有SSL的通訊處理,使開發者很容易就可以對原有非Web系統進行擴展以支持瘦客戶端應用,通向Web大門的鑰匙已經放在這里,剩下的就是看你怎樣來發揮了。

Tomcat嚴格意義上不是一個真正的AppServer,只是支持運行Servlet和Jsp的Web容器,此外擴展了一些AppServer的功能,如數據庫連接池,JNDI等,如何提煉,或者說把Tomcat整理成一個最小的集合成為Tomcat嵌入版本的關鍵,從Tomcat5.0開始提供和支持Embeded版本,即最簡化Tomcat Server,下面就針對Tomcat Server的Embeded版本進行介紹,怎樣把Tomcat集成到Java應用中。

首先可以在http://apache.mirrors.versehost.com/jakarta/tomcat-5/v5.0.28/bin/jakarta-tomcat-5.0.28-embed.tar.gz下載Tomcat的Embeded版本,下載解壓后把最里層的jakarta-tomcat-5.0.28-embed目錄copy到容易查找的目錄,為簡易需要更名為tomcat-embed,作為嵌入Tomcat的工作目錄。

首先我們需要了解Tomcat在工作時的層次情況,它按照:

上面是Tomcat實現的內部工作結構:

一個Server含有幾個Connector,比如non-SSL HTTP/1.1 Connector on port 8080,SSL HTTP/1.1 Connector on port 8443和AJP 1.3 Connector on port 8009。連接器就是接受客戶端情況然后封裝成request和response對象交給容器處理。

通常是一個Engine,其中Engine里含有1個Host,1個Host 內可以含有多個Context,Context代表Web應用,即1個Host里可以包含多個Web應用,tomcat的webapps目錄里面防止的就是一個個web應用。Engine接收Service發過來的請求(通過Connector),交給相應的Host進行處理,然后Host交給具體的Context。

下面是非常簡單的創建Embeded tomcat的例子,示意其使用

把tomcat-embed目錄下的lib內的所有jar包引入到項目的環境中,即完成了項目的環境搭建。在應用里開發嵌入式Tomcat,需要根據以下步驟:
1)創建org.apache.catalina.startup.Embedded實例,其代表嵌入式Tomcat Server的實例;
2)創建org.apache.catalina.Engine 實例,代表上面XML結構示例中的Engine,作為容器用來包含Host節點;
3)創建org.apache.catalina.Host實例,代表虛擬主機服務,把它加入到2)中產生的Engine;
4)創建一個或多個org.apache.catalina.Context實例,代表Web應用,每個Web應用都需要加入到3)產生的Host中;
5)最后創建org.apache.catalina.Connector實例,把它加入1)創建的tomcat實例中,它用來接收客戶發出的請求。

具體和完整的代碼如下:
import java.io.File;
import java.net.InetAddress;
import java.net.UnknownHostException;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Host;
import org.apache.catalina.Logger;
import org.apache.catalina.startup.Embedded;


public class TomcatService {
public static void main(String[] args) {
   //設置Tomcat的工作目錄,并啟動Tomcat Server
   String path = "/usr/local/tomcat-embed";
   Embedded tc = createTomcat(path);
   try {
    tc.start();
    System.out.println("---------- Tomcat Server start over. ------------");
   } catch (Exception e) {
    e.printStackTrace();
   }  
}

private static Embedded createTomcat(String path) {
     //創建嵌入式Tomcat Server的實例
   Embedded tomcat = new Embedded();
        //設置Tomcat的工作目錄
   tomcat.setCatalinaHome(path);
        //產生Tomcat引擎
   Engine engine = tomcat.createEngine();
   engine.setName("EmbededServer");
   //創建Host,設置Host的工作目錄
   Host host = tomcat.createHost("localhost", tomcat.getCatalinaHome()
     + "/webapps");
        //把Host加入Engine
   engine.addChild(host);
   engine.setDefaultHost(host.getName());
  
   String path = host.getAppBase() + "/instance1";
   if (!new File(path).exists()) {
    System.err.println("請檢查instance1應用的目錄以及相關資源是否存在.");
    return null;
   }
   //創建instance1的Context,并加入Host中
   Context ctxt = tomcat.createContext("/instance1", path);
   host.addChild(ctxt);
  
   tomcat.addEngine(engine);
   tomcat.setDebug(Logger.WARNING);
   try {
      //Tomcat加入Connector,監聽本地(127.0.0.1)的訪問
    tomcat.addConnector(tomcat.createConnector(InetAddress
      .getByName("127.0.0.1"), 8080, false));
   } catch (UnknownHostException e) {
    System.err.println("綁定Tomcat Server到127.0.0.1:8080失敗,請檢查端口是否被占用.");
    e.printStackTrace();
    tomcat = null;
   }
   return tomcat;
}
}

在這里需要注意,由于嵌入式版本Tomcat沒有common/lib目錄,一些需要的Jar包可以復制到JDK的/jre/lib/endorsed目錄下進行使用。


在OFBiz中默認使用的embeded tomcat,具體的可以參考里面對于嵌入式啟動相關的內容。