前後臺互動傳參方式
前臺向後臺傳參
主要有以下2種方式:
一、URL傳參
使用這種方式傳參時,收個引數置於url的後面,用“?”連線;形式:url?param=value,如果有多個引數,各個引數之間用&連線。
如:http://zhidao.baidu.com/q?word=%D6%BD%B1%D2+%CB%BA%BB%D9
多個引數時,引數間用“&”連線,
例如:http://zhidao.baidu.com/q?word=%D6%BD%B1%D2+%CB%BA%BB%D9&lm=0&fr=search&ct=17&pn=0&tn=ikaslist&rn=10
url傳參很方便,但有缺陷:
1、引數長度限制
IE對於url的長度限制為2048個位元組,Google對於url的長度限制為8182個位元組,360瀏覽器url的長度限制為2118個位元組,而且單個引數的value值不得超過1920000個位元組。
2、傳遞bean時很麻煩
有種劣質方法可以辦到,就是將bean的屬性均需作為一個引數連線到url裡傳遞。
比如要傳遞一個人這個類(有身高和性別)到後臺,
前臺:var pepole = {age:22,sex:'male'}
要是直接把pepole拼接到url裡:url?pepole=pepole,後臺在不設定struts引數解析攔截器時,以string接收將會是一個object Object。
假如後臺action裡宣告的是這個bean型別屬性,可以實現的方式是:url?pepole.age=22&pepole.sex=male
要注意的是:URL裡點後面的age和sex最好跟pepole的age和sex大小寫相同!
這樣後臺就直接接收到了一個bean。
2、使用示例:
eg1、點選 button 按鈕,觸發 onclick 事件,執行 Go() 方法,跳轉到 localhost:21811/Handler1.ashx 頁面,同時傳遞了 id 和 name 兩個引數。
<input type="button" onclick="Go()" value="通過js方法傳遞引數" />
function Go() {
window.location.href="localhost:21811/Handler1.ashx?id=1&name='abc'"
}
eg2、用超連結的 href 傳遞引數,當點選超連結的時候,首先會跳轉到 localhost:21811/Handler1.ashx 頁面,然後還會傳遞 id 和 name 兩個引數。
<a href="localhost:21811/Handler1.ashx?id=1&name='abc'">超連結傳遞引數</a>
二、jQuery Ajax 方式傳遞
jquery 中 ajax 只需配置相應的引數即可與後臺互動。這種方式可傳遞大數值的資料。
1、get方式
$.ajax({
type: "get", //資料傳送的方式
url: "", //要傳送的後臺地址
data: {val1:"1",val2:"2"}, //要傳送的資料(引數)
dataType: "json", //後臺處理後返回的資料格式
success: function (data) {
//ajax請求成功後觸發
alert('請求成功');
},
error: function (msg) {
//ajax請求失敗後觸發
alert(msg);//彈出錯誤資訊
}
});
後臺接收資料(引數):
<?php
val1 = $_GET['val1']; //1
val2 = $_GET['val2']; //2
?>
data必須是物件型別,比如data:{"name":"zhangsan"},後臺通過 request.getParameter("name")就能接收到name的值。
2、post方式
$.post(url,data,success(data, textStatus, jqXHR),dataType)
url:必需。規定把請求傳送到哪個 URL。 data:可選。對映或字串值。規定連同請求傳送到伺服器的資料。
success(data, textStatus, jqXHR):可選。請求成功時執行的回撥函式。 dataType :可選。規定預期的伺服器響應的資料型別。預設執行智慧判斷(xml、json、script 或 html)。
例:
$.post(
"demo_test_post.asp",
//傳遞到伺服器的值
{
name:"Donald Duck",
city:"Duckburg"
},
//回撥函式
function(data,status){
alert("Data: " + data + "\nStatus: " + status);
});
三、form表單的post形式(傳統的表單提交)
1、序列化表單值
通過序列化表單值,建立 url 編碼文字字串。
<form id="myForm" action="Handler1.ashx" method="get"> <!-- action裡面的連線不能帶引數的 -->
<input type="text" name="id" value="3" />
<input type="text" name="name" value="abc" /> <!-- input必須有name屬性 -->
<input type="submit" value="序列化表單值" /> <!-- 必須是type="submit" -->
</form>
序列化之後的結果:id=3&name=abc 點選提交按鈕之後將序列化後的字串提交到 action 對應的介面。
2、上面傳統的form表單提交會導致頁面重新整理,如果不希望頁面重新整理,可使用 ajax 進行請求
$.ajax({
url:" .php",
type:"POST",
data:$("#myForm").serialize(), // JQ Ajax serialize() 序列化表單值
success:function(data){
alert(data);
},
error:function(data){
alert(data.status+":"+data.statusText+":"+data.responseText);
}
});
不過,上述方式只適用於傳遞一般簡單的引數,像檔案流就無法被序列化並傳遞。所以,檔案(檔案,圖片類)上傳的時候可使用 FormData,FormData 可以輕鬆的和 Ajax 結合進行檔案上傳。
五、總結:
1、jquery ajax 的 get 和 post 方式比較:
(1)get是把引數資料佇列加到提交表單的action屬性所指的URL中,值和表單內各個欄位一一對應,在URL中可以看到。
post是通過 HTTP post 機制,將表單內各個欄位與其內容放置在HTML header內一起傳送到action屬性所指的URL地址。使用者看不到這個過程。
(2)對於get方式,伺服器端用Request.QueryString獲取變數的值。
對於post方式,伺服器端用Request.Form獲取提交的資料。兩種方式的引數都可以用Request來獲得。
(3)get傳送的資料量較小,不能大於2KB(不同瀏覽器也有不同限制)。
post傳送的資料量較大,一般被預設為不受限制。(理論上,因伺服器的不同而異)
(4)get安全性非常低,post安全性較高。
(5)<form method="get" action="a.asp?b=b">跟<form method="get" action="a.asp">是一樣的,也就是說,method為get時action頁面後邊帶的引數列表會被忽視。
而<form method="post" action="a.asp?b=b">跟<form method="post" action="a.asp">是不一樣的。
2、特性:
(1)Get請求有如下特性:
它會將資料新增到URL中,通過這種方式傳遞到伺服器,通常利用一個問號?代表URL地址的結尾與資料引數的開端,後面的引數每一個數據引數以“名稱=值”的形式出現,引數與引數之間利用一個連線符&來區分。
(2)Post請求有如下特性:
資料是放在HTTP主體中的,其組織方式不只一種,有&連線方式,也有分割符方式,可隱藏引數,傳遞大批資料,比較方便。
即:get在 URL 請求裡面附帶了表單引數和值,post在 HTTP 請求的訊息實體中。
3、使用 ajax 方式時,無論是 get 還是 post,設定引數 dataType: "json", 時,如果用的是jQuery之類的框架,只要是符合Json格式的字串就會自動轉換為Json物件,就不用 使用 eval() 或者 JSON.parse() 方法將字串轉換為 json 物件了。