本系列文章提出了加快基于 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 |