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