Java URL协议扩展实现
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
Java URL協(xié)議擴(kuò)展實(shí)現(xiàn) 博客分類: java在信息交互系統(tǒng)設(shè)計(jì)中,不乏有自定義通訊協(xié)議設(shè)計(jì)。本章會(huì)介紹如何利用?java.net.URL?類來(lái)自定義協(xié)議。
?
????? 一般而言,?URL?的格式是:?protocol://[authority]hostname:port/resource?queryString?。?URL?類能夠解析出?protocol、?hostname?、?port?等信息。?Protocol?決定了交互規(guī)范,通用的協(xié)議,比如?HTTP?、?File?、?FTP?等協(xié)議,?JDK?自帶了默認(rèn)的通訊實(shí)現(xiàn)。當(dāng)然,自定義實(shí)現(xiàn)是允許的。?Hostname?和?port?一般用于?Socket?或者基于?Socket?其他協(xié)議通訊方式。Resource?即資源上下文。可能讀者利用?URL?,通過(guò)指定協(xié)議(?protocol?)來(lái)獲取指定資源的讀寫(xiě),比如?JDK?內(nèi)置了HTTP?、?File?、?FTP?等協(xié)議的處理方法。哪么?URL?的工作原理到底是怎么樣的呢?
????? 在成功地構(gòu)造?URL?實(shí)例之后,?URL API?中定義了一個(gè)?openConnection()?方法,返回一個(gè)?java.net.URLConnection?抽象類型的實(shí)例。不過(guò),這里?URL?對(duì)象是代理對(duì)象(組合了?其?對(duì)象),實(shí)際調(diào)用的是,?java.net.URLStreamHandler?對(duì)象的?openConnection()?方法。
????? java.net.URLStreamHandler?對(duì)象可以有兩條途徑得到:實(shí)現(xiàn)?java.net.URLStreamHandler?,或者實(shí)現(xiàn)java.net.URLStreamHandlerFactory?。
????? java.net.URLStreamHandler?是一個(gè)工廠類,通過(guò)?openConnection(java.net.URL)?方法來(lái)創(chuàng)建?java.net.URLConnection的實(shí)例。?java.net.URLStreamHandler?實(shí)現(xiàn)靈活度很大,既可以通過(guò)不同?protocol?的?URL?實(shí)例,產(chǎn)生java.net.URLConnection?對(duì)象。還可以通過(guò)相同?protocol?的多個(gè)?URL?對(duì)象,來(lái)產(chǎn)生對(duì)象。通用性實(shí)現(xiàn),一種協(xié)議對(duì)應(yīng)一個(gè)java.net.URLStreamHandler?實(shí)現(xiàn)。比如,在?SUN JDK?中?sun.net.www.protocol?子包下面的多個(gè)?Handler?類就是很好的例子。如果讀者有興趣,可以去看看相關(guān)實(shí)現(xiàn)。
????? 1.?通過(guò)?java.net.URLStreamHandlerFactory?機(jī)制
????? java.net.URLStreamHandlerFactory?,顧名思義,它是?java.net.URLStreamHandler?的工廠,即抽類工廠接口。通過(guò)調(diào)用?createURLStreamHandler(String protocol)?來(lái)創(chuàng)建?java.net.URLStreamHandler?對(duì)象。因此,建議java.net.URLStreamHandlerFactory?實(shí)現(xiàn)類應(yīng)該采用?one protocol one hander?的模式,?SUN JDK?也采用該模式。
?????大致解了他們關(guān)系之后,再通過(guò)?UML Class diagram?來(lái)熟悉下:????
?
(圖?1?)
?
?????圖?1?所示,?URL?包含了名為?factory?的?URLStreamHandlerFactory?類對(duì)象和?handler?的?URLStreamHandler?的實(shí)例對(duì)象。對(duì)于?URL?而言,?handler?對(duì)象是必須的,因?yàn)榍懊嬲f(shuō)到實(shí)際處理?openConnection()?方法是?handler?對(duì)象,而?factory并不是必須的。接下來(lái),來(lái)分析這兩個(gè)對(duì)象是如何和?URL?交互的。
?????在?URL?的構(gòu)造方法中,暫時(shí)不用關(guān)心協(xié)議字符串等參數(shù),更多的關(guān)注于?URL context?和?URLStreamHandler?參數(shù)。URL?實(shí)例能夠依賴于?URL context?,當(dāng)?URLStreamHandler?參數(shù)為空的情況下,當(dāng)前?URL?實(shí)例將會(huì)采用?URL context?的URLStreamHandler?成員對(duì)象。當(dāng)?Context?和?URLStreamHandler?參數(shù)都為空的時(shí)。?URL?會(huì)調(diào)用?getURLStreamHandler(?String)?方法,從而根據(jù)協(xié)議?(protocol)?獲得協(xié)議?URLStreamHandler?對(duì)象。
?????在?URL?底層實(shí)現(xiàn)中,最初會(huì)初始化一個(gè)?protocol?和?hander?鍵值關(guān)系的?Map?映射。如果找到已有的映射關(guān)系,立即返回?URLStreamHandler?對(duì)象(第一次是取不到?URLStreamHandler?對(duì)象的)。
?????如果找不到的話,并且?URL?類中的類成員?URLStreamHandlerFactory?實(shí)例不為空的情況下,這個(gè)實(shí)例通過(guò)URL#setURLStreamHandlerFactory?方法來(lái)注冊(cè)。?getURLStreamHandler?方法會(huì)調(diào)用這個(gè)類成員的createURLStreamHandler(String)?方法來(lái)創(chuàng)建?URLStreamHandler?實(shí)例。
?
?
?
Java代碼(代碼?1?)
Java代碼(代碼?2?)
?
?
?
??????當(dāng)?createURLStreamHandler?方法返回?null?的時(shí)候,?URL?的?getURLStreamHandler?方法會(huì)采用?URLStreamHandler處理機(jī)制。
?
?
??????2.?通過(guò)?java.net.URLStreamHandler?機(jī)制
??????2.1.?實(shí)現(xiàn)類包路徑定義
????????通過(guò)?JVM?啟動(dòng)參數(shù)?-D?java.protocol.handler.pkgs?來(lái)設(shè)置?URLStreamHandler?實(shí)現(xiàn)類的包路徑,例如?-Djava.protocol.handler.pkgs=com.acme.protocol?,?代表處理實(shí)現(xiàn)類皆在這個(gè)包下。如果需要多個(gè)包的話,那么使用“?|”?分割。比如?-D?java.protocol.handler.pkgs=com.acme.protocol|com.acme.protocol2?。?SUN?的?JDK?內(nèi)部實(shí)現(xiàn)類均是在sun.net.www.protocol.?包下,不必設(shè)置。?路徑下的協(xié)議實(shí)現(xiàn)類,采用先定義先選擇的原則?。
??????2.2.?實(shí)現(xiàn)類的命名模式
??????類的命名模式為?[package_path].[protocol].Handler?,比如默認(rèn)實(shí)現(xiàn)”?sun.net.www.protocol.[protocol].Handler”,?比如HTTP?協(xié)議的對(duì)應(yīng)的處理類名為?-sun.net.?www.protocol.http.Handler?。同樣,自定義實(shí)現(xiàn)的處理類,例如,?JDNI?協(xié)議實(shí)現(xiàn)類命名?com.acme.protocol.jndi.Handler?。
??????2.3.?實(shí)現(xiàn)類必須又默認(rèn)構(gòu)造器。
??????結(jié)合代碼分析,如下:
Java代碼?
(代碼?3?)
?
??????代碼?3?中沒(méi)有配置?URLStreamHandler?的類,并且代碼?2?中工廠類沒(méi)有實(shí)現(xiàn)了?HTTP?協(xié)議。這樣,?URL?會(huì)獲取默認(rèn)的?HTTP?處理類?sun.net.?www.protocol.http.Handler?。
??????Java 1.5?開(kāi)始支持網(wǎng)絡(luò)代理的操作,因此?URLStreamHandler?實(shí)現(xiàn)類盡量覆蓋?openConnection(URL)?和openConnection(URL,Proxy)?兩個(gè)方法。
(EOF)
?
?
http://mercyblitz.iteye.com/blog/735529
轉(zhuǎn)載于:https://my.oschina.net/xiaominmin/blog/1597595
總結(jié)
以上是生活随笔為你收集整理的Java URL协议扩展实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 应付账款暂估什么意思 什么叫应付账款暂估
- 下一篇: 20165201 2017-2018-2