青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 181, 文章 - 2, 評論 - 85, 引用 - 0
數據加載中……

使用 Rational Application Developer 和 WebSphere Application Server 來加速基于 XML 的 SOA 的 JSF 開發——第 1 部分

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

  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

												
														<?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 方案模式
圖 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

												
														<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. 應用程序設計流程
圖 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.brokerservice、xyz.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 = "<?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;
      }



    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 命令通過名稱來將政策分類。







結束語

在本系列文章的第 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

posted on 2006-04-17 03:04 wsdfsdf 閱讀(442) 評論(0)  編輯 收藏 引用 所屬分類: 技術文章

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区免费视频| 亚洲精品久久久久久久久久久久| 久久久久.com| 午夜伦理片一区| 在线视频精品一区| 999亚洲国产精| 在线亚洲一区二区| 亚洲一区二区三区免费在线观看| 亚洲人在线视频| 夜夜嗨网站十八久久| 一区二区三区高清| 午夜激情久久久| 久久九九久精品国产免费直播| 欧美亚洲日本网站| 久久免费午夜影院| 欧美日韩国产区| 国产亚洲欧洲997久久综合| 狠狠色噜噜狠狠色综合久| 亚洲精品一区二区在线| 激情综合在线| 在线免费观看视频一区| 91久久久久久| 欧美一区二区三区免费在线看| 亚洲香蕉成视频在线观看| 国产精品夫妻自拍| 欧美日韩另类丝袜其他| 国产精品亚洲综合| 久久精品国产v日韩v亚洲| 久久综合一区二区三区| 国产精品国产一区二区| 在线精品福利| 欧美激情一区二区三区在线视频观看| 欧美视频在线观看免费| 亚洲精品久久嫩草网站秘色 | 亚洲午夜激情网站| 免费成人高清| 欧美激情偷拍| 美女免费视频一区| 国产精品女人毛片| 亚洲一区二区黄色| 日韩一级成人av| 欧美天天影院| 午夜精品久久久久久99热| 日韩一区二区精品| 国产精品二区三区四区| 午夜精品久久久久久久久| 欧美不卡激情三级在线观看| 欧美亚洲一区在线| 国产欧美一区二区三区久久| 久久av一区二区| 久久精品人人| 日韩亚洲欧美一区| 一区二区三区四区国产| 国产午夜精品视频| 亚洲国产天堂久久综合网| 欧美日韩亚洲一区在线观看| 亚洲欧美不卡| 久久亚洲免费| 性色av香蕉一区二区| 久久精品夜色噜噜亚洲aⅴ| 日韩视频欧美视频| 欧美一区二区三区在线视频| 欧美一区二区三区日韩| 影院欧美亚洲| 日韩午夜在线| 亚洲激情影视| 久久午夜国产精品| 欧美在线播放一区二区| 欧美精品国产精品| 欧美1区免费| 国外视频精品毛片| 亚洲午夜精品17c| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲日本电影在线| 久久福利精品| 久久精品夜夜夜夜久久| 国产精品一级在线| 亚洲一区二区欧美日韩| 亚洲伊人色欲综合网| 欧美日韩中文在线观看| 亚洲狼人精品一区二区三区| 亚洲免费电影在线观看| 欧美国产日韩精品| 亚洲人体影院| 亚洲女人天堂成人av在线| 国产精品久久久久久影视| 99国产精品| 欧美一区二区在线视频| 午夜亚洲激情| 日韩一级欧洲| 一区二区三区你懂的| 亚洲女人av| 一区二区亚洲精品国产| 久久亚洲免费| 最新国产乱人伦偷精品免费网站 | 国产亚洲毛片在线| 欧美诱惑福利视频| 亚洲大胆美女视频| 亚洲欧美日韩精品久久亚洲区| 国产精品乱码一区二区三区| 亚洲在线一区| 亚洲国产精品va在看黑人| 亚洲主播在线| 亚洲日本成人网| 韩国福利一区| 国产精品免费一区豆花| 欧美肥婆在线| 蜜桃久久av一区| 久久精品国产99| 亚洲午夜av电影| 一本色道久久综合亚洲精品婷婷| 久久久久国产精品麻豆ai换脸| 日韩亚洲视频在线| 亚洲国产精品一区二区三区| 国产精品麻豆欧美日韩ww| 欧美激情片在线观看| 麻豆精品在线视频| 麻豆乱码国产一区二区三区| 久久阴道视频| 久久综合影音| 欧美日韩国产不卡在线看| 欧美国产日韩亚洲一区| 免费精品视频| 欧美精品一区三区| 国产精品久久久久99| 国产色婷婷国产综合在线理论片a| 国产精品久久久久影院色老大| 国产精品www| 在线播放中文一区| 亚洲欧洲一区二区三区| 亚洲香蕉视频| 欧美一区2区视频在线观看| 久久视频在线视频| 久久精品亚洲一区| 日韩亚洲成人av在线| 亚洲午夜未删减在线观看| 亚洲免费在线播放| 欧美国产精品劲爆| 亚洲性视频网站| 欧美成人亚洲成人| 国产日韩欧美日韩大片| 亚洲人体偷拍| 久久综合国产精品| 午夜视频精品| 国产精品久久久久9999高清| 精品成人乱色一区二区| 亚洲午夜电影网| 日韩网站在线| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美色欧美亚洲另类二区| 亚洲电影观看| 免费成人小视频| 久久久国产91| 红桃视频国产一区| 久久亚洲私人国产精品va| 亚洲综合99| 国产日韩一区二区三区在线| 亚洲午夜免费视频| 一区二区三区精品久久久| 欧美日韩一区二区三区免费看| 亚洲精品久久久久中文字幕欢迎你 | 久久资源av| 久久嫩草精品久久久精品| 伊大人香蕉综合8在线视| 久久全球大尺度高清视频| 久久久成人网| 一区二区日韩| 久久精品2019中文字幕| 老司机免费视频久久| 亚洲精品乱码久久久久久| 亚洲午夜视频| 伊人成年综合电影网| 欧美激情aaaa| 欧美午夜久久久| 久热爱精品视频线路一| 欧美日本一道本| 久久久久久亚洲综合影院红桃 | 亚洲福利在线视频| 欧美日本精品在线| 欧美一区二区三区精品电影| 久久伊人精品天天| 亚洲无毛电影| 欧美日韩国产成人高清视频| 看欧美日韩国产| 国产亚洲欧美激情| 亚洲亚洲精品三区日韩精品在线视频 | 亚洲一区二区视频在线观看| 久久国产免费看| 亚洲综合999| 欧美美女福利视频| 亚洲欧洲综合| 日韩天堂在线观看| 欧美成人精品一区| 亚洲电影免费观看高清完整版在线 | 一本久久综合| 欧美电影免费| 欧美激情乱人伦| 亚洲清纯自拍| 欧美屁股在线| 99在线|亚洲一区二区|