ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 使用 Rational 加速基于 XML 的 SOA 的 JSF 开发一

使用 Rational 加速基于 XML 的 SOA 的 JSF 开发一

原创 Linux操作系统 作者:isoa 时间:2009-05-05 17:15:35 0 删除 编辑

安装 XSD SDO 转换功能

  1. 下载文件 xsdsdotransform-feature.zip 解压缩到您的 Rational Application Developer 安装的 rad\eclipse 目录下(例如,D:\IBM\RSDP\6.0\rad\eclipse)。
  2. 启动 Rational Application Developer(以下简称为 Application Developer)。
  3. 选取 Help => Software Updates => Manage Configuration(如图 1 所示)。
    图 1. 功能安装
    图 1. 功能安装
  4. 如图 2 所示使得 XSD SDO 转换功能生效,然后重启 Application Developer。
    图 2. 功能安装
    图 2. 功能安装
    您可以用 -clean 命令行参数启动 Application Developer 来确保该功能的配置更新。

    XSD SDO 转换功能的内容

    XSD SDO 转换功能包括用于从 XSD schema 中生成 SDO 包的工件,以及用于将 SDO 包实例转换到 XML 实例文件中或从 XML 实例文件中转换出 SDO 包实例的框架组件:

    1. 创建 SDO 包的动作
      在 XSD 资源中的这个动作从 XSD schema 中生成了 SDO 包(如图 3 所示)。
      图 3. 创建 SDO 包
      图 3. 创建 SDO 包
    2. dw.ibm.etools.xsd.sdo.xmltransformservice.XMLTransformServiceFactory 类
      该类提供了 API 用于将 SDO 包实例转换到 XML 实例文件中或从 XML 实例文件中转换出 SDO 包实例。(可利用 xsd_sdo_soa_part1_listings.zip 下载文件中的 XMLTransformServiceFactory.java 代码。)

      场景

      我们将要开发一个简单的保险应用程序场景,来说明主从复合结构的视图、分类以及分页功能。在该场景中:

      • 我们假设 XYZ 保险公司有许多已注册的代理人。
      • 每个代理人都有许多客户,并且每个客户都同代理人签订了许多策略。
      • 保险公司通过标准的 BrokerService 方案来展示代理人的服务。
      • 任何来源于代理人的信息都是按照清单 1 中定义的方案传递的 XML 请求或响应。(可利用 xsd_sdo_soa_part1_listings.zip 下载文件中的 BrokerService.xsd 代码。)

      清单 1. BrokerService.xsd

      
      
      	
      		
         			Broker Service Schema for xyz.com.
         			Copyright 2004 ibm.com. All rights reserved.
        		
      	
      	
      	
      		
      			
      			
      		
      	
      	
      		
      			
      			
      			
      			
      			
      		
      		
      	
      	
      		
      			
      			
      			
      			
      			
      			
      		
      		
      	
      	
      		
      			
      			
      			
      			
      			
      		
      	
      	
      		
      			
      			
      			
      			
      			
      		
      		
      	
      	
      		
      			
      			
      		
      	
      	
      	
      
      


      图 4. BrokerService 方案模式
      图 4. BrokerService 方案模式

      在该场景中,我们开发了一个 brokerdetail.jsp JavaServer Faces JSP 页面。该页面发出代理人请求的详细信息(brokerDetailRequest.xml,如清单 2 所示),并收到包含所有代理人的客户及他们策略的响应(brokerDetailResponse.xml,如清单 3 所示)。每页显示一个客户的详细信息并且按名将他们的策略分类。


      图 5. BrokerDetail 请求及响应消息流
      图 5. BrokerDetail 请求及响应消息流

      (代码如清单 2 和 3 所示,可 xsd_sdo_soa_part1_listings.zip 下载文件中获得。)

      清单 2. brokerDetailRequest.xml

      
      
      narinder
      makin
      
      
      

      清单 3. brokerDetailResponse.xml

      
      
      	Narinder
      	Makin
      	
      		Dan
      		Moore
      		1967-08-13
      		
      			113 Oak Pine St.
      			Santa Clara
      			LA
      			91929
      			US
      		
      		
      			123 Demi Lane
      			Cary
      			NC
      			22999
      			US
      		
      		
      			Life
      			2004-01-01
      			2005-01-01
      			100000.00
      			Life Insurance policy includes any 
      				accidental damages.
      		
      		
      			House
      			2004-01-01
      			2005-01-01
      			50000.00
      			Home Insurance
      		
      		
      			Car 1
      			2004-01-01
      			2005-01-01
      			15000.00
      			Car Insurance - Ferrari 2004 - Primary 
      				Car 
      		
      		
      			Car 2
      			2004-01-01
      			2005-01-01
      			5000.00
      			Car Insurance - Lexus 2003 - Secondary 
      				Car 
      		
      		
      			Restaurant
      			2004-01-01
      			2005-01-01
      			25000.00
      			Business Insurance - Restaurant
      				
      		
      	
      	
      		Tom
      		Cross
      		1970-11-11
      		
      			113 Duke St.
      			Shelton
      			CT
      			08989
      			US
      		
      		
      			123 Lex Lane
      			Fairfield
      			NY
      			09833
      			US
      		
      		
      			House
      			2004-01-01
      			2005-01-01
      			2000.00
      			Home Insurance
      		
      		
      			Life
      			2004-01-01
      			2005-01-01
      			100000.00
      			Life Insurance
      		
      		
      			Car 1
      			2004-01-01
      			2005-01-01
      			2000.00
      			Car Insurance - Camry 2004 - Primary 
      				Car 
      		
      	
      
      
      

      应用程序设计流程

      图 6 描述了该场景的应用程序设计流程。


      图 6. 应用程序设计流程
      图 6. 应用程序设计流程 

      运行时的体系结构

      页面请求时,将发生(如图 7 所示):

      1. JSF 运行时调用 BrokerDetailRoot bean。
      2. BrokerDetailRoot 通过将 brokerDetailRequest.xml 发送到 BrokerService 来预载数据。
      3. BrokerService 发回响应作为 brokerDetailResponse.xml
      4. 收到的来自于代理服务调用的响应(作为 brokerDetailResponse.xml)被传递到 XMLTransformServiceFactory。
      5. XML 被转换成了包装在 BrokerDetailRoot bean 中的 SDO。
      6. bean 在 JSF 运行时被处理。
      7. JSF 运行时通过组合的数据给予控制。


      图 7. 运行时的体系结构
      图 7. 运行时的体系结构 

      实现解决方案

      在下面的部分中详细地描述了实现这种解决方案的步骤:

      1. 引入项目转换
      2. 从 XSD schema 创建 SDO 包
      3. 创建基本的根 Java bean
      4. 创建代理服务根 Java bean
      5. 创建 JSF JSP
      6. 向页面数据中添加页面 BrokerDetailRoot bean
      7. 向页面代码中添加命令方法
      8. 创建页面上的控制并绑定到页面数据的 SDO 类型上
      9. 运行 brokerdetail.jsp

      1. 引入项目转换

        将项目转换 xsd_sdo_soa_xml_tutorial.zip 下载文件引入到 Application Developer 工作中。结果,下列文件将被引入(如图 8 所示):

        • XYZInsuranceEAR:企业应用程序项目,它包括作为模版或实用程序的所有其他项目。
        • XYZInsuranceWeb:动态 Web 项目用于所有能够创建 JSF JSP 页面的应用程序。该项目的 WebContent 文件夹包括 BrokerService.xsd schema 并且在 Schema 文件夹中含有实例数据文件。为了简单起见,本实例中 schema 以及 SDO 包都作为 WebProject 的部分。如果需要在多个 Web 项目中共享同一个 SDO,那么您可以为 SDO 包创建独立的 Java 项目。这个 SDO 包被构建在 XML Schema 所在的同一个项目中。
        • XYZInsuranceService:包括实现代理服务的 Java 类。该服务装载并发出了与服务方法请求相应的 XML 响应。提供这个基本的实现来模拟服务行为。它的实现超出了文章介绍的范围。
        • XYZInsuranceServiceProxy:包括用于调用代理服务的 ServiceProxy 的基本的实现。
        下面的部分描述了 XYZInsuranceWeb 项目的额外内容。


        图 8. 引入的指导项目转换
        图 8. 引入的指导项目转换
      2. 从 XSD schema 中创建 SDO 包

        在 Application Developer 中,右键单击 BrokerService.xsd,然后选择 Create SDO Package(如图 9 所示)。


        图 9. 创建 SDO 包
        图 9. 创建 SDO 包

        结果,将生成下面的工件(如图 10 所示):

        • xyz.brokerservicexyz.brokerservice.impl,以及 xyz.brokerservice.util 包括 SDO 及为了适合于 XSD schema 中定义的类型而构建的相关工具的 Java 包。
        • 框架 JAR 文件——xsdsdotransform.jar,它被添加到 EAR 项目并且 Web 项目的 JAR 依赖被相应地更新来建立运行时的类路径。


        图 10. 生成的 SDO 包
        图 10. 生成的 SDO 包

        包名来源于 XSD 中声明的定义在 schema 中的 targetNamespace(如图 11 所示)。


        图 11. TargetNamespace 声明
        图 11. TargetNamespace 声明
      3. 创建基础的根 Java bean

        brokerservice.root 包中创建 BaseBrokerServiceRoot.java(可从 xsd_sdo_soa_part1_listings.zip 下载文件中获得)Java 类作为所有页面根 bean 包装器的基本类。SDO 包的 schema 命名空间的注册工作在静态块中完成。运行时,检查 XML 实例文档的命名空间来在这个注册表中定位相关的 SDO 包:

        static{
        	EPackage.Registry.INSTANCE.put(
        		BrokerservicePackage.eINSTANCE.getNsURI()
        		, BrokerservicePackage.eINSTANCE);
        }
        

      4. 创建代理服务根 Java bean

        创建 BrokerDetailRoot.java(可从 xsd_sdo_soa_part1_listings.zip 下载文件中获得)Java 类,使其作为 BrokerDetail.jsp 页面的 bean 包装器。这个 bean 包装了 SDO 包,并使得 SDO 包的用法如同页面数据中的 Java bean。它也包括通过对请求的服务调用的响应来预载 bean 的方法:

        1. 创建方法
          在此实例中,该方法只是简单地返回了 XML 请求字符串,然而将其编码用来调用请求创建者服务(例如,由于需要审核的服务,所以向 XML 请求中添加适宜的头信息,等等)。

          protected String createBrokerDetailRequest(){
          	String request = "
          		
          		narinder
          		makin";
          	//you may also use the create/convert API to create a new request string
          	/*DocumentRoot docRoot = (DocumentRoot)
          		XMLTransformServiceFactory.INSTANCE.create(BrokerservicePackage.eINSTANCE.getNsURI());
          	BrokerServiceType bs = docRoot.createBrokerService();
          	xyz.brokerservice.BrokerType b = bs.createBroker();
          	b.setBrokerId("099-99-9999");
          	b.setLoginName("narinder");
          	b.setLoginPassword("makin");
          	request = XMLTransformServiceFactory.INSTANCE.convert((DataObject)b);
          	*/
          	return request;
          }



        2. 加载方法
          调用 XMLTransformServiceFactory 方法将代理的详细的响应 XML 转换成 SDO。

          protected void loadBrokerDetailResponse(String response){
          	DocumentRoot docRoot=
          	  (DocumentRoot) XMLTransformServiceFactory.INSTANCE.load(response);
          	brokerServiceRoot =  docRoot.getBrokerService();
          }
          



        3. 预载方法
          调用请求及处理响应的服务。

          protected void preLoadBrokerDetail(){
              String xmlData = createBrokerDetailRequest();
              String response =
              	BrokerServiceFactory.invoke(xmlData,
          		BrokerServiceFactory.BROKERDETAIL_REQUEST);
              loadBrokerDetailResponse(response);
          }
          



        4. sortByPolicyName 方法
          通过使用策略集中的名称将策略分类。

          public void sortByPolicyName(List listPolicies){
          	ObjectUtil.INSTANCE.sort(listPolicies,
          		BrokerserviceFactory.eINSTANCE,
          		BrokerservicePackage.eINSTANCE.getPolicyType_PolicyName(),
          		true);
          }
          



        5. dw.ibm.etools.xsd.sdo.xmltransform.util.ObjectUtil 助手类
          提供了框架代码来将列表分类。

          /**
           * Sorts the Objects in the list
           * @param list the instance of the EList containing EObjects
           * @param eFactory the instance of the SDO factory
           * @param sortBy the EAttribute to be used for sorting
           * @param desc true for descending sort, false for ascending
           * @return true if the order of objects in list is changed
           */
          public  boolean sort(List list, EFactory eFactory
          	, EAttribute sortBy, boolean desc);
          

      5. 创建 JSF JSP

        创建 JavaServer Faces JSP 文件作为 brokerdetail.jsp

        1. 在 Application Developer 中,打开 Web 站点向导,从面板中抛出新的页面,并将其重命名成 brokerdetail.jsp
          图 12. Web 站点向导
          图 12. Web 站点向导
        2. 在页面上双击并作为 Faces JSP 来实现它。
          图 13 brokerdetail.jsp
          图 13 brokerdetail.jsp

      6. 将页面 BrokerDetailRoot bean 添加到页面数据中

        BrokerDetailRoot bean 包装了由 XSD 生成的 SDO 类。该 Java bean 是自省的,并且页面数据以树的形式展示了 SDO 类型、属性及引用。下面的步骤用于将根 bean 添加到页面数据中:

        1. 在页面数据视图中单击右键,并通过选取 New => JavaBean 来添加新的 Java Bean(如图 14 所示)。
          图 14. 在页面数据视图中的新 java bean 菜单
          图 14. 在页面数据视图中的新 java bean 菜单
        2. 在 Add JavaBean 对话框(如图 15 所示)中输入 JavaBean 实例的名称作为变量——varBrokerDetailRootBean
          图 15. Java bean 属性
          图 15. Java bean 属性
        3. 选择 Finish。新创建的 bean 将显示在页面数据视图(如图 16 所示)中。
          图 16. BrokerServiceRoot java bean
          图 16. BrokerServiceRoot java bean

      7. 为页面代码添加命令方法

        编辑 BrokerDetail.java 页面代码文件并将下面的方法用作命令动作的方法。这个动作调用了页面根 bean 中的 sortByPolicyName 方法通过名称来为策略的显示数据分类。(被访问的 table2 控制被加到了下面的部分中。)您可以创建一个用于策略列表的参数变量,并且使用它而非通过 table 控制来访问该列表。

        public String doSortByPolicyNameAction(){
        	//table2 is the policy data table
        	//you may choose to add a param scope variable
        	//for policy list, instead of using the table control
        	getVarBrokerDetailRootBean().sortByPolicyName
        		((java.util.List)getTable2().getValue());
        	// returning empty string re-displays the same page with same data binding
        	return "";
        }

      8. 创建页面上的控制并绑定到页面数据的 SDO 类型上

        您可以设计页面的根数据并且使得页面编辑器为您创建基于已设计好的数据类型的控制,或者您也可以放弃个人控制并亲自绑定数据元素。为了简单起见,我们将使用页面编辑器来创建这些控制。创建数据表并与每个 SDO 类型绑定,创建输出文字字段并将其与每个属性及在这些类型中的单一值的引用相绑定。对于每个多值引用而言,需要创建并绑定嵌套的数据表。

        1. 从页面数据视图中拖动 broker SDO 并将其交付给页面编辑器(如图 17 和 18 所示)。
          图 17. Broker SDO
          图 17. Broker SDO

          图 18. 页面设计器
          图 18. 页面设计器
        2. Depth 属性决定了嵌套表格控制创建的深度。将深度设置为 5 可以自定义表格属性(如图 19 所示)。
          图 19. 数据表格属性
          图 19. 数据表格属性
        3. 为“客户”列表指定数据类型(如图 20 所示)。如果您希望将列表属性绑定到页面上的任何控制中去,就需要提供每个列表属性的数据类型。
          图 20. 客户集的对象类型
          图 20. 客户集的对象类型
        4. 通过取消选定 clientAsArray 属性来定制代理的设计属性(如图 21 所示)。
          图 21. 定制代理设计
          图 21. 定制代理设计
        5. 单击...,它显示在客户属性之后(如图 21 所示)并为“策略”列表指定数据类型(如图 22 所示)。
          图 22. 策略集的对象类型
          图 22. 策略集的对象类型
        6. 自定义“客户”设计属性并取消选定 policyAsArray 属性(如图 23 所示)。
          图 23. 自定义客户设计
          图 23. 自定义客户设计
        7. 选择 Finish。创建页面控制并将其绑定到根 bean 的元素中去(如图 24 所示)。
          图 24. 建立控制
          图 24. 建立控制
        8. 将您选择的页面控制添加到客户表中,并且设定每页显示 1 行(如图 25 和 26 所示)。
          图 25. 显示选项
          图 25. 显示选项

          图 26. 附加的页面控制
          图 26. 附加的页面控制
        9. 为政策数据表格添加命令按钮并将按钮的标签改成 SortByPolicyName(如图 27 所示)。显示政策数据表格的页脚,使您能够放置命令按钮(如图 28 所示)。
          图 27. 命令按钮
          图 27. 命令按钮

          图 28. 附加的命令按钮
          图 28. 附加的命令按钮
        10. 将命令按钮绑定到 doSortByPolicyNameAction 上(如图 29 所示)。如果没有显示“action”属性,那么将显示数据表格的所有属性。
          图 29. 将命令绑定到动作上
          图 29. 将命令绑定到动作上
          这里展示的分类机制是服务器端通过调用命令动作来分类的。基于您的需求,您可以选择在客户端实现这个分类。

      9. 运行 brokerdetail.jsp

        1. 在 Application Developer 中,右键单击 brokerdetail.jsp 并选择 Run On Server。(如果没有提示您启动服务器,那么先启动服务器,然后在运行页面之前向服务器中添加 XYZInsuranceEAR 项目。)
        2. 测试容器中页面的 URL 是(或者类似于):http://localhost:9080/XYZInsuranceWeb/faces/brokerdetail.jsp
          图 30. brokerdetail.jsp
          图 30. brokerdetail.jsp
        3. 对于客户而言,使用页面控制来控制页面。
        4. 选择 SortByPolicyName 命令通过名称来将政策分类。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14780828/viewspace-592652/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-07-07

  • 博文量
    251
  • 访问量
    294985