歡迎您光臨本站 註冊首頁
  
本文逐步地指導您將一個應用程序部署到 Tomcat 6.0,然後遷移代碼並將其部署到 WebSphere® Application Server Community Edition V2.1。該示例應用程序突出說明了這兩種實現之間的一些顯著差異。

引言

現在就下載 Community Edition V2.1!
IBM WebSphere Application Server Community Edition V2.1 可供免費使用和部署。現在就下載它,以開始後面的工作。

IBM WebSphere Application Server Community Edition(以下稱為 Community Edition)是一個 Java™ Enterprise Edition 5 (Java EE5) 認證應用程序伺服器,其中包含用於數據 (Apache Derby)、消息服務 (Active MQ)、Web 服務 (Apache Axis) 等的集成組件。

Community Edition 是使用 Geronimo Beans (GBean) 體系結構來構建的,並將 Apache Geronimo 作為其核心。Community Edition 的很小內存佔用空間、易用性、免費可用性和 IBM 世界級的可選支持,使其對於中小型組織的來說非常理想。

Apache Tomcat 是由 Apache Software Foundation 開發的 Web 容器。它實現了 Java Servlet 和 Java Server Pages API。Tomcat Version 6.0.x 實現了 Java Servlet 2.5 和 Java Server Pages 2.1 API。

雖然本文將指導您把一個示例應用程序從 Tomcat 6.0.x 遷移到 Community Edition 2.1,但是從 Tomcat 5.x 進行遷移也是非常相似的。Tomcat Version 5.x 實現了 Java Servlet 2.4 和 Java Server Pages 2.0 API,並且 Community Edition 2.1 與這些版本向後兼容。然而,在如何定義配置方面可能存在一些差異。

本文指導您將一個在 Apache Tomcat 上開發的應用程序遷移到 Community Edition。我們在 Tomcat 和 Community Edition 上使用了 Eclipse IDE 來進行應用程序開發。本文將按以下部分進行組織:

  • 體系結構分析——相似性和區別
  • 關於示例應用程序
  • 設置 Tomcat 以進行應用程序部署
  • 在 Tomcat 中部署應用程序
  • 將應用程序遷移到 Community Edition
  • 從 Community Edition WAR 文件中刪除不需要的服務
  • 在 Community Edition 中部署應用程序
  • 遷移問題故障排除




體系結構分析——相似性和區別


圖 1. Geronimo (Community Edition) 體系結構

如圖 1 所示,Community Edition 遵循組件體系結構。它包含來自各個開放源代碼社區的最佳品種的開放源代碼產品。Apache Tomcat 是 Community Edition 的預設 Web 容器,因此您可以容易地將 Tomcat 上開發的應用程序遷移到 Community Edition。

在使用 Community Edition 時,您將使用與 Tomcat 的獨立版本相同的 Tomcat 伺服器。因此,您不需要針對 Community Edition 重新對應用程序打包。然而,在將應用程序從 Tomcat 遷移到 Community Edition 時,您需要解決它們之間存在的一些差異。出現這些差異的原因在於,Tomcat 是作為 Community Edition 中的一個服務來部署的,以提供可用於 Java EE5 認證應用程序伺服器的功能;而不只是一個 Servlet 容器。Community Edition 中的 Tomcat 與其他已部署的容器服務集成在一起,例如:

  • JMS (Apache ActiveMQ)
  • 資料庫 (Apache Derby)
  • EJB (Apache OpenEJB)
  • Web 服務 (Apache Axis)
  • 持久性 (Apache OpenJPA)
  • 日誌記錄
  • 安全性

為了克服大多數遷移問題,您需要弄清 Tomcat 中的每個服務如何映射並應用到 Community Edition。Tomcat 的基本體系結構是相同的,但是在 Community Edition 中將其定義為一個 gbean。這種實現使得更新版本的 Tomcat 能夠容易地集成到將來的 Community Edition 版本中。

下表說明了獨立 Tomcat 與運行在 Community Edition 中的 Tomcat 之間的主要區別和相似之處:


表 1. Tomcat V6.0.x 和 Community Edition V2.1 功能比較
功能 Tomcat Community Edition
Java Servlet 實現 Servlet 2.5 API 實現 Servlet 2.5 API
Java Server Pages 實現 JSP 2.1 API 實現 JSP 2.1 API
JNDI 一般通過 server.xml 進行手動配置 JNDI 能夠訪問由 Geronimo 內核管理的對象引用
JMS 在 context.xml 中進行手動配置 可以使用基於 Web 的 GUI 來創建 JMS 資源
JDBC 數據源 在 context.xml 中進行手動配置 可以使用基於 Web 的 GUI 來創建 JDBC 資源
Web 服務 (Apache Axis) Axis.war 的部署引入 WebServices 功能 Axis 已預先集成到 Community Edition 中。
安全領域 使用 server.xml 或 context.xml 文件進行配置 支持容器管理的領域,這些領域可用於所有組件的授權。還可以定義單獨的組件領域。
多個連接器 多個協議處理程序訪問同一個引擎。HTTP 連接器可以與同一個引擎上的 SSL 連接器一起工作 可以使用管理控制台來配置各個連接器,包括 HTTP、SSL 以及用於負載平衡和集群的 Apache JServ 協議 (AJP13)
虛擬主機 支持在同一個 IP 地址上承載不同的網站。可以使用 server.xml 來對此進行配置 可以通過配置config.xml 實現相同的功能
部署描述符 web.xml 是 J2EE Web 應用程序 (WAR) 的預設部署描述符 web.xml 是 J2EE Web 應用程序 (WAR) 的預設部署描述符
部署計劃 沒有特定於供應商的部署描述符 Community Edition 具有特定於 Geronimo 的部署描述符,用於配置特定於 Geronimo 的服務。對於 Web 應用程序,geronimo-web.xml 是部署計劃。

在 Community Edition 中,大多數配置可以使用以下部署計劃之一來完成:geronimo-web.xml、config.xml 或 config-substitution.properties。您還可以使用基於 Web 的管理控制台添加資源,例如 JMS 隊列、連接工廠和 JDBC 數據源。該控制台簡化了配置管理,而在 Tomcat 中則是使用 server.xml 和 context.xml 進行手動配置。





關於示例應用程序

我們從 Tomcat V6.0.x 遷移到 Community Edition V2.1 的示例應用程序是使用了以下組件的通用商店應用程序:

  • JSP
  • Servlet
  • JSP 標準標記庫(JSP Standard Tag Library,JSTL)
  • Apache Derby JDBC 數據源
  • 基於 Apache ActiveMQ 的 JMS
  • 基於 Apache Axis 的 Web 服務

該應用程序還使用預設的 Tomcat UserRealm 對用戶進行身份驗證,而 Community Edition 則使用預設的 geronimo-admin 領域。

本文包括的示例應用程序由單個 WAR 模塊組成,其中包含以下內容:

  • generalstore.jsp——向用戶呈現購物目錄。通過外部 Web 服務顯示當前 IBM 股票價格。
  • checkoutcart.jsp——向用戶呈現購物車。通過 Derby 數據源使用 RDBMS 顯示促銷消息。通過外部 Web 服務顯示 IBM 股票價格。
  • generalstore.css——樣式表,用于格式化兩個 JSP 頁面所使用的 HTML 元素。
  • StockService.wsdl——描述 Web 服務的位置以及服務中可用的方法。您將使用此 WSDL 文件來生成所需的 Java 類,並使用 Eclipse 工具來生成這些類文件。
  • StoreController.java——主控制器,用於將請求分派到 JSP。還可以獲得目錄和產品信息,並將這些信息作為 JSP 的屬性附加以進行顯示。
  • GeneralStore.java——包含返回應用程序所需數據的方法。還包含實現自定義標記庫的功能(請參見 generalstore-taglib.tld)。
  • Category.java、Product.java、LineItem.java——當數據在應用程序的模型和視圖之間傳輸時用於保存值的 JavaBean。
  • CheckOut.java——完成訂單並將訂單發送給庫存管理器。




設置 Tomcat 以進行應用程序部署

Tomcat 連接器配置

預設情況下,Tomcat 伺服器在埠 8080 上偵聽請求。要更改此預設埠,您可以修改 <Tomcat_Home>/conf/server.xml。清單 1 顯示了更改預設埠配置所需要的修改。


清單 1. server.xml 中的 Tomcat 連接器配置
<Service name="Catalina">       ...       ...  <Connector port="8080"    protocol="HTTP/1.1"    connectionTimeout="20000"   redirectPort="8443" />  

將埠值更改為您喜歡的任何埠。請記住在對 server.xml 做出任何配置更改之前停止伺服器。重新啟動伺服器以使設置生效。

Tomcat 身份驗證領域配置

在 Tomcat 中,領域維護用戶、組和密碼信息。預設情況下,您在 Tomcat 中配置一個 UserDatabaseRealm,從而使您能夠在允許用戶訪問商店之前對他們進行身份驗證。server.xml 文件也設置了此領域。清單 2 中的 server.xml 代碼段中粗體顯示的行表示該身份驗證領域的配置。


清單 2. server.xml 中的 Tomcat UserDatabaseRealm 配置
<Server port="8005" shutdown="SHUTDOWN">       ...      <GlobalNamingResources>      <Resource name="UserDatabase" auth="Container"                type="org.apache.catalina.UserDatabase"                description="User database that can be updated and saved"                factory="org.apache.catalina.users.MemoryUserDatabaseFactory"                pathname="conf/tomcat-users.xml" />    </GlobalNamingResources>    ...     <Service name="Catalina">          <Connector port="8080" protocol="HTTP/1.1"                  connectionTimeout="20000"                  redirectPort="8443" />          ...          <Realm className="org.apache.catalina.realm.UserDatabaseRealm"               resourceName="UserDatabase"/>  

上面的配置將 UserDatabaseRealm 設置為使用 conf/tomcat-users.xml 下面的一個文件來維護用戶、密碼和角色信息。由於該領域是在 <Engine> 級別配置的,因此它對運行在 Tomcat <Engine> 組件實例上的所有主機可用。

要運行我們的應用程序,您不必對 conf/server.xml 文件進行任何修改,因為原樣的預設配置就適合我們的需要。但是,您確實需要對 conf/tomcat-users.xml 文件做出某些更改,其中 UserDatabaseRealm 保存了所有的用戶信息。對 tomcat-users.xml 文件進行清單 3 中以粗體表示的更改。


清單 3. 在 tomcat-users.xml 中為 Tomcat 用戶添加管理員和管理器角色
<?xml version='1.0' encoding='utf-8'?>  <tomcat-users>    <role rolename="tomcat"/>    <role rolename="role1"/>    <user username="tomcat" password="tomcat" roles="tomcat,manager,admin"/>    <user username="role1" password="tomcat" roles="role1"/>    <user username="both" password="tomcat" roles="tomcat,role1"/>  </tomcat-users>  

此代碼將 tomcat 用戶(密碼為“tomcat”角色分配為 manager 和 admin 組的成員。

在該應用程序的 web.xml 文件中,商店的控制器受到保護,並且它只對具有“admin”角色的用戶授予訪問許可權。清單 4 中的粗體行顯示了保護應用程序的 web.xml 代碼(在代碼分發包的 dd 目錄中)。


清單 4. 對應用程序進行身份驗證訪問保護的 web.xml 部署描述符
<?xml version="1.0" encoding="UTF-8"?>  <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns="http://java.sun.com/xml/ns/javaee"     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee      http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"     id="WebApp_ID" version="2.5">    <display-name>ShoppingStore</display-name>    <welcome-file-list>      <welcome-file>index.html</welcome-file>      <welcome-file>index.htm</welcome-file>      <welcome-file>index.jsp</welcome-file>      <welcome-file>default.html</welcome-file>      <welcome-file>default.htm</welcome-file>      <welcome-file>default.jsp</welcome-file>    </welcome-file-list>    <servlet>      <servlet-name>GeneralStore</servlet-name>      <servlet-class>com.ibm.wasce.store.StoreController</servlet-class>    </servlet>    <servlet-mapping>      <servlet-name>GeneralStore</servlet-name>      <url-pattern>/store.cgi</url-pattern>    </servlet-mapping>    <resource-ref>      <description>Derby DB connection</description>      <res-ref-name>jdbc/storeDB</res-ref-name>      <res-type>javax.sql.DataSource</res-type>      <res-auth>Container</res-auth>    </resource-ref>    <security-constraint>      <display-name>General Store Security Constraint</display-name>      <web-resource-collection>        <web-resource-name>Entire store</web-resource-name>        <url-pattern>*.cgi</url-pattern>      </web-resource-collection>      <auth-constraint>        <role-name>admin</role-name>      </auth-constraint>    </security-constraint>    <login-config>      <auth-method>BASIC</auth-method>      <realm-name>Shopping Realm</realm-name>    </login-config>    <security-role>      <role-name>admin</role-name>    </security-role>    <servlet>      <description></description>      <display-name>CheckOut</display-name>      <servlet-name>CheckOut</servlet-name>      <servlet-class>com.ibm.wasce.store.CheckOut</servlet-class>    </servlet>    <servlet-mapping>      <servlet-name>CheckOut</servlet-name>      <url-pattern>/CheckOut</url-pattern>    </servlet-mapping>  </web-app>  

上面的代碼中的 <security-constraint>和 <security-role> 元素是標準 J2EE 安全配置元素,並且在容器之間是可移植的。因此,未改變的 web.xml 稍後可以在 Community Edition 環境中工作。

設置 Derby 網路伺服器

首先,請確保安裝了 Apache Derby 10.3.1。然後按照以下步驟操作:

  1. 將 DERBY_INSTALL 環境變數設置為您的 Derby 安裝目錄。在 CLASSPATH 環境變數中包括以下元素:
    • lib/derby.jar
    • lib/derbytools.jar
    • lib/derbynet.jar
    • lib/derbyclient.jar
  2. 使用以下命令啟動 Derby 伺服器:
    	java org.apache.derby.drda.NetworkServerControl start  

    Derby 伺服器啟動並在預設埠 1527 進行偵聽。

  3. 創建名為 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 環境變數中。

設置 Apache ActiveMQ JMS 代理

確保安裝了 apache-activemq-4.1.1,然後執行以下步驟:

  1. 在 CLASSPATH 環境變數中包括以下元素。
    • lib/activeio-core-3.0.0-incubator.jar
    • lib/commons-logging-1.1.jar
    • <ActiveMQ_HOME>/apache-activemq-4.1.1.jar
  2. 通過運行 activemq.bat 腳本啟動 ActiveMQ 代理。您可以在 <ActiveMQ_HOME>/bin 中找到此腳本。

設置 Apache Axis

在 CLASSPATH 環境變數中包括以下元素。您可以從 Eclipse 中自動下載下面提到的 JAR。有關更多信息,請參閱“從 Community Edition WAR 文件中刪除不需要的服務”。

  • wsdl4j-1.5.1.jar
  • saaj.jar
  • jaxrpc.jar
  • axis.jar

Tomcat JNDI 資源引用和 JDBC 連接器

checkoutcart.jsp 頁面使用 JSTL 的 SQL 支持標記訪問促銷資料庫並輸出促銷消息。清單 6 顯示了訪問 RDBMS 的代碼摘錄。


清單 6. 訪問資料庫伺服器的 checkoutcart.jsp 中的 JSP 代碼
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>  <%@ taglib prefix="storetags" uri="/GeneralStoreTagLibrary" %>  <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"  %>   ...  <sql:query var="rs" dataSource="jdbc/storeDB">     select * from promotion  </sql:query>   ...  <tr>  <td colspan="5">  <c:forEach var="row" items="${rs.rows}">     ${row.message}<br/>  </c:forEach>  </td>  </tr>  

JSTL <sql:query> 標記將通過 JNDI查找名為 jdbc/storeDB 的數據源。該名稱引用是以 J2EE 標準的方式在應用程序的 web.xml 部署描述符中定義的。該標準配置同時適用於 Tomcat 和 Community Edition。清單 7 顯示了該配置。


清單 7. web.xml 中指定 JNDI 數據源引用的元素
<resource-ref>        <description>Derby DB connection</description>        <res-ref-name>jdbc/storeDB</res-ref-name>        <res-type>javax.sql.DataSource</res-type>        <res-auth>Container</res-auth>  </resource-ref>  

您現在需要配置此引用,以便以特定於容器的方式(對於 Tomcat 和 Community Edition 來說是不同的)匹配實際的 JDBC 驅動程序和 RDBMS 連接。對於 Tomcat,您將在 conf/context.xml 文件(可以在 Tomcat 安裝目錄中找到)中進行配置。請參見清單 8:


清單 8. 將 JNDI 資源與 Derby JDBC 連接器相關聯的特定於 Tomcat 的 context.xml 描述符
<Context>       ...       ...  <Resource name="jdbc/storeDB" auth="Container" type="javax.sql.DataSource"    maxActive="100" maxIdle="30" maxWait="10000"    driverClassName="org.apache.derby.jdbc.ClientDriver"    user="APP" password="APP"     url="jdbc:derby://localhost/generalstore"/>       ...       ...  </Context>  

為 ActiveMQ 代理配置 Tomcat

CheckOut.java Servlet 在下訂單成功時顯示一條消息。清單 9 顯示了該 Servlet 中查找連接工廠和隊列的代碼摘錄:


清單 9. Servlet 代碼摘錄
Context initContext = new InitialContext();  Context jndiContext=(Context) initContext.lookup("java:comp/env");  connectionFactory = (ConnectionFactory)  jndiContext.lookup("jms/ConnectionFactory");  queue = (Queue) jndiContext.lookup("jms/aQueue");  

您將在 web.xml 中定義對連接工廠和隊列的名稱引用,如清單 10 所示。


清單 10. web.xml 中指定 JMS 連接工廠和隊列的元素
<resource-ref>          <description>jms broker</description>          <res-ref-name>jms/ConnectionFactory</res-ref-name>          <res-type>javax.jms.ConnectionFactory</res-type>          <res-auth>Container</res-auth>    </resource-ref>  	<message-destination-ref>  		<message-destination-ref-name>jms/aQueue</message-destination-ref-name>  		<message-destination-type>javax.jms.Queue</message-destination-type>  		<message-destination-usage>ConsumesProduces</message-destination-usage>  		<message-destination-link>aQueue</message-destination-link>  	</message-destination-ref>  	<message-destination>  		<message-destination-name>aQueue</message-destination-name>  	</message-destination>  

您現在需要為 ActiveMQ 連接工廠和目標隊列配置 Tomcat,也是以特定於容器的方式進行配置。對於 Tomcat,您可以在 conf/context.xml 文件(可以在 Tomcat 安裝目錄中找到)中進行配置。清單 11 顯示了連接工廠和目標隊列參數。


清單 11. 用於 ActiveMQ 配置的特定於 Tomcat 的 context.xml 描述符
<Context>       ...       ...  <Resource          name="jms/ConnectionFactory"          auth="Container"          type="org.apache.activemq.ActiveMQConnectionFactory"          description="JMS Connection Factory"          factory="org.apache.activemq.jndi.JNDIReferenceFactory"          brokerURL="tcp://localhost:61616"          brokerName="localhost"          persistent="false"          useEmbeddedBroker="false"/>         <Resource name="jms/aQueue"          auth="Container"          type="org.apache.activemq.command.ActiveMQQueue"          factory="org.apache.activemq.jndi.JNDIReferenceFactory"          physicalName="MY.TEST.QUEUE"/>       ...       ...  </Context>  

使用 StockService.wsdl 生成 Web 服務類

在本部分中,我們將生成 Web 服務類:

  1. 清單 12 顯示了生成 Web 服務構件所需要的 WSDL 文件。

    清單 12. 用於生成 Web 服務構件的 StockService.wsdl

    <wsdl:definitions xmlns:http=http://schemas.xmlsoap.org/wsdl/http/     xmlns:soap=http://schemas.xmlsoap.org/wsdl/soap/     xmlns:s=http://www.w3.org/2001/XMLSchema     xmlns:soapenc=http://schemas.xmlsoap.org/soap/encoding/     xmlns:tns=http://www.webserviceX.NET/     xmlns:tm=http://microsoft.com/wsdl/mime/textMatching/     xmlns:mime=http://schemas.xmlsoap.org/wsdl/mime/     targetNamespace=http://www.webserviceX.NET/     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">      <wsdl:types>     <s:schema elementFormDefault="qualified"             targetNamespace="http://www.webserviceX.NET/">     <s:element name="GetQuote">       <s:complexType>        <s:sequence>         <s:element minOccurs="0" maxOccurs="1" name="symbol"          type="s:string"/>        </s:sequence>       </s:complexType>      </s:element>      <s:element name="GetQuoteResponse">       <s:complexType>        <s:sequence>         <s:element minOccurs="0" maxOccurs="1" name="GetQuoteResult" type="s:string"/>        </s:sequence>       </s:complexType>      </s:element>      <s:element name="string" nillable="true" type="s:string"/>     </s:schema>    </wsdl:types>    <wsdl:message name="GetQuoteSoapIn">     <wsdl:part name="parameters" element="tns:GetQuote"/>    </wsdl:message>    <wsdl:message name="GetQuoteSoapOut">     <wsdl:part name="parameters" element="tns:GetQuoteResponse"/>    </wsdl:message>    <wsdl:message name="GetQuoteHttpGetIn">     <wsdl:part name="symbol" type="s:string"/>    </wsdl:message>    <wsdl:message name="GetQuoteHttpGetOut">     <wsdl:part name="Body" element="tns:string"/>    </wsdl:message>    <wsdl:message name="GetQuoteHttpPostIn">     <wsdl:part name="symbol" type="s:string"/>    </wsdl:message>    <wsdl:message name="GetQuoteHttpPostOut">     <wsdl:part name="Body" element="tns:string"/>   </wsdl:message>     <wsdl:portType name="StockQuoteSoap">    <wsdl:operation name="GetQuote">     <wsdl:input message="tns:GetQuoteSoapIn"/>     <wsdl:output message="tns:GetQuoteSoapOut"/>    </wsdl:operation>   </wsdl:portType>     <wsdl:portType name="StockQuoteHttpGet">    <wsdl:operation name="GetQuote">     <wsdl:input message="tns:GetQuoteHttpGetIn"/>     <wsdl:output message="tns:GetQuoteHttpGetOut"/>    </wsdl:operation>   </wsdl:portType>     <wsdl:portType name="StockQuoteHttpPost">    <wsdl:operation name="GetQuote">    <wsdl:input message="tns:GetQuoteHttpPostIn"/>     <wsdl:output message="tns:GetQuoteHttpPostOut"/>    </wsdl:operation>   </wsdl:portType>     <wsdl:binding name="StockQuoteSoap" type="tns:StockQuoteSoap">    <soap:binding transport=http://schemas.xmlsoap.org/soap/http     style="document"/>    <wsdl:operation name="GetQuote">     <soap:operation soapAction=http://www.webserviceX.NET/GetQuote       style="document"/>     <wsdl:input>      <soap:body use="literal"/>     </wsdl:input>     <wsdl:output>      <soap:body use="literal"/>     </wsdl:output>    </wsdl:operation>   </wsdl:binding>     <wsdl:binding name="StockQuoteHttpGet" type="tns:StockQuoteHttpGet">    <http:binding verb="GET"/>    <wsdl:operation name="GetQuote">     <http:operation location="/GetQuote"/>     <wsdl:input>      <http:urlEncoded/>     </wsdl:input>     <wsdl:output>      <mime:mimeXml part="Body"/>     </wsdl:output>    </wsdl:operation>   </wsdl:binding>     <wsdl:binding name="StockQuoteHttpPost" type="tns:StockQuoteHttpPost">    <http:binding verb="POST"/>    <wsdl:operation name="GetQuote">     <http:operation location="/GetQuote"/>     <wsdl:input>      <mime:content part="NMTOKEN" type="application/x-www-form-urlencoded"/>     </wsdl:input>     <wsdl:output>      <mime:mimeXml part="Body"/>     </wsdl:output>    </wsdl:operation>   </wsdl:binding>   <wsdl:service name="StockQuote">    <wsdl:port name="StockQuoteSoap" binding="tns:StockQuoteSoap">     <soap:address location="http://www.webservicex.net/stockquote.asmx"/>    </wsdl:port>    <wsdl:port name="StockQuoteHttpGet" binding="tns:StockQuoteHttpGet">     <http:address location="http://www.webservicex.net/stockquote.asmx"/>    </wsdl:port>    <wsdl:port name="StockQuoteHttpPost" binding="tns:StockQuoteHttpPost">     <http:address location="http://www.webservicex.net/stockquote.asmx"/>    </wsdl:port>   </wsdl:service>  </wsdl:definitions>  

  2. 右鍵單擊 Stock Service.wsdl 文件(如圖 2 所示),並選擇 Web Services -Generate Client。

    圖 2. 使用 StockService.wsdl 生成 Web 服務構件


  3. 此步驟自動生成 Web 服務的所有必需構件。將生成下列類,如圖 3 所示:
    • StockQuote.java
    • StockQuoteLocator.java
    • StockQuoteSoap.java
    • StockQuoteSoapProxy.java
    • StockQuoteSoapStub.java

    此步驟還將下載在“設置 Apache Axis”部分中提到的 JAR,並將 jar 移動到應用程序的 WEB-INF/lib 文件。



    圖 3. 生成的 Web 服務類


  4. 為了在我們的應用程序中訪問 Web 服務,我們將清單 13 中的代碼添加到 checkoutcart.jsp 和 generalstore.jsp 文件。

    清單 13. 訪問 IBM 股票報價的代碼片段

    <%  StockQuoteLocator sql = new StockQuoteLocator();   StockQuoteSoap sqs = sql.getStockQuoteSoap();  PrintWriter out1 =response.getWriter();   String s1=sqs.getQuote("IBM");   s1=s1.substring(46,51);  %>  

    在我們的例子中,我們將 IBM 作為變數進行傳遞,該變數將從 Stock Web 服務檢索 IBM 股票報價。





在 Tomcat 中部署應用程序

在本部分中,我們將在 Tomcat 中部署應用程序,並使用以下步驟:

  1. 從 Eclipse 中將應用程序導出為 WAR 文件。
  2. 啟動 Tomcat 並使用以下命令運行 Web 控制台:
    http://localhost:8080/manager/html
  3. 系統將提示您登錄;請使用我們在前面設置的 UserDatabaseRealm。由於需要管理器角色,請輸入 tomcat 作為 user name 和 password。
  4. 管理器應用程序將顯示所有已部署的模塊。滾動到底部,此處有一個框 Deploy directory or WAR file located on server。對於 Context path,請輸入 /Shopping,對於 WAR or Directory URL,請輸入到 generalstore.war 文件的絕對路徑。
  5. 單擊 Deploy 按鈕。現在您應該看到運行於 /Shopping 上下文的 General Store 應用程序。圖 4 顯示了成功部署后的管理器應用程序。

    圖 4. Tomcat 中的成功應用程序部署


  6. 要訪問該應用程序,可以輸入以下 URL:http://localhost:8080/Shopping/store.cgi。




將應用程序遷移到 Community Edition

一般情況下,要將 General Store 應用程序遷移到 Community Edition 1.0,您需要執行以下操作:

  1. 對 Tomcat UserDatabaseRealm 進行配置,並將它替換為某個由 Community Edition 容器管理的身份驗證領域。
  2. 啟動並使用 Community Edition 中包括的 Derby RDBMS,而不是使用獨立版本的 Derby。
  3. 創建由 Community Edition 管理的新數據源。
  4. 創建所需的資料庫表並為其填充數據。
  5. 配置一個 JNDI 引用以使其指向 Community Edition 中的 Derby 數據源。
  6. 在 Community Edition 中配置 ActiveMQ JMS 代理連接工廠和隊列。

遷移過程中不需要更改的元素有:

  • web.xml 中對 JNDI 數據源的引用。
  • web.xml 中保護應用程序的安全性配置。

對於這些元素,要小心進行編碼,以使其在 J2EE 容器之間可以移植。

在 Community Edition 中更改 Tomcat 連接器使用的埠

如果您需要在 Community Edition 中更改 Tomcat 連接器使用的埠,不要查找 server.xml 文件;Community Edition 中沒有這個文件。取而代之,要在 Community Edition 安裝目錄下的 var/config 目錄中查找 config-substitutions.properties 文件。清單 14 顯示了 Community Edition 中的埠配置:


清單 14. Community Edition 中的 Tomcat 埠配置
AJPPort=8009  clusterNodeName=NODE  ORBPort=6882  MaxThreadPoolSize=500  ResourceBindingsNamePattern=  SMTPHost=localhost  ResourceBindingsQuery=?\#org.apache.geronimo.naming.ResourceSource  COSNamingPort=1050  webcontainer=TomcatWebContainer  OpenEJBPort=4201  ORBSSLPort=2001  PortOffset=0  ActiveMQStompPort=61613  JMXPort=9999  ORBHost=localhost  EndPointURI=http\://localhost\:8080  NamingPort=1099  DefaultWadiSweepInterval=36000  WebConnectorConTimeout=20000  HTTPSPort=8443  COSNamingHost=localhost  MinThreadPoolSize=200  ReplicaCount=2  ServerHostname=0.0.0.0  ActiveMQPort=61616  ORBSSLHost=localhost  SMTPPort=25  webcontainerName=tomcat6  ResourceBindingsNameInNamespace=jca\:  DefaultWadiNumPartitions=24  HTTPPort=8080  clusterName=CLUSTER_NAME  ClusterName=DEFAULT_CLUSTER  ResourceBindingsFormat={groupId}/{artifactId}/{j2eeType}/{name}  RemoteDeployHostname=localhost  TmId=71,84,77,73,68  

您可以在 Community Edition 中修改清單 14 中的代碼,以更改預設埠配置。您還可以取消註釋 PortOffset 變數,並輸入自己選擇的值。此更改將通過所定義的 PortOffset 值修改 Community Edition 中的所有服務的埠設置。例如,如果您定義了 PortOffset=10,則 HTTP 埠將為 8090,管理控制台的 URL 將為 http://localhost:8090/console 。

記住使用以下命令關閉 Tomcat 應用程序使用的獨立 Derby 資料庫:
java org.apache.derby.drda.NetworkServerControl stop

另外,您也可以使用 Web 控制台添加 Tomcat 連接器,或者編輯連接器使用的埠號。只需在 Web 控制台菜單中選擇 Server - Web Server 。在編輯並保存埠號更改之後,重新啟動以使埠更改立即生效。記住,如果您在使用該埠號顯示管理控制台,請更改瀏覽器 URL 中的埠號以重新顯示控制台。

配置 Community Edition 管理的身份驗證領域

預設情況下,Community Edition 管理一個名為 geronimo-admin 的領域,該領域使用 var/security 目錄下的屬性文件存儲用戶、密碼和組信息。該領域中配置的唯一用戶是 system,其密碼為 manager,並屬於 admin 組和角色。通過使用 Web 控制台菜單中的 Security - Console Realm 選項,您可以向預設領域添加用戶和組。

您可以在特定於 Community Edition 的部署計劃 geronimo-web.xml 中配置該安全領域。您需要在 geronimo-web.xml 中添加清單 15 中的代碼:


清單 15. Community Edition 中的安全領域配置
<security-realm-name>geronimo-admin</security-realm-name>  <sec:security>   <sec:default-principal realm-name="geronimo-properties-realm">    <sec:principalclass="org.apache.geronimo.       security.realm.providers.GeronimoUserPrincipal" name="system"/>    </sec:default-principal>    <sec:role-mappings>     <sec:role role-name="admin">      <sec:realm realm-name="geronimo-admin">        <sec:principalclass="org.apache.geronimo.          security.realm.providers.GeronimoGroupPrincipal" name="admin"/>        <sec:principalclass="org.apache.geronimo.          security.realm.providers.GeronimoUserPrincipal" name="system"/>       </sec:realm>     </sec:role>    </sec:role-mappings</sec:security>  

在 Community Edition 中創建 Promotion 資料庫表

使用一個基於 GUI 的 Web 控制台,您可以容易地在 Community Edition 中創建 Promotion 表:

  1. 啟動伺服器。
  2. 使用 http://localhost:8080/console 啟動管理控制台。
  3. 輸入預設 user name (system ) 和 password (manager)。
  4. 在控制台導航窗格中,在 Embedded DB 下面選擇 DB Manager ,如圖 5 所示:

    圖 5. 管理控制台中的 DB Portlet


  5. 在下一個屏幕(圖 6)上,將 Create DB 名稱指定為 generalstore 並選擇 Create。

    圖 6. 創建 generalstore 資料庫


  6. 從 Use DB 下拉框中,選擇 generalstore 並運行清單 16 所示的腳本,如圖 7 所示:

    清單 16. 用於在 Community Edition 中創建 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!');  



    圖 7. 創建 Promotion 表


在 Community Edition 中創建 Derby 數據源

  1. 使用 http://localhost:8080/console/ 啟動管理控制台。輸入預設 user name 和 password (system 和 manager)。
  2. 在控制台導航窗格中,在 Services 下面選擇 Database Pools。
  3. 在下一個屏幕(圖 8)上,選擇 Using Geronimo database pool wizard:

    圖 8. 選擇 Geronimo 資料庫池嚮導


  4. 將該資料庫池命名為 SampleDS 並將 Database Type 設置為 Derby Embedded XA,如圖 9 所示。選擇 Next。

    圖 9. 在 Community Edition 中創建資料庫池


  5. 在 Database Pools 嚮導上,填充如圖 10 所示的表單。這裡要注意,Password 為 APP 。單擊 Deploy。

    圖 10. 在 Community Edition 中創建資料庫池


  6. 在成功部署之後,您可以看到 SampleDS 數據源已添加到 Community Edition 中已部署的池列表中,如圖 11 所示:

    圖 11. 已部署的資料庫池列表中的 SampleDS 數據源


  7. 使用 geronimo-web.xml 部署計劃中的 <dependency> 和 <resource-ref> 元素,將 SampleDS 與 jdbc/storeDB 的 web.xml JNDI 引用相關聯,如清單 17 所示。

    清單 17. geronimo-web.xml 部署計劃中的代碼片段

    <sys:dependency>    <sys:groupId>console.dbpool</sys:groupId>    <sys:artifactId>SampleDS</sys:artifactId>    </sys:dependency>  	  <naming:resource-ref>    <naming:ref-name>jdbc/storeDB</naming:ref-name>    <naming:resource-link>SampleDS</naming:resource-link>  </naming:resource-ref>  

創建 ActiveMQ JMS 連接工廠和隊列

您可以使用 GUI Web 控制台容易地創建 Community Edition 管理的連接工廠和隊列:

  1. 啟動管理控制台。在控制台導航窗格中,在 Services 下面選擇 JMS Resources。在下一個屏幕上選擇 For ActiveMQ。
  2. 在下一個屏幕上,填充如圖 12 所示的表單。然後單擊 Next。

    圖 12. 配置 JMS 資源組


  3. 在下一個屏幕(圖 13)上,選擇 Add Connection Factory。

    圖 13. 添加連接工廠


  4. 選擇 javax.jms.ConnectionFactory 作為工廠類型(圖 14),然後單擊 Next。

    圖 14. 添加連接工廠


    .
  5. 填充如圖 15 所示的表單。然後單擊 Next。

    圖 15. 添加連接工廠


  6. 在下一個屏幕(圖 16)上,選擇 Add Destination 以添加隊列。

    圖 16. 添加目的地


  7. 從下拉框中選擇 javax.jms.Queue,如圖 17 所示。單擊 Next。

    圖 17. 設置目的地類型


  8. 將 Message Destination Name 設置為 jms/aQueue,如圖 18 所示。單擊 Next。

    圖 18. 添加隊列


  9. 在下一個屏幕(圖 19)上,選擇 Deploy Now,這將在 Community Edition 上部署該資源計劃。

    圖 19. 將資源計劃部署到 Community Edition


  10. 成功部署后,您可以看到該遷移作為可用的 JMS 資源之一出現,如圖 20 所示:

    圖 20. 可用資源列表中的遷移 JMS 資源


  11. 通過使用 geronimo-web.xml 部署計劃中的 <dependency> 和 <resource-ref> 元素,您可以關聯已經在 web.xml 中的連接工廠和隊列,如清單 18 所示。

    清單 18. geronimo-web.xml 部署計劃中的代碼片段

    	<sys:dependency>  	 <sys:groupId>org.apache.geronimo.configs</sys:groupId>  	 <sys:artifactId>activemq-ra</sys:artifactId>  	 <sys:version>2.1.1</sys:version>  	 <sys:type>car</sys:type>  	</sys:dependency>                   ...                   ...  	<naming:resource-ref>   	 <naming:ref-name>jms/ConnectionFactory</naming:ref-name>  	 <naming:pattern>  	   <naming:groupId>org.apache.geronimo.configs</naming:groupId>  	   <naming:artifactId>activemq-ra</naming:artifactId>  	   <naming:version>2.1.1</naming:version>  	   <naming:name>DefaultActiveMQConnectionFactory</naming:name>  	 </naming:pattern>  	</naming:resource-ref>  	  	<naming:message-destination>  	 <naming:message-destination-name>  	  aQueue  	 </naming:message-destination-name>  	 <naming:admin-object-link>  	  SendReceiveQueue  	 </naming:admin-object-link>  	</naming:message-destination>  





從 Community Edition WAR 文件中刪除不需要的服務

如果將示例 ShoppingStore_Tomcat.war 文件的大小(大約 9MB)與 ShoppingStore_CommunityEdition.war 文件的大小(大約 32KB)做一下比較,您可能疑惑為什麼存在如此巨大的大小差異。原因在於,您需要在 Tomcat 安裝的應用程序 WEB-INF\lib 目錄中包括的所有服務(Axis、JMS、公共服務等)和 Derby 資料庫驅動程序已經集成到 Community Edition 中。刪除這些 jar 文件的優點在於,您不必集成和支持它們。

以下 ShoppingStore_Tomcat.war jar 文件包括在 WEB-INF\lib 中:

  • activeio-core-3.0.0-incubator.jar
  • apache-activemq-4.1.1.jar
  • axis.jar
  • commons-discovery-0.2.jar
  • commons-logging.jar
  • derby.jar
  • derbyclient.jar
  • derbynet.jar
  • derbytools.jar
  • jaxrpc.jar
  • jstl.jar
  • saaj.jar
  • standard.jar
  • wsdl4j-1.5.1.jar

這些 jar 文件也包括在 Community Edition 的 <WASCE_HOME>/repository 目錄中。要確定 JAR 是否存在,可以在 /repository 目錄中搜索不帶版本(例如,activeio-core)或不帶來源(例如,activemq)的組件名稱。/repository 中的對應 jar 文件將包含版本(例如,axis1-4.jar)。未在 /repository 中列出的 JAR 文件(例如特定於應用程序的文件)將需要在 WEB-INF\l ib 中進行維護。

在此遷移示例中,Tomcat WEB-INF\lib 目錄中的所有 JAR 文件都可以刪除。大多數 Web 應用程序在 WEB-INF\lib 目錄中放置某些特定於應用程序的 JAR 文件,因此減小庫的能力視情況而異。資料庫驅動程序 JAR 文件一般應該安裝在 \repository 中並與應用程序共享。管理控制台工具將幫助下載和安裝 \repository 中不可用的資料庫驅動程序文件(即 Oracle 或 MySQL)(選擇 Services - Database Pools - Using the Geronimo database pool wizard)。

此外,web.xml 文件中可能存在某些 <servlet> 參數,這些參數指向 WEB-INF\lib 目錄中的 JAR 文件。您需要確定刪除某個 JAR 文件是否需要對 web.xml 做出更改。





在 Community Edition 中部署應用程序

要部署應用程序,可以啟動管理控制台並按照以下步驟操作:

  1. 在管理控制台導航窗格中,在 Applications 下面選擇 Deploy New。
  2. 選擇 Archive 文本框旁邊的 Browse,並瀏覽到 Shoppingstore.war。單擊 Install。此步驟將在 Community Edition 上部署應用程序,如圖 21 所示:

    圖 21. 在 Community Edition 上部署應用程序


  3. 使用 http://localhost:8080/Shopping/store.cgi 啟動應用程序。在提示登錄時,使用 system 作為 user name,使用 manager 作為 password。




遷移問題故障排除

本文中的示例應用程序提供了用於典型 Tomcat 遷移的配置和部署計劃示例。作為部署例子,示例中包括了許多不同的資源類型。管理控制台中的 Deploy New 菜單提供了無法部署的 WAR 文件的詳細錯誤消息。

如果 WAR 文件無法部署,腳本部署工具也提供了錯誤信息。如果錯誤發生在應用程序測試過程中,請檢查 Eclipse 伺服器日誌或 var\log\server.log 文件(在 Linux 中為 geronimo.out 文件),查找其中可能在訪問應用程序時發生的 Java 錯誤。

一些常見的遷移問題包括:

  • 類載入器問題
  • 資源配置問題
  • 部署計劃問題

我們將在下面幾個部分中詳細研究這些問題。

類載入器問題

預設情況下,Community Edition 遵循首先從父配置(即從 \repository)中載入類的類載入器層次結構。Tomcat 首先從應用程序載入類。如果 Tomcat 應用程序使用較舊的組件(例如較舊版本的 Axis),而 API 結構已更改,可能就會出現問題。在此情況下,當您部署 WAR 時或在運行時,類載入器錯誤可能就會出現。

糾正類載入器問題的一種方法是向部署計劃中的 <moduleId> 參數後面添加 hidden-classes 參數。hidden-classes 參數標識不應該從父配置載入類的名稱。清單 19 顯示了針對某個 Axis 類載入器問題的 geronimo-web.xml 示例。應用程序將使用 WEB-INF\lib 中的 axis.jar 文件:


清單 19. 針對某個 Axis 類載入器問題的 hidden-classes 代碼
</moduleId>  <hidden-classes>      <filter>org.apache.axis2<filter>  </hidden-classes>

另一種糾正類載入器問題的方法是將 inverse-classloading 參數添加到部署計劃中的 <moduleId> 參數後面。逆向類載入致使 Community Edition 遵循在載入應用程序 WEB-INF\lib 類之後立即從父配置中載入類的類載入器層次結構。下面包括的清單 20 顯示了用於逆向類載入器的 geronimo-web.xml 示例:


清單 20. 針對某個 Geronimo 類載入器問題的 inverse-classloading 代碼
</moduleId>  <inverse-classloading/>

修改類載入器結構應該使應用程序能夠成功遷移。然而,您應該在某個時候糾正應用程序代碼以使用 Community Edition 中的組件,因為組件集成和支持是使用 Community Edition 而不使用 Tomcat 的主要優點。有關更多信息,請訪問文檔中的管理類路徑。

資源配置問題

諸如資料庫和安全連接等資源可能導致部署和運行時問題。由於 Tomcat 具有不同的配置結構,並且使用 server.xml 和 context.xml,因此在遷移到 Community Edition 時可能會出現配置問題。在某些情況下,問題是參數不正確或訪問問題。對於資料庫,嘗試在管理控制台中使用 Database Pools - Geronimo database pool wizard 來測試資料庫連接。當您“部署”資料庫時,該嚮導將對照資料庫進行測試,如果連接不成功,則會出現錯誤。您可以編輯池以更改參數,然後重新測試,直到連接成功為止。對於安全領域,嘗試在管理控制台中使用 Security Realms - Add new security realm 菜單來測試安全領域連接。Security Realm 嚮導中有一個菜單允許您輸入登錄用戶名和密碼以測試連接。如果登錄成功,您可以編輯安全領域並重新測試,直到安全領域連接成功為止。

部署計劃問題

geronimo-web.xml 部署計劃需要特定的參數和格式才能正確工作。本文中使用的 General Store 應用程序在 ShoppinStore_WASCE.war 文件中包括了有效的 geronimo-web-xml 文件。可以從 Community Edition 下載站點獲得示例應用程序包。這些示例包括各種帶 geronimo-web.xml 部署計劃的應用程序類型。您可以使用這些示例作為您自己的部署計劃需求的基礎。

此外,嘗試使用管理控制台中的 Plan Creator 菜單,在由管理控制台創建的 Tomcat WAR 文件和資源連接(即資料庫、JMS、安全連接)的基礎上,創建 geronimo-web.xml 部署計劃。此選項提供了一種創建 geronimo-web.xml 部署計劃的簡單方法。在部署 WAR 文件時,您可以通過使用 Plan 欄位在 WAR 文件之外定義部署計劃。有關部署 WAR 文件和外部部署計劃的信息,請參見圖 21。





結束語

將應用程序從 Tomcat 6.0.x 遷移到 Community Edition V2.1 是相當簡單的,因為 Tomcat 6.0.x 已完好無損地進行了集成,並且實際上是 Community Edition 的一部分。然而,由於 Community Edition 現在控制所有的配置管理,因此在 Tomcat 上通常位於 server.xml 或 context.xml 中的配置元素現在已遷移到:

  • config-substitution.properties:用於快速更改參數,例如連接器的埠號。
  • geronimo-web.xml:應用程序上下文的特定於 Community Edition 的部署計劃;可以包括在存檔文件的 WEB-INF 目錄中。

通過將 Web 應用程序從 Tomcat 6.x 逐步遷移到 WebSphere Application Server Community Edition,我們看到了該遷移的要點包括:身份驗證領域切換;JNDI 引用映射;設置 Derby 資料庫;配置 JDBC 連接器、JMS 資源工廠和 JMS 隊列。(責任編輯:A6)



[火星人 ] 從 Apache Tomcat Version 6.0.x 遷移到 WebSphere Application Server Community Edition已經有827次圍觀

http://coctec.com/docs/linux/show-post-69047.html