频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

在应用中使用嵌入式Tomcat

来源: 作者:梁夏峰 出处:巧巧读书 2008-02-12 进入讨论组

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在工作时的层次情况,它按照:
<Server>
  <Service>
    <Connector />
    <Engine>
      <Host>
        <Context 1/>
  <Context 2/>
  <Context n…/>
      </Host>
    </Engine>
  </Service>
</Server>
这样的结构表明Tomcat Embeded工作时实例结构情况,一个Server含有1个Connector和1个Engine,其中Engine里含有1个Host,1个Host内可以含有多个Context,Context代表Web应用,即1个Host里可以包含多个Web应用。

接下来在创建开发应用的项目后,我们需要把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实例,把它加入2)创建的Engine中,它用来接收客户发出的请求。

具体和完整的代码如下:
package com.javayou.tomcat.embed;

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;

/**
 * @author Liang.xf 2004-12-19
 * 嵌入式Tomcat使用样例
 * www.javayou.com
 */
public class TomcatService {
 public static void main(String[] args) {
  //设置Tomcat的工作目录,并启动Tomcat Server
  String path = "e:\\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("JavayouServer");
  //创建Host,设置Host的工作目录
  Host host = tomcat.createHost("localhost", tomcat.getCatalinaHome()
    + "/webapps");
        //把Host加入Engine
  engine.addChild(host);
  engine.setDefaultHost(host.getName());
  
  String javayouPath = host.getAppBase() + "/javayou";
  if (!new File(javayouPath).exists()) {
   System.err.println("请检查Javayou应用的目录以及相关资源是否存在.");
   return null;
  }
  //创建Javayou的Context,并加入Host中
  Context ctxtJavayou = tomcat.createContext("/javayou", javayouPath);
  host.addChild(ctxtJavayou);
  
  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;
 }
}
编译后,开始建立运行环境,把在《Velocity之Web篇》创建的应用Copy到webapps里,应用目录名更名为javayou,作为演示用的Web应用,另外还需要把JDK下的Lib目录下的tool.jar Copy到运行的lib目录中,Tomcat使用它来进行预编译Jsp页面,我的运行命令参照如下:
java -cp .\; -Djava.ext.dirs=.\lib\lib_tomcat; com.javayou.tomcat.embed.TomcatService
(所有Tomcat Embeded带的.jar 和tool.jar位于.\lib\lib_tomcat目录内)
然后就可以看到熟悉的Tomcat启动打印 J


在应用中使用嵌入式Tomcat


 

打开IE,输入http://localhost:8080/javayou/index.jsp,就可以看到运行结果了,Jsp和Servlet在预编译的时候稍显有些慢,之后感觉就和Tomcat实际运行的差不多了。
如果需要设置Host中的默认Web应用,如把javayou设置成默认的Web应用,则参考下面例子:
//创建javayou的Context,虚拟路径为"",而物理路径设置为 ../javayou
Context ctxtJavayou = tomcat.createContext("",host.getAppBase() +"/javayou");
ctxtJavayou.setPrivileged(true);
host.addChild(ctxtRoot);
用来替换上面例子中ctxJavayou的创建,编译后重新启动服务,则通过http://localhost:8080/index.jsp也可以访问了。

在这里需要注意,由于嵌入式版本Tomcat没有common/lib目录,一些需要的Jar包可以复制到JDK的/jre/lib/endorsed目录下进行使用。

对于Tomcat5 Embeded版本的使用介绍就到这里。在我们的印象中AppServer是复杂而消耗资源的,能把一个Tomcat整合到你的应用中,是个有趣的想法,除此之外,它也可以让你方便的整合和调试具有后台应用的Web服务,也可以让你整改早前的胖客户应用程序,使它支持Web功能,还可以用来开发支持Web功能的自己的服务器,当然还可以扩展更多,但需要我们的有想法。此前javayou中的相关文章《在应用程序中嵌入HTTP服务引擎》,是基于Jetty的介绍,大家有兴趣也可以查阅。

URL查看 http://www.qqread.com/java/2008/02/e396834.html 更多文章 更多内容请看.NET移动与嵌入式技术专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章