本系列文章提出了加快基于 XML 的面向服务的体系结构(Service Oriented Architecture,SOA)应用程序表示开发的解决方案。这种解决方案包括 Eclipse 功能,可以生成静态类型的用于 XSD Schema 的服务对象数据(Service Data Object,SDO),并提供了在表示元素数据与 XML 数据相互转换中使用 SDO 的运行框架。
引言
松耦合、粗粒度的面向服务的体系结构(Service Oriented Architecture,SOA)应用程序围绕着 XML 数据交换(XML Data Interchange)开发,它常需要一些表示层的开发。这样的体系结构的基本需求是表示的绑定控制数据对象以及数据对象与 XML 数据的相互转换。用于表示开发的现有的框架(如 JavaServer™ Faces,JSF)使得数据能够在属性的表示元素与 Java™ bean 类的引用之间进行转换。在 XML 与数据对象转换实现的过程中最乏味的工作留给了开发者,通过使用第三方指定的框架或编写代码来实现。
这个包含五部分的系列文章提出了加快基于 XML 的 SOA 应用程序表示开发的解决方案,并包括 Eclipse 功能使得可以生成静态类型的用于 XSD Schema 的服务对象数据(service data object,SDO),以及使用 SDO 实现表示元素数据与 XML 数据之间相互转换的运行框架。
在该系列文章的第 1 部分中,我们将经历通过使用提供的插件集来向每个指定的 XML schema 中的服务传递信息的简单 JSF 应用程序的整个开发过程。本文中的应用程序场景进行了一次服务调用——发出一个 XML 请求及收到一个 XML 响应。这个应用程序说明了主从复合结构的数据对象视图,连同分页及分类的能力。本文还描述了应用程序在设计时和运行时的体系结构。
Rational® Application Developer V6 以及 Websphere® Application Server V6 需要利用这种转换功能。本文假定读者是精通 Rational Application Developer 的 JSF 页面设计师。
安装 XSD SDO 转换功能
- 将下载文件
xsdsdotransform-feature.zip
解压缩到您的 Rational Application Developer 安装的 rad\eclipse
目录下(例如,D:\IBM\RSDP\6.0\rad\eclipse
)。
- 启动 Rational Application Developer(以下简称为 Application Developer)。
- 选取 Help => Software Updates => Manage Configuration(如图 1 所示)。
图 1. 功能安装
- 如图 2 所示使得 XSD SDO 转换功能生效,然后重启 Application Developer。
图 2. 功能安装
您可以用 -clean
命令行参数启动 Application Developer 来确保该功能的配置更新。
XSD SDO 转换功能的内容
XSD SDO 转换功能包括用于从 XSD schema 中生成 SDO 包的工件,以及用于将 SDO 包实例转换到 XML 实例文件中或从 XML 实例文件中转换出 SDO 包实例的框架组件:
-
创建 SDO 包的动作
在 XSD 资源中的这个动作从 XSD schema 中生成了 SDO 包(如图 3 所示)。
图 3. 创建 SDO 包
-
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
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http:///xyz.brokerservice.ecore"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
targetNamespace="http:///xyz.brokerservice.ecore">
<xsd:annotation>
<xsd:documentation xml:lang="en">
Broker Service Schema for xyz.com.
Copyright 2004 ibm.com. All rights reserved.
</xsd:documentation>
</xsd:annotation>
<xsd:element name="brokerService" type="brokerServiceType"/>
<xsd:complexType name="brokerServiceType">
<xsd:sequence>
<xsd:element minOccurs="0" name="broker" type="brokerType"/>
<xsd:element minOccurs="0" name="error" type="errorType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="brokerType">
<xsd:sequence>
<xsd:element minOccurs="0" ref="firstName"/>
<xsd:element minOccurs="0" ref="lastName"/>
<xsd:element minOccurs="0" name="loginName" type="xsd:string"/>
<xsd:element minOccurs="0" name="loginPassword" type="xsd:string"/>
<xsd:element maxOccurs="unbounded" minOccurs="0" name="client" type="clientType"/>
</xsd:sequence>
<xsd:attribute name="brokerId" type="xsd:string" use="required"/>
</xsd:complexType>
<xsd:complexType name="clientType">
<xsd:sequence>
<xsd:element minOccurs="0" ref="firstName"/>
<xsd:element minOccurs="0" ref="lastName"/>
<xsd:element minOccurs="0" name="dateOfBirth" type="xsd:date"/>
<xsd:element minOccurs="0" name="currentAddress" type="addressType"/>
<xsd:element minOccurs="0" name="permanentAddress" type="addressType"/>
<xsd:element maxOccurs="unbounded" minOccurs="0" name="policy" type="policyType"/>
</xsd:sequence>
<xsd:attribute name="clientId" type="xsd:string" use="required"/>
</xsd:complexType>
<xsd:complexType name="addressType">
<xsd:sequence>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="xsd:string"/>
<xsd:element name="zip" type="xsd:string"/>
<xsd:element name="country" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="policyType">
<xsd:sequence>
<xsd:element name="policyName" type="xsd:string"/>
<xsd:element name="policyStartDate" type="xsd:date"/>
<xsd:element name="policyEndDate" type="xsd:date"/>
<xsd:element name="policyAmount" type="xsd:string"/>
<xsd:element name="policyDescription" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="policyId" type="xsd:string" use="required"/>
</xsd:complexType>
<xsd:complexType name="errorType">
<xsd:sequence>
<xsd:element name="errorCode" type="xsd:string"/>
<xsd:element name="errorDescription" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="firstName" type="xsd:string"/>
<xsd:element name="lastName" type="xsd:string"/>
</xsd:schema>
|
图 4. BrokerService 方案模式
在该场景中,我们开发了一个 brokerdetail.jsp
JavaServer Faces JSP 页面。该页面发出代理人请求的详细信息(brokerDetailRequest.xml
,如清单 2 所示),并收到包含所有代理人的客户及他们策略的响应(brokerDetailResponse.xml
,如清单 3 所示)。每页显示一个客户的详细信息并且按名将他们的策略分类。
图 5. BrokerDetail 请求及响应消息流
(代码如清单 2 和 3 所示,可 xsd_sdo_soa_part1_listings.zip
下载文件中获得。)
清单 2. brokerDetailRequest.xml
<brokerService xmlns="http:///xyz.brokerservice.ecore"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<broker brokerId="099-99-9999">
<loginName>narinder</loginName>
<loginPassword>makin</loginPassword>
</broker>
</brokerService>
|
清单 3. brokerDetailResponse.xml
<brokerService xmlns="http:///xyz.brokerservice.ecore"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<broker brokerId="000-00-9999">
<firstName>Narinder</firstName>
<lastName>Makin</lastName>
<client clientId="001-00-9999">
<firstName>Dan</firstName>
<lastName>Moore</lastName>
<dateOfBirth>1967-08-13</dateOfBirth>
<currentAddress>
<street>113 Oak Pine St.</street>
<city>Santa Clara</city>
<state>LA</state>
<zip>91929</zip>
<country>US</country>
</currentAddress>
<permanentAddress>
<street>123 Demi Lane</street>
<city>Cary</city>
<state>NC</state>
<zip>22999</zip>
<country>US</country>
</permanentAddress>
<policy policyId="L000000000">
<policyName>Life</policyName>
<policyStartDate>2004-01-01</policyStartDate>
<policyEndDate>2005-01-01</policyEndDate>
<policyAmount>100000.00</policyAmount>
<policyDescription>Life Insurance policy includes any
accidental damages.</policyDescription>
</policy>
<policy policyId="H000000000">
<policyName>House</policyName>
<policyStartDate>2004-01-01</policyStartDate>
<policyEndDate>2005-01-01</policyEndDate>
<policyAmount>50000.00</policyAmount>
<policyDescription>Home Insurance</policyDescription>
</policy>
<policy policyId="C000000001">
<policyName>Car 1</policyName>
<policyStartDate>2004-01-01</policyStartDate>
<policyEndDate>2005-01-01</policyEndDate>
<policyAmount>15000.00</policyAmount>
<policyDescription>Car Insurance - Ferrari 2004 - Primary
Car </policyDescription>
</policy>
<policy policyId="C000000002">
<policyName>Car 2</policyName>
<policyStartDate>2004-01-01</policyStartDate>
<policyEndDate>2005-01-01</policyEndDate>
<policyAmount>5000.00</policyAmount>
<policyDescription>Car Insurance - Lexus 2003 - Secondary
Car </policyDescription>
</policy>
<policy policyId="B000000002">
<policyName>Restaurant</policyName>
<policyStartDate>2004-01-01</policyStartDate>
<policyEndDate>2005-01-01</policyEndDate>
<policyAmount>25000.00</policyAmount>
<policyDescription>Business Insurance - Restaurant
</policyDescription>
</policy>
</client>
<client clientId="002-00-9999">
<firstName>Tom</firstName>
<lastName>Cross</lastName>
<dateOfBirth>1970-11-11</dateOfBirth>
<currentAddress>
<street>113 Duke St.</street>
<city>Shelton</city>
<state>CT</state>
<zip>08989</zip>
<country>US</country>
</currentAddress>
<permanentAddress>
<street>123 Lex Lane</street>
<city>Fairfield</city>
<state>NY</state>
<zip>09833</zip>
<country>US</country>
</permanentAddress>
<policy policyId="H100000000">
<policyName>House</policyName>
<policyStartDate>2004-01-01</policyStartDate>
<policyEndDate>2005-01-01</policyEndDate>
<policyAmount>2000.00</policyAmount>
<policyDescription>Home Insurance</policyDescription>
</policy>
<policy policyId="L100000000">
<policyName>Life</policyName>
<policyStartDate>2004-01-01</policyStartDate>
<policyEndDate>2005-01-01</policyEndDate>
<policyAmount>100000.00</policyAmount>
<policyDescription>Life Insurance</policyDescription>
</policy>
<policy policyId="C100000001">
<policyName>Car 1</policyName>
<policyStartDate>2004-01-01</policyStartDate>
<policyEndDate>2005-01-01</policyEndDate>
<policyAmount>2000.00</policyAmount>
<policyDescription>Car Insurance - Camry 2004 - Primary
Car </policyDescription>
</policy>
</client>
</broker>
</brokerService>
|
|
|
应用程序设计流程
图 6 描述了该场景的应用程序设计流程。
图 6. 应用程序设计流程
运行时的体系结构
页面请求时,将发生(如图 7 所示):
- JSF 运行时调用 BrokerDetailRoot bean。
- BrokerDetailRoot 通过将
brokerDetailRequest.xml
发送到 BrokerService 来预载数据。
- BrokerService 发回响应作为
brokerDetailResponse.xml
。
- 收到的来自于代理服务调用的响应(作为
brokerDetailResponse.xml
)被传递到 XMLTransformServiceFactory。
- XML 被转换成了包装在 BrokerDetailRoot bean 中的 SDO。
- bean 在 JSF 运行时被处理。
- JSF 运行时通过组合的数据给予控制。
图 7. 运行时的体系结构
实现解决方案
在下面的部分中详细地描述了实现这种解决方案的步骤:
-
引入项目转换
-
从 XSD schema 创建 SDO 包
-
创建基本的根 Java bean
-
创建代理服务根 Java bean
-
创建 JSF JSP
-
向页面数据中添加页面 BrokerDetailRoot bean
-
向页面代码中添加命令方法
-
创建页面上的控制并绑定到页面数据的 SDO 类型上
-
运行 brokerdetail.jsp
。
-
引入项目转换
将项目转换 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. 引入的指导项目转换
- 从 XSD schema 中创建 SDO 包
在 Application Developer 中,右键单击 BrokerService.xsd,然后选择 Create SDO Package(如图 9 所示)。
图 9. 创建 SDO 包
结果,将生成下面的工件(如图 10 所示):
xyz.brokerservice
、xyz.brokerservice.impl
,以及 xyz.brokerservice.util
包括 SDO 及为了适合于 XSD schema 中定义的类型而构建的相关工具的 Java 包。
- 框架 JAR 文件——
xsdsdotransform.jar
,它被添加到 EAR 项目并且 Web 项目的 JAR 依赖被相应地更新来建立运行时的类路径。
图 10. 生成的 SDO 包
包名来源于 XSD 中声明的定义在 schema 中的 targetNamespace(如图 11 所示)。
图 11. TargetNamespace 声明
- 创建基础的根 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);
}
|
- 创建代理服务根 Java bean
创建 BrokerDetailRoot.java
(可从 xsd_sdo_soa_part1_listings.zip
下载文件中获得)Java 类,使其作为 BrokerDetail.jsp
页面的 bean 包装器。这个 bean 包装了 SDO 包,并使得 SDO 包的用法如同页面数据中的 Java bean。它也包括通过对请求的服务调用的响应来预载 bean 的方法:
- 创建方法
在此实例中,该方法只是简单地返回了 XML 请求字符串,然而将其编码用来调用请求创建者服务(例如,由于需要审核的服务,所以向 XML 请求中添加适宜的头信息,等等)。
protected String createBrokerDetailRequest(){
String request = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<brokerService mlns=\"http:///xyz.brokerservice.ecore\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">
<broker brokerId=\"099-99-9999\"><loginName>narinder</loginName>
<loginPassword>makin</loginPassword></broker></brokerService>";
//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;
}
|
- 加载方法
调用 XMLTransformServiceFactory 方法将代理的详细的响应 XML 转换成 SDO。
protected void loadBrokerDetailResponse(String response){
DocumentRoot docRoot=
(DocumentRoot) XMLTransformServiceFactory.INSTANCE.load(response);
brokerServiceRoot = docRoot.getBrokerService();
}
|
- 预载方法
调用请求及处理响应的服务。
protected void preLoadBrokerDetail(){
String xmlData = createBrokerDetailRequest();
String response =
BrokerServiceFactory.invoke(xmlData,
BrokerServiceFactory.BROKERDETAIL_REQUEST);
loadBrokerDetailResponse(response);
}
|
- sortByPolicyName 方法
通过使用策略集中的名称将策略分类。
public void sortByPolicyName(List listPolicies){
ObjectUtil.INSTANCE.sort(listPolicies,
BrokerserviceFactory.eINSTANCE,
BrokerservicePackage.eINSTANCE.getPolicyType_PolicyName(),
true);
}
|
- 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);
|
- 创建 JSF JSP
创建 JavaServer Faces JSP 文件作为 brokerdetail.jsp
- 在 Application Developer 中,打开 Web 站点向导,从面板中抛出新的页面,并将其重命名成
brokerdetail.jsp
。
图 12. Web 站点向导
- 在页面上双击并作为 Faces JSP 来实现它。
图 13 brokerdetail.jsp
- 将页面 BrokerDetailRoot bean 添加到页面数据中
BrokerDetailRoot bean 包装了由 XSD 生成的 SDO 类。该 Java bean 是自省的,并且页面数据以树的形式展示了 SDO 类型、属性及引用。下面的步骤用于将根 bean 添加到页面数据中:
- 在页面数据视图中单击右键,并通过选取 New => JavaBean 来添加新的 Java Bean(如图 14 所示)。
图 14. 在页面数据视图中的新 java bean 菜单
- 在 Add JavaBean 对话框(如图 15 所示)中输入 JavaBean 实例的名称作为变量——
varBrokerDetailRootBean
。
图 15. Java bean 属性
- 选择 Finish。新创建的 bean 将显示在页面数据视图(如图 16 所示)中。
图 16. BrokerServiceRoot java bean
- 为页面代码添加命令方法
编辑 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 "";
}
|
- 创建页面上的控制并绑定到页面数据的 SDO 类型上
您可以设计页面的根数据并且使得页面编辑器为您创建基于已设计好的数据类型的控制,或者您也可以放弃个人控制并亲自绑定数据元素。为了简单起见,我们将使用页面编辑器来创建这些控制。创建数据表并与每个 SDO 类型绑定,创建输出文字字段并将其与每个属性及在这些类型中的单一值的引用相绑定。对于每个多值引用而言,需要创建并绑定嵌套的数据表。
- 从页面数据视图中拖动 broker SDO 并将其交付给页面编辑器(如图 17 和 18 所示)。
图 17. Broker SDO
图 18. 页面设计器
- Depth 属性决定了嵌套表格控制创建的深度。将深度设置为 5 可以自定义表格属性(如图 19 所示)。
图 19. 数据表格属性
- 为“客户”列表指定数据类型(如图 20 所示)。如果您希望将列表属性绑定到页面上的任何控制中去,就需要提供每个列表属性的数据类型。
图 20. 客户集的对象类型
- 通过取消选定 clientAsArray 属性来定制代理的设计属性(如图 21 所示)。
图 21. 定制代理设计
- 单击...,它显示在客户属性之后(如图 21 所示)并为“策略”列表指定数据类型(如图 22 所示)。
图 22. 策略集的对象类型
- 自定义“客户”设计属性并取消选定 policyAsArray 属性(如图 23 所示)。
图 23. 自定义客户设计
- 选择 Finish。创建页面控制并将其绑定到根 bean 的元素中去(如图 24 所示)。
图 24. 建立控制
- 将您选择的页面控制添加到客户表中,并且设定每页显示 1 行(如图 25 和 26 所示)。
图 25. 显示选项
图 26. 附加的页面控制
- 为政策数据表格添加命令按钮并将按钮的标签改成
SortByPolicyName
(如图 27 所示)。显示政策数据表格的页脚,使您能够放置命令按钮(如图 28 所示)。
图 27. 命令按钮
图 28. 附加的命令按钮
- 将命令按钮绑定到 doSortByPolicyNameAction 上(如图 29 所示)。如果没有显示“action”属性,那么将显示数据表格的所有属性。
图 29. 将命令绑定到动作上
这里展示的分类机制是服务器端通过调用命令动作来分类的。基于您的需求,您可以选择在客户端实现这个分类。
- 运行 brokerdetail.jsp
- 在 Application Developer 中,右键单击 brokerdetail.jsp 并选择 Run On Server。(如果没有提示您启动服务器,那么先启动服务器,然后在运行页面之前向服务器中添加 XYZInsuranceEAR 项目。)
- 测试容器中页面的 URL 是(或者类似于):
http://localhost:9080/XYZInsuranceWeb/faces/brokerdetail.jsp
。
图 30. brokerdetail.jsp
- 对于客户而言,使用页面控制来控制页面。
- 选择 SortByPolicyName 命令通过名称来将政策分类。
|
|
结束语
在本系列文章的第 1 部分中,我们提出了加快 JSF 开发的解决方案用于基于 XML 的 SOA 应用程序。这个解决方案提供了 Eclipse 功能以及框架工具,在设计时可用其将 XML Schema 转换成包括静态服务数据对象的 Java 包,在运行时可用其将 XML 实例文件与这些 SDO 相互转化。SDO 包装成 JavaBean,连同 JavaServer Faces 一起被用于表示开发。本文也提供了对于基本的保险应用程序的场景开发 JSF 表示的通用步骤,包括主从复合结构的视图、分类及分页能力。
在该系类文章中的第 2 部分,扩展了第 1 部分中开发的解决方案,包括新建、更新以及删除的功能,包括用本地附加的变量及基本的转换来自定义生成 SDO。该文章将举例说明多 schema 模型、对于单一页面中多个请求及响应的场景,并且说明绑定 XML 数据的 JSF 下拉式控制。
在该系列文章中将介绍:
- 第 3 部分将描述操作已生成的 SDO 以及自定义 XML-SDO 转换器的高级技术。它也提供了聚集方法(sun、mean、average 等)的工具,这些方法是对SDO 对象及集合的一般操作。
- 第 4 部分重在使用 XSDO SDO 转换功能进行基于 XML 的 SOA 的 portlet 开发,为 JSR 168 portlet 新建的对象寻址、portlet 的参数传递,以及在任何其他 portlet 中的 portlet 动作上动态地设置对象 portlet 视图。
- 第 5 部分将讨论使用 XSDO SDO 转换功能使 JSF 及基于 XML 的 SOA 的 portlet 应用程序局部化,并且提出基于首选地点显示的静态及动态内容。
下载
描述 |
名字 |
大小 |
下载方法 |
Download file 1 |
xsd_sdo_soa_xml_sample.zip |
727 KB |
FTP|HTTP |
Download file 2 |
xsd_sdo_soa_xml_tutorial.zip |
685 KB |
FTP|HTTP |
Download file 3 |
xsdsdotransform-feature.zip |
727 KB |
FTP|HTTP |
Download file 4 |
XYZInsuranceEAR.zip |
725 KB |
FTP|HTTP |
Download file 5 |
xsd sdo soa part1 listings.zip |
8 KB |
FTP|HTTP |