亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

PASX簡化Java開發

2019-11-18 12:27:50
字體:
來源:轉載
供稿:網友

  你是否曾經編寫了一個程序,卻在復檢的時候發現它的配置過程很不合理?你是否曾經使用過配置文件,卻發現它們不能滿足描述應用程序的需要?你是否為了解決幾個非凡問題而創建過臨時配置補丁,卻把花費更多時間、開發普遍適用方案的希望寄托到了未來?
  
  假如你的回答是肯定的,那么,你和大多數其他java程序員一樣幸運,有一些工具能夠幫助你解決這些問題。假如你的回答是否定的,關于屬性文件局限的討論也許能夠讓你信服——還有更好的方法可供使用。
  
  屬性文件是Java編程和運行環境的一個重要組成部分。然而,當一個程序員需要的功能遠遠超過PRoperties類提供的簡單名字-值對時,他需要有更豐富的表現手法。通常,Java程序員擴展屬性文件的方法是為屬性本身的名字或值(或兩者同時)增加額外的語義信息。很多時候,這種看來有效的方法會使問題越來越復雜。
  
  為說明問題,請利用屬性把一系列的值賦給單個名字。讓我們假定你想要治理一組名稱服務器,可能采用的屬性文件內容如下:
  
  hosts_1=ns.foo.com
  hosts_2=ns.bar.com
  hosts_3=ns.acme.com
  
  代碼很簡單。改變名字-值對中名字的含義之后,你可以輕松地編寫出把“hosts_”開頭的名字當成“hosts”列表中一個元素的程序。
  
  下面,我們來看看一個更復雜的例子。假設你有同一Bean類InternetHost的兩個不同實例:實例A關聯到一個Web服務器的列表;實例B關聯到一個名稱服務器的列表。要從同一個文件配置這兩個實例,一種可能的方案如下:
  
  name_hosts_1=ns.foo.com
  name_hosts_2=ns.bar.com
  name_hosts_3=ns.acme.com
  web_hosts_1=www.foo.com
  web_hosts_2=www.bar.com
  web_hosts_3=www.acme.com
  
  這種方法行得通,但總是給人以拼拼湊湊的感覺。假如你還不相信的話,稍微增加一點問題的復雜性:讓這些列表中的某個元素自己也成為一個列表;或者,使得下劃線字符(“_”)在名字-值對中合法。在這些情況下,簡單的屬性文件變得非常復雜。
  
  作為一個細心的讀者,你可能已經發現,InternetHost各個實例的命名方式逐漸模糊。為了把前三個屬性賦值給實例A,把后三個屬性賦值給實例B,你必須用某種與具體實例無關的方法告訴實例它們該用哪一組屬性值。假如用直接編碼的方式,讓實例A尋找以“name_”開頭的屬性,讓實例B尋找以“Web_”開頭的屬性,那么,這兩個實例將不再屬于同一對象類。
  
  最后的例子還顯示出另外一個問題。這就是,如何來調用實例A?簡單地叫它“A”?到哪里去尋找它?它是本地實例還是遠程接口?是否存在指向它的全局靜態引用?如是,如何訪問實例B(或者,那是否是“B”)?
  
  解決這些問題的方案是使用一個組件配置和命名框架。有許多工具能夠幫助你完成這個任務,其中之一就是PASX。PASX是一個源代碼開放的Java工具,它通過xml進行配置,通過JNDI實現命名。PASX框架用XML配置用戶定義的服務、JNDI名稱空間、JDBC連接池、事件樹、工作隊列和系統日志。
  
  PASX利用XML進行配置,因為XML比簡單的屬性列表具有更豐富的描述能力。為了理解為何XML更適合完成這類任務,請再次考慮第一個例子。假如用PASX定義的標記重新描述,則結果應該如下:
  
  <List>
  <String>ns.foo.com</String>
  <String>ns.bar.com</String>
  <String>ns.acme.com</String>
  </List>
  
  雖然代碼更加冗長,但它的含義比原來要清楚得多。由于一些列表可能被排序,元素在XML文檔中出現的次序決定了它們在最終數據結構中的次序。屬性文件最終用來構造Properties對象,它的名字必須指示出元素的索引,因為Properties對象直接從Hashtable派生得到。
  
  用XML描述時,第二個屬性示例如下所示:
  
  <List name="name-servers">
  <String>ns.foo.com</String>
  <String>ns.bar.com</String>
  <String>ns.acme.com</String>
  </List>
  <List name="web-servers">
  <String>www.foo.com</String>
  <String>www.bar.com</String>
  <String>www.acme.com</String>
  </List>
  
  還記得示例二之后提出的難題嗎?讓列表中的某個元素成為一個子列表,讓其中一個列表成為元素名字可以包含下劃線的映射結構。下面是它的答案:
  
  <List name="name-servers">
  <String>ns.foo.com<String>
  <List>
  <String>ns1.bar.com</String>
  <String>ns2.bar.com</String>
  </List>
  <String>ns.acme.com</String>
  </List>
  <Map name="web-servers">
  <String name="most_visited">www.foo.com<String>
  <String name="most_bytes">www.bar.com</String>
  </Map>
  
  在PASX中,組件(一個類或者一組有著密切關系的類)是實現PASXService接口的Java Bean。它們由XML <Service>標記定義,這個標記用來命名組件的單個實例。賦予實例“A”名稱服務器列表以及賦予實例“B”Web服務器列表的XML代碼如下所示:
  
  <Service name="A" class="my.InternetHost">
  <List name="hosts">
  <String>ns.foo.com</String>
  <String<ns.bar.com</String>
  <String<ns.acme.com</String>
  </List>
  </Service>
  <Service name="B" class="my.InternetHost">
  <List name="hosts">
  <String>web.foo.com</String>
  <String>web.bar.com</String>
  <String>web.acme.com</String>
  </List>
  </Service>
  
  PASX定義了一系列的標準XML標記,用來聲明List、Map、Integer、String、Boolean等類型的屬性。然而,PASXService類還可以經由名稱空間和XML模式使用它自己的XML標記。XML模式答應組件開發者定義自己的標記,答應XML解析器驗證PASX所定義標記和組件開發者所定義標記的合法性。下面的示例模式定義了一個<Server>標記,它必須有hostName和portNumber屬性。<Server>標記必須作為<Cluster>標記的子元素至少出現一次,但可以出現多次。<Cluster>標記必須作為<ServerFarm>標記的子元素出現至少一次,但可以出現多次。
  
  <?xml version="1.0"?>
  <schema xmlns="http://www.w3.org/2000/10/XMLSchema"
  xmlns:pce="http://pasx.org/PASX/CUSTOM-EXAMPLE"
  targetNamespace="http://pasx.org/PASX/CUSTOM-EXAMPLE" elementFormDefault="qualified" >
  
  <annotation>
  <documentation>
  A custom schema example to be using with PASX (PCE)
  </documentation>
  </annotation>
  
  <element name="Server">
  <complexType content="empty">
  <attribute
  name="hostName"
  use="required"
  type="string"/>
  <attribute
  name="portNumber"
  use="required"
  type="positiveInteger"/>
  </complexType>
  </element>
  
  <element name="Cluster">
  <complexType>
  <sequence>
  <element
  ref="pce:Server" minOccurs="1" maxOccurs="unbounded"/>
  </sequence>
  <attribute
  name="name"
  use="required"
  type="string"/>
  </complexType>
  </element>
  
  <element name="ServerFarm">
  <complexType>
  <sequence>
  <element
  ref="pce:Cluster" minOccurs="1" maxOccurs="unbounded"/>
  </sequence>
  <attribute
  name="name"
  use="required"
  type="string"/>
  </complexType>
  </element>
  
  <element name="PCE">
  <complexType>
  <sequence>
  <element
  ref="pce:ServerFarm" minOccurs="1" maxOccurs="unbounded"/>
  </sequence>
  </complexType>
  </element>
  
  </schema>
  
  
  具體介紹XML模式文檔(XSD)的構造方法已經超出了本文的范圍。重要的是必須熟悉到,PASXService組件的開發者可以使用一組定制標記。更妙的是,開發者無需編寫任何驗證代碼,就可以確保XML不僅格式良好而且合法(這一切由解析器完成)。下面聲明的<Service>標記用到了前面的模式:
  
  <Service
  class="org.pasx.examples.CustomConfigExample"
  name="examples.customConfigExample" >
  
  <pce:PCE xmlns="http://pasx.org/PASX/CUSTOM-EXAMPLE"
  xmlns:pce="http://pasx.org/PASX/CUSTOM-EXAMPLE"
  xsi:schemaLocation="http://pasx.org/PASX/CUSTOM-EXAMPLE /org/pasx/examples/custom-example.xsd" >
  
  <ServerFarm name="farm0">
  <Cluster name="cluster0">
  <Server hostName="app0.foo.com" portNumber="8080" />
  <Server hostName="app1.foo.com" portNumber="8080" />
  </Cluster>
  <Cluster name="cluster1">
  <Server hostName="app2.foo.c

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品久久久久久久久久| 国产精品福利在线观看| 国产精国产精品| 在线观看成人黄色| 精品成人69xx.xyz| 亚洲伊人久久大香线蕉av| 亚洲男女自偷自拍图片另类| 国产免费亚洲高清| 69久久夜色精品国产69乱青草| 日韩精品欧美国产精品忘忧草| 欧美高清视频在线播放| 日韩中文字幕av| 久久伊人91精品综合网站| 亚洲xxx视频| 久久久久国产精品免费网站| 亚洲第一网中文字幕| 国产精品午夜国产小视频| 亚洲一区二区福利| 成人免费网站在线看| 亚洲男人第一网站| 久久精品国产欧美亚洲人人爽| 2019中文字幕免费视频| 91成人在线观看国产| 久久精品一偷一偷国产| 欧美午夜性色大片在线观看| 亚洲国产欧美一区| 92版电视剧仙鹤神针在线观看| 亚洲男人天堂九九视频| 国产99久久久欧美黑人| 91在线视频免费| 久久91精品国产91久久久| 中文字幕欧美日韩va免费视频| 韩国美女主播一区| 久久在精品线影院精品国产| 亚洲色图欧美制服丝袜另类第一页| 色无极影院亚洲| 国产亚洲视频中文字幕视频| 国产精品美女在线| 在线精品视频视频中文字幕| 色悠久久久久综合先锋影音下载| 91亚洲国产成人精品性色| 久久久久久久91| 91精品国产自产91精品| 国产精品吴梦梦| 久久久久久亚洲精品中文字幕| 欧美成人午夜影院| 亚洲综合在线播放| 欧美国产日本在线| 欧美激情亚洲自拍| 最近中文字幕日韩精品| 欧美一级视频免费在线观看| 亚洲精品中文字幕女同| 精品国产1区2区| 久久精品国产亚洲精品2020| 亚洲社区在线观看| 亚洲国产精品一区二区久| 国产精品欧美一区二区三区奶水| 精品国产91久久久| 亚洲精品之草原avav久久| 亚洲成人黄色网址| 国产欧美一区二区三区在线| 欧美精品午夜视频| 亚洲色图50p| 亚洲色图13p| 亚洲成av人片在线观看香蕉| 91色视频在线观看| 欧美一区二区三区四区在线| 日韩在线观看你懂的| 国产91成人在在线播放| 欧美日韩国产综合新一区| 欧美视频在线视频| 欧美激情免费看| 裸体女人亚洲精品一区| 久久精品久久精品亚洲人| 久久亚洲精品一区| 中文国产亚洲喷潮| 欧美一区二区三区免费视| 色综合久久悠悠| 亚洲人成网站免费播放| 91sao在线观看国产| 国产精品一区二区久久国产| 国产xxx69麻豆国语对白| 日韩欧美在线字幕| 国产精品99久久久久久人| xx视频.9999.com| 亚洲天堂免费在线| 亚洲图片在线综合| 久久亚洲精品中文字幕冲田杏梨| 91视频国产精品| 成人在线免费观看视视频| 欧美日本国产在线| 欧美日韩在线观看视频小说| 日韩高清欧美高清| 伊人亚洲福利一区二区三区| 久久久女女女女999久久| 狠狠躁18三区二区一区| 中文字幕日韩欧美| 国产日韩欧美一二三区| 日韩精品在线视频美女| 成人亲热视频网站| 国产日韩av在线播放| 国语自产偷拍精品视频偷| 亚洲人av在线影院| 91视频九色网站| 宅男66日本亚洲欧美视频| 国产精品美女视频网站| 亚洲国产高清自拍| 精品久久久久国产| 成人做爰www免费看视频网站| 久久国产精品99国产精| 成人写真视频福利网| 97在线观看免费高清| 亚洲第一中文字幕在线观看| 98精品国产自产在线观看| 久久亚洲精品一区二区| 国产精品xxxxx| 色偷偷偷综合中文字幕;dd| 国产亚洲美女精品久久久| 国产在线精品播放| 欧美日韩在线视频一区| 欧美网站在线观看| 色婷婷综合久久久久中文字幕1| 欧美在线视频网站| 亚洲第一视频在线观看| 国产高清视频一区三区| 亚洲国产中文字幕在线观看| 国产精品av免费在线观看| 丝袜亚洲另类欧美重口| 亚洲一级一级97网| 麻豆国产va免费精品高清在线| 最近2019年中文视频免费在线观看| 日韩中文字幕在线视频播放| 亚洲最大福利视频| 欧美高清视频在线播放| 日本一区二区在线播放| 国产精品入口免费视频一| 亚洲成人黄色在线观看| www.欧美视频| 最近更新的2019中文字幕| 久久久久久高潮国产精品视| 久久91精品国产| 91丝袜美腿美女视频网站| 亚洲专区国产精品| 九九视频直播综合网| 国产91露脸中文字幕在线| 亚洲一区精品电影| 日本精品久久久久影院| 欧美极品少妇xxxxⅹ免费视频| 国产精品亚洲第一区| 91国产美女视频| 精品国产区一区二区三区在线观看| 欧美黄色免费网站| 久久精品久久久久久国产 免费| 色噜噜狠狠色综合网图区| 国产精品爱久久久久久久| 国产精品∨欧美精品v日韩精品| 国产欧美日韩综合精品| 色一区av在线| 欧美丰满少妇xxxxx做受| 91久热免费在线视频| 精品无码久久久久久国产| 国产精品99久久久久久白浆小说| 欧美性高潮在线| xxx一区二区|