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,具體的可以參考里面對于嵌入式啟動相關的內容。