Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2264162
  • 博文数量: 168
  • 博客积分: 6641
  • 博客等级: 准将
  • 技术积分: 1996
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-02 11:49
文章存档

2020年(4)

2019年(6)

2017年(1)

2016年(3)

2015年(3)

2014年(8)

2013年(2)

2012年(12)

2011年(19)

2010年(10)

2009年(3)

2008年(17)

2007年(80)

分类: LINUX

2007-10-24 19:17:25

将 Web 应用程序从 Apache Tomcat 迁移到 WebSphere Application Server Community Edition

 

 

 

 



级别: 初级

Sing Li (), 作家, Wrox Press

2005 年 12 月 01 日

本文阐释如何将 J2EE™ Web 层应用程序从 Apache Tomcat 5.5 迁移到 IBM® WebSphere® Application Server Community Edition V1.0。

如果您已经使用 Apache Tomcat 5.x 承载 Web 应用程序,并希望作为一种健壮的且对开发人员友好的开发和生产环境来评估 IBM WebSphere Application Server Community Edition V1.0,则本文可以帮助您开始进行工作。

本文中的信息有助于您深入了解 Tomcat 5.5 应用程序服务器和 WebSphere Application Server Community Edition 之间的实现差异。本文使用示例应用程序来演示循序渐进的应用程序迁移过程,主要说明两个实现之间的某些明显差异。首先,您需要将该应用程序部署到 Tomcat 5.5,然后执行迁移步骤并部署到 WebSphere Application Server Community Edition(以下称为 Community Edition)。

本文由以下部分组成:

将现有应用程序从一个供应商的服务器迁移到另一个供应商的服务器往往使人不堪重负。虽然有 J2EE 证书的担保,但是应用程序可能会使用供应商特定的功能和扩展,这一过程降低了应用程序资产在服务器之间的可移植性。然而,在 Tomcat 5.5 和 Community Edition 之间进行迁移时,不会出现这种问题。

您可以确信应用程序将在 Tomcat 5.5 和 Community Edition 1.0 之间平稳迁移的主要原因是:Tomcat 5.5 是 Community Edition V1.0 组的一部分,将 Tomcat 5.5 作为它的 Web 层容器进行了集成。因此,根本没有必要迁移到一个不同的 Web 层容器。图 1 演示了该 Tomcat 5.5 集成。



WebSphere Application Server Community Edition 中的 Tomcat 5.5 集成

在图 1 中可以看到,实际上您要使用与您已熟悉的 Tomcat 5.5 服务器完全相同的服务器;没有必要为 Community Edition 重新打包或重新配置 Tomcat 5.5 应用程序层资产。然而,在迁移应用程序时,您需要了解两者之间的差异。

存在这些差异的主要原因是:

  • Tomcat 5.5 如何集成到 Community Edition 容器;Community Edition 目前如何处理配置管理,
  • 并且功能齐全的 J2EE 1.4 服务器的资源现在可用于 Tomcat。

从本质上来说,您可以认为这是对 Tomcat 5.5 进行包装以用于一个更大的 J2EE 容器,同时向它提供容器服务,如内置 JNDI 支持、安全性、内置 EJB 支持、内置 JMS 代理和内置 RDBMS。

有了这种概念后,您将发现,要解决大多数与迁移有关的问题您需要做的所有事情就是如何或者在何处将等效的 Tomcat 5.5 的可配置功能映射到 Community Edition 容器中。找到这些映射后,Tomcat 5 容器的操作与正在使用的 Tomcat 5.5 服务器完全相同。在集成过程中,没有对 Tomcat 5.5 进行内部体系结构更改,只是对 Tomcat 5.5 进行包装并使其适合 Community Edition 容器。这确保了 Tomcat 服务器的更新版本(超过当前的 5.5 版本)可以在最短的可能时间集成到 Community Edition。

下表主要说明运行于单机版模式的 Tomcat 5.5 服务器和集成到 Community Edition 的服务器之间的一些明显差异。

表 1. Tomcat 5.5 和 Community Edition 1.0 功能比较
功能 单机版 Tomcat 5.5 WebSphere Application Server Community Edition 1.0
servlet 和 JSP 使用相同的引擎处理 Servlet 2.4 和 JSP 1.2 组件。 对于核心引擎,与 Tomcat 5.5 没有区别。
多个连接器 启用多个协议处理程序来访问相同的引擎。例如,HTTP 1.1 连接器可以在同一引擎上与 SSL 连接器一起工作。 保留了该功能。Community Edition Web 控制台可用于配置要使用的连接器。
JNDI 模拟 JNDI。通常您需要通过 server.xml 手动配置 JNDI 资源。 JNDI 可以访问 Apache Geronimo 内核管理的 GBean 或对象引用。
领域 Tomcat 中的领域是具有用户 ID 和密码信息的数据库。您可以通过 server.xml 或 context.xml 文件配置 Tomcat 中的领域。 Community Edition 支持容器管理的安全领域,可以在整个容器中按照统一的方式使用容器管理的安全领域,以便对 Community Edition 应用程序组件进行身份验证和授权。
虚拟主机 启用一个服务器来承载应用程序,以获得多个域名。您需要编辑 server.xml 来配置虚拟主机。 支持 Tomcat 的这一功能。您可能需要编辑 j2ee-tomcat-plan.xml 并将它重新部署到服务器。
Valve Valve 链可以与 Tomcat 组件相关联。您需要编辑 server.xml 或 context.xml。 支持 Tomcat 的这一功能。您可能需要编辑 j2ee-tomcat-plan.xml 并将它重新部署到服务器。
JDBC 数据源 可以配置为使用任何 JDBC 驱动程序。它还可以配置为将 Apache commons DBCP 用于合用 (pooling)。 Community Edition 利用 JCA 1.5 支持和 TranQL 实现通过 JDBC 访问各种 RDBMS。可以使用基于 Web 的 GUI 控制台执行配置。

需要注意的重要一点是 Community Edition 中没有 server.xml 或 context.xml 文件。现在 Community Edition 容器要处理所有配置管理。不过您需要根据自己的特殊需求修改两个部署计划中的某一个:j2ee-tomcat-plan.xml 文件或 geronimo-web.xml。

下面介绍的示例应用程序将展示实际迁移过程中的一些修改。





回页首


我们迁移的示例应用程序是使用 Web 层组件创建的 General Store 应用程序,Web 层组件包括:

  • JSP
  • servlet
  • JSP 标准标记库(JSP Standard Tag Library,JSTL)

该应用程序使用模型-视图-控制器(Model-View-Controller,MVC)的体系结构来路由请求,并且全部是无脚本(JSP 页面内没有嵌入式 Java 代码)的。

作为 Tomcat 5.5 应用程序,它还使用下面的 Tomcat 的特定功能:

  • 对用户进行身份验证的缺省的 Tomcat UserRealm。
  • 查找连接到外部 Derby 数据库的 JDBC 数据源的 JNDI。

图 2 演示了该应用程序的一般体系结构。



General Store 示例应用程序

在图 2 中,所有传入请求都被发送到控制器(MVC 体系结构)Servlet。该 Servlet 根据传入请求的参数将请求发送到两个 JSP 页面中的某一个页面。最初,请求被发送到显示产品目录的 generalstore.jsp。图 3 显示了 General Store 应用程序的产品目录页面。



应用程序目录页面

当您单击某个 BUY 超链接时,控制器会将请求发送到 checkoutcart.jsp 页面,该页面使您能够将多个项添加到购物车,清除购物车,或返回到购物。

generalstore.jsp 和 checkoutcart.jsp 都大量使用 JSTL 生成交互式购物车脚本;没有使用嵌入式 Java 代码。

名为 GerneralStore 的类具有一个方法,通过该方法,可以获得目录以及每个目录中的产品列表。在生产场景中,该类的实现可以连接到外部 RDBMS 以获得它们的数据。在本例中,为了保持简单实现具有硬编码的目录和产品信息。

要通过 JDBC 访问外部 RDBMS,checkoutcart.jsp 页面使用 RDBMS 获取今天的促销消息并将该消息显示给购物者。

本文的下载 ZIP 文件提供了组成示例应用程序的文件。表 2 概括介绍了组成应用程序的类和文件,并描述了它们的用途。

表 2. General Store 示例应用程序中的文件
文件 描述
generalstore.jsp 向用户呈现目录。
checkoutcart.jsp 向用户呈现购物车。将通过数据源(使用 JNDI 查找)访问 RDBMS 以显示促销消息。
generalstore.css 两个 JSP 页面所使用的用来格式化 HTML 元素的样式表。
StoreController.java 将请求发送到 JSP 的主控制器。还可以获得目录和产品信息,并将这些信息作为 JSP 的属性附加以进行显示。
GeneralStore.java 包含返回应用程序所需的数据的方法。还包含实现自定义标记库的功能(请参阅 generalstore-taglib.tld)。
Category.java
Proudct.java
LineItem.java
当数据在应用程序的模型和视图之间传送时,JavaBean 用于保存值。
generalstore-taglib.tld 实现为 GeneralStore.java 的方法的自定义标记库,这些方法用于 JSP。

要使用该示例应用程序,您必须下载以下应用程序并将它们安装到您的环境中:

  • .




回页首


通过转到代码目录并键入下面的命令,您可以构建示例应用程序:

ant war

这将在 dist 目录中创建一个名为 generalstore.war 的 WAR 文件。它是可以部署到 Tomcat 5.5 的 Web 应用程序存档文件。

缺省情况下,Tomcat 5.5 服务器在端口 8080 侦听请求。这是通过 Tomcat 5.5 安装目录下的 conf/server.xml 配置的。清单 1 显示了配置连接器的 server.xml 代码段。

清单1.server.xml 中的 Tomcat 连接器配置

  ...
  
  
   ...
    
    

如果您需要更改端口,则执行以下操作:

  1. 关闭服务器。
  2. port="8080" 更改为上面的 server.xml 代码段中需要的端口。
  3. 再次启动服务器。

在 Tomcat 中,领域维护用户、组和密码信息。缺省情况下,UserDatabaseRealm 在 Tomcat 5.5 中进行了配置,从而使您能够让用户在访问杂货店前对他们进行身份验证。此领域在 server.xml 文件中也进行了设置。清单 2 中的 server.xml 代码段的粗体行表示该身份验证领域的配置。

清单 2. server.xml 中的 Tomcat UserDatabaseRealm 配置
 
  ...
  
     

  
  ...
  
   ...
    
    ...
      
       ...

上面的配置对 UserDatabaseRealm 进行设置,以使用 conf/tomcat-users.xml 下面的文件维护用户、密码和角色信息。由于该领域是在 级配置的,因此它可以用于运行在 Tomcat 引擎上的所有主机。

要运行我们的应用程序,您不需要对 conf/server.xml 文件进行任何修改,因为缺省配置将为我们修改。然而,您需要对 conf/tomcat-users.xml 文件进行一些更改,其中 UserDatabaseRealm 保留所有用户信息。对 tomcat-users.xml 文件进行清单 3 中以粗体表示的更改。

清单 3. 在 tomcat-users.xml 中为 tomcat 用户添加管理和管理员角色


  
  
  
  
  

这分配tomcat 用户(密码为“tomcat”)角色为管理员和管理组的一部分。

在应用程序的 web.xml 文件中,存储的控制器受到保护,并且它只对具有 admin 角色的用户授予访问权限。清单 4 中的粗体行显示了保护应用程序的 web.xml 代码(在代码分配的 dd 目录中)。

清单 4. 对应用程序进行身份验证访问保护的 web.xml 部署描述符


    
   IBM Community Edition 1.0 Example 
    
    IBM Community Edition 1.0 General Store Example
   
      GeneralStore
      com.ibm.wasce.store.StoreController
   
   
     GeneralStore
     /store.cgi
   
   ...
   
      General Store Security Constraint
      
         Entire store
    *.cgi
  
      
         admin
      
    
    
      BASIC
      Shopping Realm
    
  
      admin
    
...


以上代码中的 元素是标准的 J2EE 安全性配置元素,并且在容器之间是可移植的。因此,未改变的 web.xml 稍后可以在 Community Edition 环境中工作。然而,您在 Tomcat 中部署和使用应用程序之前,应该设置该应用程序要访问的 Derby RDBMS。

首先,请确保包装 Apache Derby 10.1。将 DERBY_INSTALL 环境变量设置为 Derby 安装目录,并确保 CLASSPATH 环境变量中包含下列元素:

  • lib/derby.jar
  • lib/derbytools.jar
  • lib/derbynet.jar
  • lib/derbyclient.jar

在源代码分配中,提供的 sp.bat 文件可用于设置这些变量。如果您使用该批处理文件,请确保首先对其进行修改,以反映您自己实际的 Derby 安装目录。然后,您可以使用以下命令在控制台窗口中启动 Derby 网络服务器:

java org.apache.derby.drda.NetworkServerControl start

Derby 服务器启动并在缺省端口 1527 进行侦听。

接下来,创建要使用的数据库。数据库名为 generalstore,它只包含一个名为 promotions 的表。createdb1.sql 文件将执行该创建并填充数据库。

使用 ij 命令执行 SQL 脚本:

java  org.apache.derby.tools.ij  createdb1.sql

createdb1.sql 脚本包含清单 5 所示的 SQL 命令。

清单 5. createdb1.sql 脚本:创建数据库表并填充数据
connect 'jdbc:derby://localhost/generalstore;create=true';
drop table promotion;
create table promotion
  (id char (5) not null,
   message char(40) not null,
   primary key(id));
insert into promotion values ('1', 'Thank your for your order.');
insert into promotion values ('2', 'Have a nice day!');
exit;

如果您看到消息 ERROR 08001: No suitable driver,则所需的 lib/derbyclient.jar 库不在 CLASSPATH 环境变量中。

checkoutcart.jsp 页面使用 JSTL 的 SQL 支持标记访问促销数据库并输出促销消息。清单 6 显示访问 RDBMS 的代码摘录。

清单 6. 访问数据库服务器的 checkoutcart.jsp 中的 JSP 代码 ...
<%@ taglib prefix="c" uri="" %>
<%@ taglib prefix="fmt" uri="" %>
<%@ taglib prefix="storetags" uri="/GeneralStoreTagLibrary" %>
<%@ taglib prefix="sql" uri=""  %>
 ...

select * from promotion

 ...
${row.message}

JSTL 标记将通过 JNDI 查找名为 jdbc/storeDB 的数据源。该名称引用是以 J2EE 标准方式在应用程序的 web.xml 部署描述符中定义的。该标准配置适用于 Tomcat 5.5 和 Community Edition。清单 7 显示该配置。

清单 7. 指定 JNDI 数据源引用的 web.xml 中的元素

      Derby DB connection
      jdbc/storeDB
      javax.sql.DataSource
      Container


现在,您需要配置该引用,以匹配实际的 JDBC 驱动程序和 RDBMS 连接。这是通过一种容器的特定方式完成的,对于 Tomcat 和 Community Edition 来说有所不同。对于 Tomcat 5.5,可以在 META-INF/context.xml 文件(位于 dd 目录)中进行配置(清单 8)。

清单 8. 将 JNDI 资源与 Derby JDBC 连接器相关联的 Tomcat 的特定 context.xml 描述符




此处,Derby JDBC 驱动程序 org.apache.derby.jdbc.ClientDriver 用于在 URL jdbc:derby://localhost/generalstore 访问数据库。Derby 服务器具有缺省的用户“APP”和密码“APP”。

要使用自定义设置部署应用程序 WAR 文件,请启动 Tomcat 5.5 服务器并在 Web 浏览器中指向:


您将被提示登录;这要使用我们先前设置的 UserDatabaseRealm。由于需要管理人员角色,因此使用用户“tomcat”和密码“tomcat”。

管理器应用程序将显示所有部署的模块。滚动到底部,此处有一个框“Deploy directory or WAR file located on server”。对于“Context path”,输入 /Shopping,而对于“WAR or Directory URL”,输入到 generalstore.war 文件的绝对路径。按下 Deploy 按钮。现在您应该看到运行于 /Shopping 上下文的 General Store 应用程序。图 4 显示成功部署后的管理器应用程序。



使用 Tomcat 管理器成功部署应用程序

使用下面的 URL 尝试访问应用程序:


向购物车添加某物。请注意,将显示促销消息。这表明 Derby RDBMS 可以获取这些消息。





回页首


通常,要将 General Store 应用程序迁移到 Community Edition 1.0,您需要执行以下操作:

  • 对 Tomcat UserDatabaseRealm 进行配置并将它替换为 Community Edition 容器管理的身份验证领域。
  • 启动并使用 Community Edition 附带的 IBM Cloudscape™ RDBMS(基于 Derby),而不是单机版 Derby。
  • 创建 Community Edition 管理的新数据源。
  • 创建所需的数据库表并为其填充数据。
  • 配置指向 Community Edition 中的 Cloudscape 数据源的 JNDI 引用。

迁移过程中不需要更改的元素有:

  • web.xml 中对数据源的 JNDI 引用。
  • web.xml 中保护应用程序的安全性配置。

对于这些元素,要小心进行编码,以使其在 J2EE 容器之间可以移植。

如果您需要在 Community Edition 中更改 Tomcat 连接器使用的端口,不要查找 server.xml 文件;Community Edition 中没有这个文件。取而代之,要在 Community Edition 安装目录下的 var/config 目录中查找 config.xml 文件。清单 9 显示包含 Tomcat 配置元素的 config.xml 的摘录,其中端口号以粗体表示。

清单 9. Community Edition 的 config.xml 文件中的 Tomcat 连接器配置

      0.0.0.0
      8080
      8443
      var/catalina
    
    
      0.0.0.0
      8009
      8443
    
    
      0.0.0.0
      8443
    

如果您在 config.xml 中更改端口号并重新启动 Community Edition,则 Tomcat 将使用最新配置的端口。

另外,您也可以使用 Web 控制台添加 Tomcat 连接器或者编辑连接器使用的端口号。只需在 Web 控制台菜单中选择 Server => Web Server

缺省情况下,Community Edition 管理名为“geronimo-properties-realm”的领域,该领域使用 var/security 目录下的属性文件存储它的用户、密码和组信息。该领域中配置的唯一用户是密码为“manager”的“system”,它属于“admin”组/角色。

该领域实际上是在缺省的 Tomcat Host 组件中配置的。您可以在 doc/plan 目录中的名为 j2ee-tomcat-plan.xml 的部署计划中看到该配置;该部署计划等效于可以在 Tomcat 5.5 服务器找到的 server.xml 文件。清单 10 显示在 Host 配置领域的代码。

清单 10. j2ee-tomcat-plan.xml 中领域在 Tomcat Engine 组件的缺省配置
    
        org.apache.geronimo.tomcat.TomcatEngine
        
            name=Geronimo
            defaultHost=0.0.0.0
        
        
            
                geronimo.server:j2eeType=Host,*
            
        
        
            TomcatJAASRealm
        
        
            FirstValve
        
    

在 Community Edition 配置中,Tomcat 中的所有组件(Engine、Host,等等)都包装在 GBean 中。j2ee-tomcat-plan.xml 文件实质上是 GBean 的连接关系图,它等效于 server.xml。

在本例中,我们不需要修改缺省配置,但是如果您修改 Tomcat 系统配置(如添加虚拟主机),则需要使用以下命令重新部署计划:

deploy -user system -password manager redeploy new-j2ee-tomcat-plan.xml org/apache/geronimo/Tomcat

如果出现问题,维护初始计划的副本。

要在 General Store 应用程序中使用缺省领域,您需要为 Web 应用程序创建 Community Edition 的特定部署计划。该计划名为 geronimo-web.xml,如果将它放在 WEB-INF 目录中,它可以作为 WAR 文件的一部分。清单 11 显示如何指定应用程序的容器领域:

清单 11. 为应用程序配置 Community Edition 容器管理的身份验证领域

    /Shopping
    false
    ...
    geronimo-properties-realm
   
        
            
        
        
        
          
          
          
            
            
        
   

   

请注意,在清单 12 中将 设置为“/Shopping”,以在与 Tomcat 5.5 版本相同的上下文路径中访问 Community Edition 应用程序。

>security-realm-name> 指定 geronimo-properties-realm。>security> 元素指定 geronimo-properties-realm 的角色如何映射到 web.xml 中的 >security-constraint> 元素引用的角色。

请确保关闭单机版 Derby,因为它在相同的端口 (1527) 侦听,这会产生冲突。

在 Community Edition 运行后,登录到控制台,然后选择 Application => J2EE Connectors。启动称为 org/apache/geronimo/DefaultDatabase 的配置,这是一个网络数据库实例。

启动 org/apache/geronimo/DefaultDatabase 配置后,Cloudscape 网路服务器要在标准端口 1527 侦听请求,您可以使用 ij 命令运行 createdb1.sql 脚本:

java  org.apache.derby.tools.ij  createdb1.sql

该命令将创建所需的数据库和表,从而使用网络驱动程序访问 Cloudscape 数据库实例。

要创建 Community Edition 管理的数据源,请使用控制台并选择 Applications => Database Pools。在右侧窗格中单击 Add New Datasource。使用表 3 中的值创建数据源。

表 3. 创建 Community Edition 管理的数据源
字段
Name StoreDatasource
JNDI Name 留空
Dependency 从列表中选择 org.apache.derby/jars/derbyclient-10.1.ibm.jar。
Driver Classname org.apache.derby.jdbc.ClientDriver
DB URL jdbc:derby://localhost/generalstore
DB User Name APP
DB Password APP
Pool Max Capacity 20
Pool Initial Capacity 10

按下 Create 按钮,创建 Community Edition 管理的名为 StoreDatasource 的池化数据源。该数据源被设置为访问 Cloudscape 网络服务器的 Community Edition 管理的实例。

成功部署后,就创建并启动了名为 StoreDatasource 的新配置。您可以通过在控制台菜单中单击 Applications => All Configurations Applications => J2EE Connectors 看到此配置。图 5 显示在选择 J2EE Connectors 后运行的 StoreDatasource 配置。



处于运行状态的 StoreDatasource

通过使用 geronimo-web.xml 部署计划中的 元素,您可以将 StoreDatasource 与 jdbc/storeDB 的 web.xml JNDI 引用相关联,如清单 12 所示。

清单 12. 将容器管理的 StoreDatasource 与应用程序的 JNDI 资源引用相关联

        jdbc/storeDB
        
          StoreDatasource
        


先前在 Tomcat 5.5 中配置该关联时,它使用 context.xml 文件。在 Community Edition 中,与 context.xml 等价的文件是 geronimo-web.xml 文件。这里执行的配置只影响本地应用程序上下文。





回页首


您可以使用以下命令将 generalstore.war 文件部署到 Community Edition 1.0:

deploy -user system -password manager deploy generalstore.war

您也可以通过在控制台单击 Applications => All Configurations 并使用右侧窗格中的 Install New Application 框来部署 generalstore.war 文件。

部署应用程序后,您可以使用浏览器在相同的 URL 访问它:


当提示您登录/进行身份验证时,使用“system”作为用户名,“manager”作为密码。在尝试向购物车放入某物时,您将注意到现在应用程序从 Cloudscape 获取数据并显示促销消息:Thank you for your order. Have a nice day!,如图 6 所示。



RDBMS 中具有促销消息的购物车




回页首


将应用程序从 Tomcat 5.5 迁移到 WebSphere Application Community Edition 1.0 是相当简单的,因为完整的 Tomcat 5.5 已进行集成,实际上它是 Community Edition 的一部分。然而,由于 Community Edition 执行所有配置管理,因此 Tomcat 用户在 server.xml 或 context.xml 中找到的配置元素要迁移到:

  • config.xml:用于快速更改参数(如连接器的端口号)。
  • j2ee-tomcat-plan.xml:用于 Tomcat 组件(如虚拟主机、领域和 valve 配置);在该计划中进行的修改必须重新部署到服务器才能起作用。
  • geronimo-web.xml:应用程序上下文的 Community Edition 的特定部署计划;它位于档案文件的 WEB-INF 目录中。

通过将 Web 应用程序从 Tomcat 5.5 逐步迁移到 WebSphere Application Server Community Edition,我们看到该迁移的要点包括:转换身份验证领域、JNDI 引用映射、设置 Cloudscape 网络服务器以及配置 JDBC 连接器。






回页首


描述 名字 大小 下载方法
Sample General Store application Tomcat-to-WASCE-sampleapp.ZIP 1 MB  |
关于下载方法的信息


学习

获得产品和技术



讨论


Sing Li 的照片

Sing Li 是顾问兼自由撰稿人。他编写了 、、Early Adopter JXTAProfessional Jini、和其他许多书籍。他定期向技术杂志投稿,并且还是 VON 和 P2P 发展的积极倡导者。您可以通过 与 Sing 联系。

阅读(3228) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~