當前位置:首頁 » 編程語言 » java參數解析

java參數解析

發布時間: 2022-12-13 07:16:14

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三個變數消亡,則有:

根據這樣的內存變換,您知道按值傳遞與按引用傳遞的深層原因了嗎

熱點內容
教師資格面試試講腳本 發布:2025-01-22 22:51:37 瀏覽:684
python中reduce 發布:2025-01-22 22:50:42 瀏覽:272
網路拓撲演算法 發布:2025-01-22 22:47:51 瀏覽:532
wifi密碼怎麼看電腦 發布:2025-01-22 22:37:44 瀏覽:167
termux中的編譯器 發布:2025-01-22 22:36:56 瀏覽:409
電腦做伺服器速度慢 發布:2025-01-22 22:28:20 瀏覽:464
奇跡製作腳本 發布:2025-01-22 22:23:11 瀏覽:604
伺服器授權碼是什麼意思 發布:2025-01-22 22:18:54 瀏覽:354
電腦顯示伺服器找不到列印機無法連接 發布:2025-01-22 22:18:40 瀏覽:718
300元乒乓球套拍如何配置 發布:2025-01-22 22:15:41 瀏覽:999