使用 Rational Software Architect 创建基于 Web 服务的 Enterprise Java Bean

Comments

在开始之前

了解您将从本文中学到什么,以及怎样去掌握这项知识。

关于本教程

使用 Rational Software Architect (V7.0 或更新的版本)创建 Enterprise Java Bean based Web Services

本教程包括了以下具体的主题:

  • 手把手地向您展示,怎样使用 IBM®Rational®Software Architect V7.0 或更高版本,来创建一个 Enterprise Java™ Bean 组件,并最终从该组件中发展一种 Web 服务,假设该 Web 服务使用了一种 Web 服务客户机。
  • Rational Software Architect 与 Test Environment 扩展版本的集成(与 IBM® WebSphere® Application Server V6.0 或更高版本的联合),使它变得更容易的得以创建、发展以及测试 Java™ 2 Platform、Enterprise Edition (J2EE Platform)组件。通过使用这项工具,您(作为软件开发员)可以开发出任何的 J2EE 应用程序,从 Rational Software Architect IDE 自身到 WebSphere Application Server,并能在不离开开发环境的条件下,测试该应用程序。
  • 观察分析 Enterprise Project、Enterprise Java Bean 组件、以及 Web 服务 WSDL 文档,产生的一些 UML 图。

安装要求

  • 安装 Rational Software Architect V7.0 或更高以上的版本。之所以要安装这项软件,是因为需要创建并运行如本教程所述的应用程序。 WebSphere Portal Test Environment(Runtime Versions 6.0 或更高以上版本)用作与 Rational Software Architect 构建联合测试环境。
  • Java™ 运行时间环境(JRE)V1.5 或更高以上版本。
  • 本教程假设,您已基本掌握了 Session Beans、Web services、 Java™ Remote Method Invocation over Internet Inter-ORB Protocol technology (RMI/IIOP),以及 Java™ Naming and Directory Interface (JNDI) 和 UML Modeling。

创建一个 EJB 组件并测试客户机

开始指定一项 J2EE 应用程序

从指定一项包含一个 session bean ,以及其 Web 服务的 J2EE 应用程序开始。首先,使用 Rational Software Architect 创建一个 Enterprise Archive(EAR) Application Project。该 Enterprise Project 将拥有所有的 J2EE 组件。

  1. 打开 Rational Software Architect 并切换至 J2EE 视图下。
  2. 右键点击并选择 New > Enterprise Application Project ,如图 1 所示。
图 1. 创建一个新项目
菜单命令
菜单命令
  1. 设置 EAR Application Project 选项,如图 2 所示。
    1. 给 Enterprise Application 起一个 Project NameEJBWebServiceApplication
    2. 选择文件夹定位( Directory )。
    3. 选择 Target Runtime 应用程序服务器(在本例中,是 WebSphere Application Server v6.1)。
    4. 保持 Configuration 为 <custom>。
    5. 点击 Next
图 2. 创建一个 EAR 应用程序
EAR Application Project 对话框
EAR Application Project 对话框
  1. 设置 Project Facets (如同 EAR Version ,以及您所创建的 WebSphere Application ),如图 3 所示。
图 3. Project Facets 能使项目当作一个 EAR 模型开发
带有复选框的 Project Facets 列表
带有复选框的 Project Facets 列表

下一步,创建一个 EJB 项目。该项目拥有所有类的 beans,如 session、 entity、以及消息驱动 Bean。

  1. 开始创建时,选择 New > EJB Project ,如图 4 所示。
图 4. 创建一个 EJB 项目
菜单命令
菜单命令
  1. 下一步,设置您的 EJB Project,如图 5 所示。
    1. 给其 Project name 命名为 SessionEJB
    2. 指定 EAR Membership :选中 Add target to an EAR 复选框,并选中 Enterprise Application Project。在本例中,是您在前面创建的 EJBWebServiceApplication。
图 5. 创建一个 EJB Project
New EJB Project 对话框
New EJB Project 对话框
  1. 设置 Project Facets (类似 EJB Module Version 、Java Version 、以及 WebSphere EJB Support),如图 6 所示。
图 6. 设置 WebSphere XDoclet 注解支持
带有复选框的 Project Facets 列表
带有复选框的 Project Facets 列表

现在,您已完成了这些步骤,每一个 EJB 都对应着一个 EJB client .jar 文件,它们可以被任何相似的应用程序引用(如 Web 应用程序、另一个 EJB、或一个客户机)。Rational Software Architect 自动产生这个客户 JAR 文件。

  1. 设这个客户机的 NameSessionEJBClient.jar,如图 7 所示。
图 7. 进行 EJB 模型设置
New EJB Project 对话框
New EJB Project 对话框
  1. 在 Project Explorer 中检查 J2EE 项目的结构。您可以看到三个项目,如图 8 所示:
    • EJBWebServicesApplication
    • SessionEJB
    • SessionEJBClient
图 8. Project Explorer 视图下的项目
带有四个框架的窗口
带有四个框架的窗口
  1. SessionEJB 项目中添加一个 session bean ,如图 9 所示:右键点击并选择 SessionEJB > New > Enterprise Bean
图 9. 创建一个新的 Enterprise Bean
菜单命令
菜单命令
  1. 给 SessionEJB 的 Bean name 命名为Session,如图 10 所示。
图 10. 选择 bean 类以及基本属性
指定项目,名称,文件夹和包
指定项目,名称,文件夹和包
  1. 输入关于 Bean class 以及 Remote home interface 的具体细节,如图 11 所示。
  2. 您可以编辑 Remote client view 以及 Local client view。在本例中,只选择编辑 Remote client view
图 11. 编辑 Enterprise Bean Details
也指定 Session 类型和 Transaction 类型
也指定 Session 类型和 Transaction 类型

您为该 bean 创建及再创建 Client 的方式很重要,如图 12 所示。您有两种选项: Remove EJB Client Jar 以及 Create EJB Client Jar

图 12. 移除 EJB Client Jar
菜单命令
菜单命令
  1. 打开 PatternBean.java Class。它看起来应类似于如列表 1 所示的代码。加粗的标签是 meta-tags。

列表 1. PatternBean.java 类代码

package ejbs;
import javax.ejb.SessionContext;
import javax.ejb.CreateException;

/**
 * Bean implementation class for Session Bean: Session
 *
 * @ejb.bean
 *	name="Session"
 *	type="Stateless"
 *	jndi-name="SessionBeanJNDI"
 *	transaction-type="Container"
 *
 * @ejb.home
 * 	remote-class="ejbs.SessionHome"
 *
 * @ejb.interface
 * 	remote-class="ejbs.Session"
 *
 */
public class SessionBean implements javax.ejb.SessionBean {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
private SessionContext mySessionCtx;
	/**
	 * getSessionContext
	 */
	public SessionContext getSessionContext() {
		return mySessionCtx;
	}
	/**
	 * setSessionContext
	 */
	public void setSessionContext(SessionContext ctx) {
mySessionCtx = ctx;
	}
	/**
	 * ejbCreate
	 */
	public void ejbCreate() throws CreateException {
	}
	/**
	 * ejbActivate
	 */
	public void ejbActivate() {
	}
	/**
	 * ejbPassivate
	 */
	public void ejbPassivate() {
	}
	/**
	 * ejbRemove
	 */
	public void ejbRemove() {
}
	
	/**
               * @param callString
	 * @return
 * @ejb.interface-method
 */
	public String callString(String callString){
	return "Hello and Welcome  "+callString;	
	}
}
  1. 添加一个通用业务方法 callString (String callString),并检查此方法中的 @ejb.interface-methodmeta-tag (在方法定义上,用粗体表示出来)。这意味着,该方法是 bean 的 Remote 界面产生的 Remote interface 的一部分。实际上,在您编辑整个项目后,查看位于 SessionEJBClient 项目中的Remote Interface:如列表 2 所示。

列表 2. Remote 接口

package ejbs;

import java.rmi.RemoteException;

/**
 * Remote interface for ejbs.SessionBean bean.
 */
publicinterface Session extends javax.ejb.EJBObject {
public String callString(String callString) throws RemoteException;
}

其中,Home Interface 如列表 3 所示。

列表 3. Home 接口

package ejbs;
/**
 * Home interface for ejbs.SessionBean bean.
 */
publicinterface SessionHome extends javax.ejb.EJBHome {
publicstaticfinal String COMP_NAME =
            "java:comp/env/ejb/SessionBean";

publicstaticfinal String JNDI_NAME = "SessionBeanJNDI";

/* Default create */
public ejbs.Session create() throws java.rmi.RemoteException,
			javax.ejb.CreateException;
}

Client Model 看起来应类似于图 13。检查类的层级结构。

图 13. Client 模型
Java Class and four Java Interfaces
Java Class and four Java Interfaces

下一步,您要使用 Test Environment extension WebSphere Integration ,去应用产生的 Session Bean。

  1. Servers 标签上,选择带有 Status = Started 的服务器。这既是将要应用您的 EJB 的目标服务器。
  2. 在应用前,您需要向您的 Server Configuration 添加 EJB。为了完成该步,在选择的服务器上右键点击,并选择 Add and remove Projects ,如图 14 所示。
图 14. 向您的 Server Configuration 添加
菜单命令
菜单命令
  1. 向您的 EJB 添加Enterprise Archive File (EAR) ,如图 15 所示。
图 15. 指定在服务器上调试过的项目
Add and Remove Projects 对话框
Add and Remove Projects 对话框
  1. 最后,公布项目,这样 JNDI 的名字可以通过 WebSphere LDAP 获得。为了完成该步,右键点击并选择 Publish ,如图 16 所示。
图 16. 公布项目
菜单命令
菜单命令

在开发计划完成后,您下一步要完成的,是创建一个简单的客户已测试您的 bean。如列表 4 所示:

列表 4. 简单的客户端

package com.ibm.pattern.ejb;
public class SessionEJBClientTesting {
public static void main(String stringsp[]){
try{
Hashtable p = new Hashtable();
p.put(Context.INITIAL_CONTEXT_FACTORY,
      "com.ibm.websphere.naming.WsnInitialContextFactory");
p.put(Context.PROVIDER_URL,"corbaloc:iiop:localhost:2809");
InitialContext ctx = new InitialContext(p);
Object objRef = ctx.lookup("SessionBeanJNDI");
SessionHome sessionHome= (SessionHome) 
PortableRemoteObject.narrow(objRef, SessionHome.class);
Session  session= sessionHome.create();
System.out.println(session.callString(" MICHEL "));
} catch (RemoteException e) {
   		  e.printStackTrace();
} catch (CreateException e) {
		  e.printStackTrace();
} catch (NamingException e) {
	  	 e.printStackTrace();
		}
   }
}

在以上的客户项目中,检查被强调的几行。其中最重要的部分如列表 5 所示。

列表 5. Hashtable, Initial Context 以及 JNDI 查找

/**A Hashtable to pass the Initial Context Parameters**/
Hashtable p = new Hashtable();
/**Weblogic Specific Initial Context Factory Class**/
p.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");

/**URL to acces  the JNDI through JNDI of java.Check the protocol used.
This is corbaloc:iiop**/
p.put(Context.PROVIDER_URL,"corbaloc:iiop:localhost:2809");
/**Create the Initial Context **/
InitialContext ctx = new InitialContext(p);
/**Look up the EJB JNDI using LDAP**/
Object objRef = ctx.lookup("PatternBeanJNDI");

预期的输出是Hello and WelcomeMICHEL.

开发并构建您的 Web Service

使用您创建的测试客户机,来构建一个 Web 服务

  1. 通过右键点击并选择 New > Dynamic Web Project ,来创建一个动态的 Web 项目,如图 17 所示。
图 17. 创建一个新的动态的 Web 项目
菜单命令
菜单命令
  1. 命名该项目为 SessionWebService,如图 18 所示。
图 18. 命名该项目
也指定项目内容,EAR Membership,等等
也指定项目内容,EAR Membership,等等

接下来,使用您已创建的 session bean ,来构建一个新的 XML Web 服务。为了完成该步,选择 Web Service 向导,如图 19 所示。

图 19. 选择一个向导
在树状视图中选择的 Web Service
在树状视图中选择的 Web Service
  1. 从通用菜单中,检查 Web 服务选项。其中, Web service typeBottom upJava Bean Web ServiceClient typeJava Proxy ,如图 20 所示
图 20. Web 服务选项
带有滑动条和配置链接的对话框
带有滑动条和配置链接的对话框
  1. 在下一个界面中,您需要选中产生 Web 服务,以及 WSDL (Web Services Definition Language)文件的 Methods。 设置 WSDL port name 以及 WSDL file。选择 callMethod(java.lang.String) 方法并点击 Next ,如图 21 所示。
图 21. 设置 bean 作为 Web 服务
Web Service Java Bean Identify 对话框
Web Service Java Bean Identify 对话框
  1. 现在,要产生 Web 服务 WSDL 文件。检查类以及相应产生的 WSDL。Web 服务的 Main 类如列表 6 所示。

列表 6. Main 类

package ejbs;

import java.rmi.RemoteException;
import java.util.Hashtable;


import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import ejbs.Session;
/**This is a helper class for EJB JNDI Locator **/

public class SessioEJBWebService{
    
public String callMethod(String callString){
try {
   Hashtable p = new Hashtable();
  p.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
  p.put(Context.PROVIDER_URL,"corbaloc:iiop:localhost:2809"); 
  InitialContext ctx = new InitialContext(p);
  Object objRef = ctx.lookup("SessionBeanJNDI");
  SessionHome sessionHome= (SessionHome) 
PortableRemoteObject.narrow(objRef, SessionHome.class);
			Session  session= sessionHome.create();
return session.callString(callString);
} catch (RemoteException e) {
				e.printStackTrace();
} catch (CreateException e) {
				e.printStackTrace();
} catch (NamingException e) {
				e.printStackTrace();
			}
            return "I am unable to call Web service";
   }
}

现在检查已生成的 WSDL Web 服务文件。这基本上是一个定义 XML SOAP-based RPC (远程程序访问)的 .xSP 文件。该文件包含了所有的方法、输入及输出参数、以及 Web 访问 URL,如列表 7 所示。

列表 7. WSDL Web 服务文件

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace=
"http://ejbs" xmlns:impl="http://ejbs" xmlns:intf="http://ejbs" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap=
"http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:wsi="http://ws-i.org/profiles/basic/1.1/xsd" xmlns:xsd=
"http://www.w3.org/2001/XMLSchema">
 <wsdl:types>
  <schema targetNamespace="http://ejbs" xmlns=
"http://www.w3.org/2001/XMLSchema" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd=
"http://www.w3.org/2001/XMLSchema">
   <element name="callMethodResponse">
    <complexType>
     <sequence>
      <element name="callMethodReturn" nillable="true" type="xsd:string"/>
     </sequence>
    </complexType>
   </element>
   <element name="callMethod">
    <complexType>
     <sequence>
      <element name="callString" nillable="true" type="xsd:string"/>
     </sequence>
    </complexType>
   </element>
  </schema>
 </wsdl:types>

   <wsdl:message name="callMethodResponse">

      <wsdl:part element="intf:callMethodResponse" name="parameters"/>

   </wsdl:message>

   <wsdl:message name="callMethodRequest">

      <wsdl:part element="intf:callMethod" name="parameters"/>

   </wsdl:message>

   <wsdl:portType name="SessionEJBWebService">

      <wsdl:operation name="callMethod">

         <wsdl:input message="intf:callMethodRequest" name="callMethodRequest"/>

         <wsdl:output message="intf:callMethodResponse" name="callMethodResponse"/>

      </wsdl:operation>

   </wsdl:portType>

   <wsdl:binding name="SessionEJBWebServiceSoapBinding"
      type="intf:SessionEJBWebService">

<wsdlsoap:binding style="document" 
      transport="http://schemas.xmlsoap.org/soap/http"/>

      <wsdl:operation name="callMethod">

         <wsdlsoap:operation soapAction="callMethod"/>

         <wsdl:input name="callMethodRequest">

            <wsdlsoap:body use="literal"/>

         </wsdl:input>

         <wsdl:output name="callMethodResponse">

            <wsdlsoap:body use="literal"/>

         </wsdl:output>

      </wsdl:operation>

   </wsdl:binding>

   <wsdl:service name="SessionEJBWebServiceService">

<wsdl:port binding="intf:SessionEJBWebServiceSoapBinding"
       name="SessionEJBWebService">

         <wsdlsoap:address         
location="http://localhost:9080/SessionWebService/services/SessionEJBWebService"/>

      </wsdl:port>

   </wsdl:service>

</wsdl:definitions>
  1. 该 WSDL 的 Design Model 如图 22 所示。
图 22. Design Model
显示详细视图的图
显示详细视图的图
  1. 生成一个 Web 服务客户,以构建该 Web 服务。另外,使用 Rational Software Architect 来做到这点。第一,构建一个名为 SessionWebServiceClient 的动态 Web 项目。
  2. 右键点击并选择 New > Other > Web services 然后是 Web Service Client,如图 23 所示。
图 23.选择一个向导
在树状视图中选择的 Web Service Client
在树状视图中选择的 Web Service Client
  1. 检查 Web 服务选项以及 Configuration。您可以通过改变左边垂直滚动条的位置,来改变这些选项 ,如图 24 所示。

可进行的设置是:

  • 服务器: WebSphere v6.0
  • Web Service Runtime: IBM WebSphere JAX-RPC
  • Client Project: SessionWebServiceClient
  • Client EAR 项目: EJBWebServiceApplication
图 24. Web 服务选项
选择 Service definition 和 Client type
选择 Service definition 和 Client type
  1. 如果一切正常,您可以在 Rational Software Architect 中看到 Text 页面,如图 25 所示。这就可以基本上测试了 Web 服务方法,以确定它们是否工作正常。
    1. Web Service Client 通过 LAN 或 WAN 上的 应用 Web 服务,做一个基于 HTTP/SOAP 的访问。
    2. Web Service 对应用的 EJB 做一次 RMI/IIOP 访问。
    3. 最后,结果显示在 JSP 页面中。
图 25. Methods、 Inputs 以及 Results
Web Services Test 的 Project Explorer 左边
Web Services Test 的 Project Explorer 左边
  1. 您可以在 Project Explorer(在图 25 上部左边)中扩展 SessionWebServiceClient ,并看出 Client 自动产生了什么类。该类的 UML Diagram 如图 26 所示。
图26. UML Diagram 中的 SessionEJBWebService 元素
两个 Java Interfaces 和四个 Java Classes
两个 Java Interfaces 和四个 Java Classes

调用流的设计

这些操作的 Sequence Diagram 看起来如图 27 所示。另外,注解解释了每个分布组件的开发环境。

图 27. Sequence 图
注释是在黄色的便贴框里
注释是在黄色的便贴框里

本教程包括了使用 Rational Software Architect 7.0.0 以开发 J2EE 组件

在本教程中,您:

  • 创建了一个企业 session bean
  • 创建了一个 Web 服务
  • 创建了一个客户以构建该服务

这个简单的案例论证了,使用 Rational Software Architect 来创建、应用以及测试 EJB 组件的过程。这个思想可以扩展至,任何一个应用到 WebSphere Environment 的组件中去。这个思想也可扩展至任何可应用的组件中去,如 Java™ Message Service (JMS)以及 J2EE 连接器。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational, Java technology, SOA and web services
ArticleID=333535
ArticleTitle=使用 Rational Software Architect 创建基于 Web 服务的 Enterprise Java Bean
publish-date=08282008