java參數解析
A. java 解析http請求數據
string p1=request.getParameter("p1");
string p2=request.getParameter("p2");
這樣就獲取到數據了,然後你就可以存進資料庫中或者進行數據處理。
B. java解析出url請求的路徑和參數鍵值對類
解析url,本想用正則表達式處理,但正則表達式速度較慢。用split處理一下就可以了。
packageRequestPackage;
importjava.util.HashMap;
importjava.util.Map;
publicclassCRequest{
/**
*解析出url請求的路徑,包括頁面
*@paramstrURLurl地址
*@returnurl路徑
*/
publicstaticStringUrlPage(StringstrURL)
{
StringstrPage=null;
String[]arrSplit=null;
strURL=strURL.trim().toLowerCase();
arrSplit=strURL.split("[?]");
if(strURL.length()>0)
{
if(arrSplit.length>1)
{
if(arrSplit[0]!=null)
{
strPage=arrSplit[0];
}
}
}
returnstrPage;
}
/**
*去掉url中的路徑,留下請求參數部分
*@paramstrURLurl地址
*@returnurl請求參數部分
*/
(StringstrURL)
{
StringstrAllParam=null;
String[]arrSplit=null;
strURL=strURL.trim().toLowerCase();
arrSplit=strURL.split("[?]");
if(strURL.length()>1)
{
if(arrSplit.length>1)
{
if(arrSplit[1]!=null)
{
strAllParam=arrSplit[1];
}
}
}
returnstrAllParam;
}
/**
*解析出url參數中的鍵值對
*如"index.jsp?Action=del&id=123",解析出Action:del,id:123存入map中
*@paramURLurl地址
*@returnurl請求參數部分
*/
publicstaticMap<String,String>URLRequest(StringURL)
{
Map<String,String>mapRequest=newHashMap<String,String>();
String[]arrSplit=null;
StringstrUrlParam=TruncateUrlPage(URL);
if(strUrlParam==null)
{
returnmapRequest;
}
//每個鍵值為一組www.2cto.com
arrSplit=strUrlParam.split("[&]");
for(StringstrSplit:arrSplit)
{
String[]arrSplitEqual=null;
arrSplitEqual=strSplit.split("[=]");
//解析出鍵值
if(arrSplitEqual.length>1)
{
//正確解析
mapRequest.put(arrSplitEqual[0],arrSplitEqual[1]);
}
else
{
if(arrSplitEqual[0]!="")
{
//只有參數沒有值,不加入
mapRequest.put(arrSplitEqual[0],"");
}
}
}
returnmapRequest;
}
}
測試類
packageRequestPackage;
importjava.util.Map;
publicclassTestCRequest{
/**用於測試CRequest類
*@paramargs
*/
publicstaticvoidmain(String[]args){
//請求url
Stringstr="index.jsp?Action=del&id=123&sort=";
//url頁面路徑
System.out.println(CRequest.UrlPage(str));
//url參數鍵值對
StringstrRequestKeyAndValues="";
Map<String,String>mapRequest=CRequest.URLRequest(str);
for(StringstrRequestKey:mapRequest.keySet()){
StringstrRequestValue=mapRequest.get(strRequestKey);
strRequestKeyAndValues+="key:"+strRequestKey+",Value:"+strRequestValue+";";
}
System.out.println(strRequestKeyAndValues);
//獲取無效鍵時,輸出null
System.out.println(mapRequest.get("page"));
}
}
測試代碼運行效果
index.jsp
key:id,Value:123;key:sort,Value:;key:action,Value:del;
null
C. java代碼解析
圖發不上來,請看參考資料連接
初學的話只要了解值傳遞不會改變,引用傳遞會改變。
至於原理,有興趣的話可以了解一下。下面講得很詳細
講解:按值傳參與按引用傳參
----------------------------------------------------------------------------
類中包含方法,方法又分為方法聲明和方法實現,方法聲明中又有參數列表,參數根據調用後的效果不同,即是否改變參數的原始數值,又可以分為兩種:按值傳遞的參數與按引用傳遞的參數。
他們的區別是什麼呢?上面旺旺老師是說調用後的效果,我們看一個案例說明:比如有個女孩非常喜歡QQ,還給自己起了個浪漫的名字「輕舞飛揚」,飛揚小姐認識了一個網友「痞子蔡」(n年前非常火的一個網路小說《第一次親密接觸》的兩個主人公),他們聊的很投緣,有天飛揚小姐竟然把自己的電話號碼告訴了痞子蔡,有天痞子蔡竟然電話過來約飛揚小姐見面,考慮到網路的虛幻與現實人心的叵測,飛揚小姐面臨著艱難的選擇:是否去見網友?
那麼見網友就是個方法,方法的參數就是輕舞飛揚,如果痞子蔡是個披著羊皮的狼,那飛揚小姐就可能面臨危險,比如身上少些東西或者多些東西,就是說在方法體中有可能改變參數的原始數值。
現實中飛揚小姐只有兩種選擇,第一,為了愛情奮不顧身,上刀山下火海,再所不辭,但這有可能改變飛揚狀態,即數值;第二,委婉拒絕以求自保,但如果痞子蔡為人特別好,比如像旺旺老師這樣(嘔吐中),她也許會失去一段大好的姻緣。這里,如果科技足夠發達,我們可以完全給出第三種選擇,輕舞飛揚製作一個自己的替身,即把自己備份一份,然後把備份傳入方法體,這樣不論痞子蔡對她做了什麼都不會對她的源體發生影響,又能檢測痞子蔡對自己是否真心。
OK,這里我們就把飛揚小姐本人去見網友叫按引用傳遞,這樣在方法體中發生的改變在方法調用完對參數還有影響,而把讓她替身去叫按值傳遞,這樣方法調用完對參數原始數值沒有影響,發生改變的只是參數的備份,這份備份在方法調用完會自動消亡,也就是說飛揚的替身在見完網友自動消亡。最後可以簡單概括為一句話:按值傳遞參數數值不變,按引用傳遞參數數值改變。
我們上面剛學習了JAVA的數據類型,則有:值類型就是按值傳遞的,而引用類型是按引用傳遞的。下面看一個例子:
public class TestValueAndRef {
public static void main(String[] args) {
Student student = new Student();
student.stuAge = 10;
int a = 10;
int arr[] = new int[]{9, 5, 27};
System.out.println("初始值 a = " + a);
System.out.println("初始值 student.stuAge = " + student.stuAge);
System.out.println("初始值 arr[0] = " + arr[0]);
TestValueAndRef testValueAndRef = new TestValueAndRef();
testValueAndRef.change(a, student, arr);
System.out.println("調用函數後 a = " + a);
System.out.println("調用函數後 student.stuAge = "
+ student.stuAge);
System.out.println("調用函數後 arr[0] = " + arr[0]);
}
public void change(int pa, Student pstu, int[] parr) {
//方法體中改變值類型pa的值
pa = pa + 10;
//方法體中改變引用類型stu,parr的值
pstu.stuAge = pstu.stuAge + 10;
parr[0] = parr[0] + 10;
System.out.println("方法體改變後pa = " + pa);
System.out.println("方法體改變後student.stuAge = "
+ student.stuAge);
System.out.println("方法體改變後parr[0] = " + parr[0]);
}
}
運行結果:
--------------------------------------------------------------------------
初始值 a = 10
初始值 student.stuAge = 10
初始值 arr[0] = 9
方法體改變後pa = 20
方法體改變後student.stuAge = 20
方法體改變後parr[0] = 19
調用函數後 a = 10
調用函數後 student.stuAge = 20
調用函數後 arr[0] = 19
---------------------------------------------------------------------------------
我們看到,基本數據類型int變數a雖然在方法體中改變了數值,但方法調用完後其原始數值並沒有改變。而引用數據類型Student在方法體中改變年齡的數值,方法執行完其數值發生了改變,數組也是引用類型,所以其值也發生了改變。也就是說:按值傳遞參數數值不變,按引用傳遞參數數值改變。它們在內存中的變化如下所示:
根據上面講解的值類型和引用類型的知識,int類型變數在棧中分配一塊內存,而student與arr分配兩塊內存,當方法調用時,創建三個變數pa,pstu,parr這里相當於把棧中的數據全備份一份給這三個數值,則有:
大家看到,不管是按值傳遞還是按引用傳遞,都是把棧中的數據備份了一份給參數變數,只不過值類型備份的是具體的數值,而引用類型備份的是內存地址。
方法體執行完時:
我們看到,根據pstu與parr改變了堆中的具體數值,而pa改變的只是棧中的數值。最後方法調用結束,pstu,pa,parr三個變數消亡,則有:
根據這樣的內存變換,您知道按值傳遞與按引用傳遞的深層原因了嗎