A. 如何用java實現URLEncode
用Java實現URLEncode的方法是引入java.net.URLEncoder包。
java.net.URLDecoder.decode(String s,String enc);
將application/x-www-form-urlencoded字元串轉換成普通字元串。
java.net.URLEncoder.decode(String s,String enc);
將普通字元串轉換成application/x-www-form-urlencoded字元串
URLEncoder類包含將字元串轉換為application/x-www-form-urlencoded MIME 格式的靜態方法。
web 設計者面臨的眾多難題之一便是怎樣處理不同操作系統間的差異性。這些差異性能引起URL方面的問題:例如,一些操作系統允許文件名中含有空格符,有些又不允許。大多數操作系統不會認為文件名中含有符號「#」會有什麼特殊含義;但是在一個URL中,符號「#」表示該文件名已經結束,後面會緊跟一個 fragment(部分)標識符。其他的特殊字元,非字母數字字元集,它們在URL或另一個操作系統上都有其特殊的含義,表述著相似的問題。為了解決這些問題,我們在URL中使用的字元就必須是一個ASCII字元集的固定字集中的元素,具體如下:
1.大寫字母A-Z
2.小寫字母a-z
3.數字 0-9
4.標點符 - _ . ! ~ * ' (和 ,)
諸如字元: / & ? @ # ; $ + = 和 %也可以被使用,但是它們各有其特殊的用途,如果一個文件名包括了這些字元( / & ? @ # ; $ + = %),這些字元和所有其他字元就應該被編碼。
編碼過程非常簡單,任何字元只要不是ASCII碼數字,字母,或者前面提到的標點符,它們都將被轉換成位元組形式,每個位元組都寫成這種形式:一個「%」後面跟著兩位16進制的數值。空格是一個特殊情況,因為它們太平常了。它除了被編碼成「%20」以外,還能編碼為一個「+」。加號(+)本身被編碼為%2B。當/ # = & 和?作為名字的一部分來使用時,而不是作為URL部分之間的分隔符來使用時,它們都應該被編碼。
WARNING這種策略在存在大量字元集的異構環境中效果不甚理想。例如:在U.S. Windows 系統中, é 被編碼為 %E9. 在 U.S. Mac中被編碼為%8E。這種不確定性的存在是現存的URI的一個明顯的不足。所以在將來URI的規范當中應該通過國際資源標識符(IRIs)進行改善。
B. java怎麼通過get方式獲取url的結果
您好,提問者: GET xxx HTTP/1.1首先這是固定的,如果是get方式提交的話,那麼第一行必定是這個。 可以通過readLine()讀取第一行,如下代碼: //這樣獲取的是get提交的數組,空格分割 String[] getTitle = xx.readLine().split(" +"); String g...
C. java類中request.getParamater("a")獲取jsp頁面url傳遞的參數,編碼問題。
因為URL採用ISO-8859-1編碼,所以得把它轉換成與頁面相同的編碼方式。
獲取的值轉碼試試看
比如:
str=new String(str.getBytes("iso-8859-1"),("gb2312"));
D. java 資料庫 連接 url 報錯 The url cannot be null 請高人指點下
仔細檢查下你的properties文件,注意空格字元寫錯沒。
你的URL 值是 "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=bigTang"
你在讀取property文件時 URL 作為的鍵,仔細檢查吧。
你的property文件中 "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=bigTang" 這個作為的鍵嗎?
E. java 接收url中參數帶 % %傳過來的值
%是URL中的轉義符,比如 %20 表示空格,如果你要表達一個%本身,需要使用 %25表示。
js中可以使用 escape() 來編碼。
F. java jsp get 請求時地址欄""後面的傳遞的參數就丟了 是怎麼回事post 就不丟么
有些符號在URL中是不能直接傳遞的,如果要在URL中傳遞這些特殊符號,那麼就要使用他們的編碼了。編碼的格式為:%加字元的ASCII碼,即一個百分號%,後面跟對應字元的ASCII(16進制)碼值。例如 空格的編碼值是"%20"。
如果不使用轉義字元,這些編碼就會當URL中定義的特殊字元處理。
下表中列出了一些URL特殊符號及編碼 十六進制值
1.+ URL 中+號表示空格 %2B
2.空格 URL中的空格可以用+號或者編碼 %20
3./ 分隔目錄和子目錄 %2F
4.? 分隔實際的 URL 和參數 %3F
5.% 指定特殊字元 %25
6.# 表示書簽 %23
7.& URL 中指定的參數間的分隔符 %26
8.= URL 中指定參數的值 %3D
http://bbs.csdn.net/topics/350148916
G. Java網路編程之URI、URL研究專題二
最後一個組件是fragment 盡管該組件作為URI的一部分出現 但不是絕對的 當使用URI進行某種檢索操作時 後面執行操作的軟體使用fragment聚焦於軟體感興趣的資源部分(在該軟體成功檢索到資源的數據後) 為了實際表現前面提到的組件信息 可以使用下面的URI ftp://: /public/notes?text=shakespeare#hamlet上面的URI把ftp識別為大綱 把: 識別為基於伺服器的授權機構(其中gee是用戶信息 是主機 是埠) 把/public/notes識別為路徑 把text=shakespeare識別為查詢 把hamlet識別為片斷 本質上它是一個叫做gee的用戶希望通過/public/notes路徑在伺服器的 埠上檢索shakespeare文本的hamlet信息 在shakespeare成功的返回到該程序後 程序定位hamlet段並把它呈獻給該用戶 標准化可以通過目錄術語來理解 假定目錄x直接位於根目錄之下 x有子目錄a和b b有文件memo txt a是當前目錄 為了顯示memo txt中的內容(在微軟Windows下) 你可能輸入type x memo txt 你也可能輸入type xa memo txt 在這種情況下 a和 的出現是沒有必要的 這兩種形式都不是最簡單的 但是如果輸入xmemo txt 你就指定了最簡單的路徑了 從根目錄開始訪問memo txt 最簡單的xmemo txt路徑就是標准化的路徑 通常通過基本的和相對的URI訪問資源 基本的URI是絕對的URI 它唯一地標識了某種資源的名字空間 而相對的URI標識了與基礎的URI相對的資源 (與基本的URI不同 相對的URI在某種資源的生存周期內可以永遠不需要改變) 因為基本的和相對的URI都不能完整的識別某種資源 有必要把兩種URI通過解析過程合並 相反地 通過相對化從合並的URI中提取相對的URI也是可行的 注意 不透明的URI與其它的URI不同 它不服從標准化 分解和相對化 假定你把x://a/作為基礎的URI 並把b/c作為相對的URI 根據基礎URI分解這個相對的URI將產生x://a/b/c 根據x://a/相對化x://a/b/c將產生b/c URI不能定位或讀取/寫入資源 這是統一的資源定位器(URL)的任務 URL是一種URI 但是它的大綱組件是已知的網路協議(簡稱協議) 並且它把URI組件與某種協議處理程序(一種資源定位器和根據協議建立的約束規則與資源通訊的讀/寫機制) URI一般不能為資源提供持久不便的名稱 這是統一的資源命名(URN)的任務 URN也是一種URI 但是全球唯一的 持久不便的 即使資源不在存在或不再使用 使用URI 網路API通過提供了URI類(位於程序包中) 使我們在源代碼層使用URI成為可能 URI的構造函數建立了封裝URI的URI對象 URI的方法建立URI對象 如果授權機構組件是基於伺服器的就分析它 提取URI組件 決定URI對象的URI是絕對的還是相對的 決定URI對象的URI是不透明的還是分層的 比較兩個URI對象中的URI 標准化(normalize)URI對象的URI 根據URI對象的基礎URI分解某個相對的URI以得到已分解的URI 根據URI對象的基礎URI關聯某個已分解的URI以得到相對的URI 把URI對象轉換為URL對象 我們進一步查看URI類 在它裡面有五個構造函數 最簡單的是URI(String uri) 這個構造函數把URI作為String類型的參數 把URI分解為組件 並把這些組件存儲在一個新的URI對象中 如果String對象的URI(通過uri引用)違反了RFC 的語法規則 其它的四個構造函數URI(String uri)將會產生一個 URISyntaxException對象 下面的代碼片斷演示了使用URI(String uri)建立封裝了一個簡單的URI組件的URI對象 URI uri = new URI ( ); lishixin/Article/program/Java/hx/201311/25928
H. url傳字元串與給定字元不相等,我在控制台輸出顯示字元一模一樣,可用equals判斷結果為false。java語言,急
看看是否有空格,可以用trim()方法去掉空格後在進行比較。
I. Java調用URL錯誤,報505
HttpURLConnection 請求中 參數中如果有 空格,請求則會 505錯誤
解決: 需要對有空格的參數 做URL編碼處理。
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.net.MalformedURLException;
importjava.net.URL;
importjava.net.URLEncoder;
importsun.net.www.protocol.http.HttpURLConnection;
importcom.alibaba.fastjson.JSONObject;
{
="http://localhost:8080/agd-restful/services/restful/QueryService/queryData/*?queryParam=";
publicstaticvoidmain(String[]args)
{
JSONObjectobj=newJSONObject();
obj.put("XM","匡匡");
obj.put("BIRTHDAY",<spanstyle="color:#FF6666;">getURLEncoder</span>("1988-01-0100:00:00,1988-12-3000:00:00"));
Stringurls=targetURL+obj.toString();
requestRestServer(urls);
}
(Stringurl)
{
JSONObjectobj=newJSONObject();
try
{
URLrestServiceURL=newURL(url);
=(HttpURLConnection)restServiceURL.openConnection();
httpConnection.setRequestMethod("GET");
httpConnection.setRequestProperty("Accept","application/json");
httpConnection.setRequestProperty("Accept-Charset","UTF-8");
httpConnection.setRequestProperty("contentType","UTF-8");
if(httpConnection.getResponseCode()!=200){
thrownewRuntimeException(":"
+httpConnection.getResponseCode());
}
BufferedReaderresponseBuffer=newBufferedReader(newInputStreamReader(
(httpConnection.getInputStream()),"utf-8"));
Stringoutput="";
Stringresult="";
System.out.println("OutputfromServer: ");
while((output=responseBuffer.readLine())!=null){
//System.out.println(output);
result=output;
}
obj=JSONObject.parseObject(result);
System.out.println(obj.toString());
httpConnection.disconnect();
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnobj;
}
@SuppressWarnings("deprecation")
<spanstyle="color:#FF6666;">(Stringdest)
{
returnURLEncoder.encode(dest);
}</span>
}
修改後 正常ok
J. java匹配url的正則表達式
給你個正則表達式的資料,自己慢慢研究,授你以漁:
一、正則表達式基礎知識
我們先從簡單的開始。假設你要搜索一個包含字元「cat」的字元串,搜索用的正則表達式就是「cat」。如果搜索對大小寫不敏感,單詞「catalog」、「Catherine」、「sophisticated」都可以匹配。也就是說:
1.1 句點符號
假設你在玩英文拼字游戲,想要找出三個字母的單詞,而且這些單詞必須以「t」字母開頭,以「n」字母結束。另外,假設有一本英文字典,你可以用正則表達式搜索它的全部內容。要構造出這個正則表達式,你可以使用一個通配符——句點符號「.」。這樣,完整的表達式就是「t.n」,它匹配「tan」、「ten」、「tin」和「ton」,還匹配「t#n」、「tpn」甚至「t n」,還有其他許多無意義的組合。這是因為句點符號匹配所有字元,包括空格、Tab字元甚至換行符:
1.2 方括弧符號
為了解決句點符號匹配范圍過於廣泛這一問題,你可以在方括弧(「[]」)裡面指定看來有意義的字元。此時,只有方括弧裡面指定的字元才參與匹配。也就是說,正則表達式「t[aeio]n」只匹配「tan」、「Ten」、「tin」和「ton」。但「Toon」不匹配,因為在方括弧之內你只能匹配單個字元:
1.3 「或」符號
如果除了上面匹配的所有單詞之外,你還想要匹配「toon」,那麼,你可以使用「|」操作符。「|」操作符的基本意義就是「或」運算。要匹配「toon」,使用「t(a|e|i|o|oo)n」正則表達式。這里不能使用方擴號,因為方括弧只允許匹配單個字元;這里必須使用圓括弧「()」。圓括弧還可以用來分組,具體請參見後面介紹。
1.4 表示匹配次數的符號
表一顯示了表示匹配次數的符號,這些符號用來確定緊靠該符號左邊的符號出現的次數:
假設我們要在文本文件中搜索美國的社會安全號碼。這個號碼的格式是999-99-9999。用來匹配它的正則表達式如圖一所示。在正則表達式中,連字元(「-」)有著特殊的意義,它表示一個范圍,比如從0到9。因此,匹配社會安全號碼中的連字元號時,它的前面要加上一個轉義字元「\」。
圖一:匹配所有123-12-1234形式的社會安全號碼
假設進行搜索的時候,你希望連字元號可以出現,也可以不出現——即,999-99-9999和999999999都屬於正確的格式。這時,你可以在連字元號後面加上「?」數量限定符號,如圖二所示:
圖二:匹配所有123-12-1234和123121234形式的社會安全號碼
下面我們再來看另外一個例子。美國汽車牌照的一種格式是四個數字加上二個字母。它的正則表達式前面是數字部分「[0-9]{4}」,再加上字母部分「[A-Z]{2}」。圖三顯示了完整的正則表達式。
圖三:匹配典型的美國汽車牌照號碼,如8836KV
1.5 「否」符號
「^」符號稱為「否」符號。如果用在方括弧內,「^」表示不想要匹配的字元。例如,圖四的正則表達式匹配所有單詞,但以「X」字母開頭的單詞除外。
圖四:匹配所有單詞,但「X」開頭的除外
1.6 圓括弧和空白符號
假設要從格式為「June 26, 1951」的生日日期中提取出月份部分,用來匹配該日期的正則表達式可以如圖五所示:
圖五:匹配所有Moth DD,YYYY格式的日期
新出現的「\s」符號是空白符號,匹配所有的空白字元,包括Tab字元。如果字元串正確匹配,接下來如何提取出月份部分呢?只需在月份周圍加上一個圓括弧創建一個組,然後用ORO API(本文後面詳細討論)提取出它的值。修改後的正則表達式如圖六所示:
圖六:匹配所有Month DD,YYYY格式的日期,定義月份值為第一個組
1.7 其它符號
為簡便起見,你可以使用一些為常見正則表達式創建的快捷符號。如表二所示:
表二:常用符號
例如,在前面社會安全號碼的例子中,所有出現「[0-9]」的地方我們都可以使用「\d」。修改後的正則表達式如圖七所示:
圖七:匹配所有123-12-1234格式的社會安全號碼
二、Jakarta-ORO庫
有許多源代碼開放的正則表達式庫可供Java程序員使用,而且它們中的許多支持Perl 5兼容的正則表達式語法。我在這里選用的是Jakarta-ORO正則表達式庫,它是最全面的正則表達式API之一,而且它與Perl 5正則表達式完全兼容。另外,它也是優化得最好的API之一。
Jakarta-ORO庫以前叫做OROMatcher,Daniel Savarese大方地把它贈送給了Jakarta Project。你可以按照本文最後參考資源的說明下載它。
我首先將簡要介紹使用Jakarta-ORO庫時你必須創建和訪問的對象,然後介紹如何使用Jakarta-ORO API。
▲ PatternCompiler對象
首先,創建一個Perl5Compiler類的實例,並把它賦值給PatternCompiler介面對象。Perl5Compiler是PatternCompiler介面的一個實現,允許你把正則表達式編譯成用來匹配的Pattern對象。
▲ Pattern對象
要把正則表達式編譯成Pattern對象,調用compiler對象的compile()方法,並在調用參數中指定正則表達式。例如,你可以按照下面這種方式編譯正則表達式「t[aeio]n」:
默認情況下,編譯器創建一個大小寫敏感的模式(pattern)。因此,上面代碼編譯得到的模式只匹配「tin」、「tan」、 「ten」和「ton」,但不匹配「Tin」和「taN」。要創建一個大小寫不敏感的模式,你應該在調用編譯器的時候指定一個額外的參數:
創建好Pattern對象之後,你就可以通過PatternMatcher類用該Pattern對象進行模式匹配。
▲ PatternMatcher對象
PatternMatcher對象根據Pattern對象和字元串進行匹配檢查。你要實例化一個Perl5Matcher類並把結果賦值給PatternMatcher介面。Perl5Matcher類是PatternMatcher介面的一個實現,它根據Perl 5正則表達式語法進行模式匹配:
使用PatternMatcher對象,你可以用多個方法進行匹配操作,這些方法的第一個參數都是需要根據正則表達式進行匹配的字元串:
· boolean matches(String input, Pattern pattern):當輸入字元串和正則表達式要精確匹配時使用。換句話說,正則表達式必須完整地描述輸入字元串。
· boolean matchesPrefix(String input, Pattern pattern):當正則表達式匹配輸入字元串起始部分時使用。
· boolean contains(String input, Pattern pattern):當正則表達式要匹配輸入字元串的一部分時使用(即,它必須是一個子串)。
另外,在上面三個方法調用中,你還可以用PatternMatcherInput對象作為參數替代String對象;這時,你可以從字元串中最後一次匹配的位置開始繼續進行匹配。當字元串可能有多個子串匹配給定的正則表達式時,用PatternMatcherInput對象作為參數就很有用了。用PatternMatcherInput對象作為參數替代String時,上述三個方法的語法如下:
· boolean matches(PatternMatcherInput input, Pattern pattern)
· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)
· boolean contains(PatternMatcherInput input, Pattern pattern)
三、應用實例
下面我們來看看Jakarta-ORO庫的一些應用實例。
3.1 日誌文件處理
任務:分析一個Web伺服器日誌文件,確定每一個用戶花在網站上的時間。在典型的BEA WebLogic日誌文件中,日誌記錄的格式如下:
分析這個日誌記錄,可以發現,要從這個日誌文件提取的內容有兩項:IP地址和頁面訪問時間。你可以用分組符號(圓括弧)從日誌記錄提取出IP地址和時間標記。
首先我們來看看IP地址。IP地址有4個位元組構成,每一個位元組的值在0到255之間,各個位元組通過一個句點分隔。因此,IP地址中的每一個位元組有至少一個、最多三個數字。圖八顯示了為IP地址編寫的正則表達式:
圖八:匹配IP地址
IP地址中的句點字元必須進行轉義處理(前面加上「\」),因為IP地址中的句點具有它本來的含義,而不是採用正則表達式語法中的特殊含義。句點在正則表達式中的特殊含義本文前面已經介紹。
日誌記錄的時間部分由一對方括弧包圍。你可以按照如下思路提取出方括弧裡面的所有內容:首先搜索起始方括弧字元(「[」),提取出所有不超過結束方括弧字元(「]」)的內容,向前尋找直至找到結束方括弧字元。圖九顯示了這部分的正則表達式。
圖九:匹配至少一個字元,直至找到「]」
現在,把上述兩個正則表達式加上分組符號(圓括弧)後合並成單個表達式,這樣就可以從日誌記錄提取出IP地址和時間。注意,為了匹配「- -」(但不提取它),正則表達式中間加入了「\s-\s-\s」。完整的正則表達式如圖十所示。
圖十:匹配IP地址和時間標記
現在正則表達式已經編寫完畢,接下來可以編寫使用正則表達式庫的Java代碼了。
為使用Jakarta-ORO庫,首先創建正則表達式字元串和待分析的日誌記錄字元串:
這里使用的正則表達式與圖十的正則表達式差不多完全相同,但有一點例外:在Java中,你必須對每一個向前的斜杠(「\」)進行轉義處理。圖十不是Java的表示形式,所以我們要在每個「\」前面加上一個「\」以免出現編譯錯誤。遺憾的是,轉義處理過程很容易出現錯誤,所以應該小心謹慎。你可以首先輸入未經轉義處理的正則表達式,然後從左到右依次把每一個「\」替換成「\\」。如果要復檢,你可以試著把它輸出到屏幕上。
初始化字元串之後,實例化PatternCompiler對象,用PatternCompiler編譯正則表達式創建一個Pattern對象:
現在,創建PatternMatcher對象,調用PatternMatcher介面的contain()方法檢查匹配情況:
接下來,利用PatternMatcher介面返回的MatchResult對象,輸出匹配的組。由於logEntry字元串包含匹配的內容,你可以看到類如下面的輸出:
3.2 HTML處理實例一
下面一個任務是分析HTML頁面內FONT標記的所有屬性。HTML頁面內典型的FONT標記如下所示:
程序將按照如下形式,輸出每一個FONT標記的屬性:
在這種情況下,我建議你使用兩個正則表達式。第一個如圖十一所示,它從字體標記提取出「"face="Arial, Serif" size="+2" color="red"」。
圖十一:匹配FONT標記的所有屬性
第二個正則表達式如圖十二所示,它把各個屬性分割成名字-值對。
圖十二:匹配單個屬性,並把它分割成名字-值對
分割結果為:
現在我們來看看完成這個任務的Java代碼。首先創建兩個正則表達式字元串,用Perl5Compiler把它們編譯成Pattern對象。編譯正則表達式的時候,指定Perl5Compiler.CASE_INSENSITIVE_MASK選項,使得匹配操作不區分大小寫。
接下來,創建一個執行匹配操作的Perl5Matcher對象。
假設有一個String類型的變數html,它代表了HTML文件中的一行內容。如果html字元串包含FONT標記,匹配器將返回true。此時,你可以用匹配器對象返回的MatchResult對象獲得第一個組,它包含了FONT的所有屬性:
接下來創建一個PatternMatcherInput對象。這個對象允許你從最後一次匹配的位置開始繼續進行匹配操作,因此,它很適合於提取FONT標記內屬性的名字-值對。創建PatternMatcherInput對象,以參數形式傳入待匹配的字元串。然後,用匹配器實例提取出每一個FONT的屬性。這通過指定PatternMatcherInput對象(而不是字元串對象)為參數,反復地調用PatternMatcher對象的contains()方法完成。PatternMatcherInput對象之中的每一次迭代將把它內部的指針向前移動,下一次檢測將從前一次匹配位置的後面開始。
本例的輸出結果如下:
3.3 HTML處理實例二
下面我們來看看另一個處理HTML的例子。這一次,我們假定Web伺服器從widgets.acme.com移到了newserver.acme.com。現在你要修改一些頁面中的鏈接:
執行這個搜索的正則表達式如圖十三所示:
圖十三:匹配修改前的鏈接
如果能夠匹配這個正則表達式,你可以用下面的內容替換圖十三的鏈接:
注意#字元的後面加上了$1。Perl正則表達式語法用$1、$2等表示已經匹配且提取出來的組。圖十三的表達式把所有作為一個組匹配和提取出來的內容附加到鏈接的後面。
現在,返回Java。就象前面我們所做的那樣,你必須創建測試字元串,創建把正則表達式編譯到Pattern對象所必需的對象,以及創建一個PatternMatcher對象:
接下來,用com.oroinc.text.regex包Util類的substitute()靜態方法進行替換,輸出結果字元串:
Util.substitute()方法的語法如下:
這個調用的前兩個參數是以前創建的PatternMatcher和Pattern對象。第三個參數是一個Substiution對象,它決定了替換操作如何進行。本例使用的是Perl5Substitution對象,它能夠進行Perl5風格的替換。第四個參數是想要進行替換操作的字元串,最後一個參數允許指定是否替換模式的所有匹配子串(Util.SUBSTITUTE_ALL),或只替換指定的次數。