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

隨筆 - 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>
            欧美中文字幕在线观看| 亚洲精品一区二区网址| 亚洲国产欧美日韩另类综合| 亚洲字幕一区二区| 亚洲欧美日韩爽爽影院| 欧美影院在线播放| 久久一本综合频道| 亚洲黑丝一区二区| 亚洲日本免费电影| 亚洲在线视频免费观看| 午夜精品久久| 老牛国产精品一区的观看方式| 久久在线免费观看视频| 欧美国产视频在线| 国产欧美一区二区三区久久人妖| 樱桃国产成人精品视频| 一区二区三区精品视频| 久久综合久色欧美综合狠狠| 亚洲日本aⅴ片在线观看香蕉| 亚洲一区www| 鲁大师成人一区二区三区| 欧美日韩激情网| 影音先锋亚洲电影| 午夜精品福利在线观看| 欧美高清免费| 亚洲一级高清| 欧美激情 亚洲a∨综合| 国产一区二区三区免费不卡| 99精品欧美一区二区蜜桃免费| 亚洲欧美久久| 亚洲人成毛片在线播放| 日韩特黄影片| 新67194成人永久网站| 免费在线视频一区| 亚洲欧美另类中文字幕| 欧美日韩国产一级片| 国内外成人在线| 亚洲欧美一级二级三级| 亚洲欧洲在线播放| 麻豆精品视频在线观看| 国产一区二区三区日韩欧美| 亚洲图片在线| 亚洲日韩成人| 欧美成人一二三| 亚洲国产成人精品女人久久久| 性欧美video另类hd性玩具| 亚洲国产一区二区三区青草影视| 久久aⅴ国产欧美74aaa| 国产日韩欧美视频| 亚洲男女自偷自拍图片另类| 亚洲第一区色| 蜜臀av国产精品久久久久| 韩国成人福利片在线播放| 午夜精品在线| 亚洲欧美中日韩| 国产私拍一区| 久久米奇亚洲| 久久亚洲私人国产精品va媚药| 国内精品免费午夜毛片| 久久久.com| 欧美影院午夜播放| 国产一区二区三区四区老人| 久久国产色av| 久久国产精品电影| 尤物在线精品| 亚洲第一主播视频| 欧美激情精品久久久久久| 亚洲精品视频免费在线观看| 亚洲第一页在线| 欧美激情一区二区三区全黄 | 韩国三级电影久久久久久| 亚洲欧美日产图| 亚洲欧美日韩国产中文| 国产亚洲人成网站在线观看| 久久久国产午夜精品| 久久免费视频观看| 亚洲最新中文字幕| 亚洲欧美卡通另类91av | 亚洲欧美一区二区三区久久| 亚洲一区二区三区在线观看视频| 国产区在线观看成人精品| 久久亚洲免费| 欧美精品精品一区| 亚洲欧美一区二区三区在线| 欧美在线免费看| 91久久综合亚洲鲁鲁五月天| 一区二区三区**美女毛片| 国产一区二区三区在线观看免费视频| 老司机午夜精品视频在线观看| 欧美电影在线观看完整版| 亚洲欧美日本另类| 麻豆精品在线视频| 欧美视频观看一区| 久久影音先锋| 国产精品sss| 美腿丝袜亚洲色图| 欧美日韩在线一区| 欧美.www| 国产区在线观看成人精品| 亚洲欧洲精品一区| 精品51国产黑色丝袜高跟鞋| 在线亚洲成人| 日韩亚洲一区在线播放| 久久久久久久999| 欧美在线高清视频| 欧美日韩在线高清| 亚洲国产日韩欧美| 亚洲大胆人体视频| 亚洲免费在线观看视频| 一区二区三区|亚洲午夜| 老司机aⅴ在线精品导航| 久久国产精品72免费观看| 欧美视频专区一二在线观看| 欧美激情视频一区二区三区不卡| 国产视频一区在线观看一区免费| 在线视频一区观看| 国产精品99久久久久久www| 欧美fxxxxxx另类| 麻豆精品一区二区综合av| 国产一区二区日韩| 亚洲欧美激情一区二区| 亚洲欧美清纯在线制服| 欧美午夜片在线观看| 99精品欧美一区二区三区综合在线 | 亚洲免费精彩视频| 久久精品国产成人| 久久精品女人| 国产综合色在线视频区| 性欧美办公室18xxxxhd| 欧美一级理论片| 国产精品三级久久久久久电影| 一区二区欧美精品| 亚洲影视在线播放| 国产精品乱人伦中文| 亚洲一本视频| 久久av在线看| 韩日在线一区| 蜜臀99久久精品久久久久久软件 | 亚洲一级在线观看| 欧美午夜精品一区| 亚洲性视频网站| 久久精品一区二区三区四区| 国产一区二区黄色| 久久综合狠狠综合久久综合88| 欧美a级大片| 宅男噜噜噜66一区二区66| 国产精品久久久久久久久久直播 | 亚洲一区二区在线播放| 久久动漫亚洲| 亚洲综合视频网| 国产午夜精品在线观看| 亚洲国产高清自拍| 亚洲视频在线观看网站| 国产精自产拍久久久久久| 久久er精品视频| 亚洲国产精品悠悠久久琪琪| 正在播放日韩| 国产一区二区高清不卡| 男人的天堂亚洲| 亚洲视频免费看| 久久影音先锋| 一区二区av| 国产一级久久| 欧美黄色小视频| 亚洲综合999| 欧美国产三区| 亚洲欧美日韩在线播放| 狠狠入ady亚洲精品| 欧美精品97| 性欧美xxxx视频在线观看| 欧美高清视频一区二区三区在线观看| 亚洲伦理在线免费看| 国产精品久久激情| 久热爱精品视频线路一| 中文一区字幕| 欧美黄在线观看| 先锋a资源在线看亚洲| 亚洲日本国产| 国产主播一区二区三区| 欧美另类一区| 久久天天狠狠| 欧美亚洲三级| 日韩亚洲欧美精品| 久热综合在线亚洲精品| 午夜精品一区二区三区电影天堂| 亚洲国产精品va在线观看黑人| 国产精品裸体一区二区三区| 免费短视频成人日韩| 亚洲欧美日韩第一区| 99综合精品| 亚洲日本成人| 亚洲国产精品成人综合色在线婷婷| 久久精品综合网| 欧美一区二区三区播放老司机 | 久久免费视频在线| 午夜国产精品视频免费体验区| 日韩亚洲一区二区| 亚洲蜜桃精久久久久久久| 亚洲高清色综合| 亚洲成色777777女色窝|