ie使用的是ActiveXObject
javascript
其餘瀏覽器是XMLHttpRequest
這裏就有兼容性問題,對於不一樣的瀏覽器有不一樣的解決辦法,底層的解決辦法是:
html
function getxhr() { var xhr = null; if(window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else { xhr = new ActiveXObject("Microsoft.XMLHttp"); } return xhr; }java
例如:
var xhr = getXhr();
ajax
xhr.open("get","check_uname.do?uname=tom&age=18", true);
第一個參數是請求方式
第二個參數是請求地址
第三個參數是是否發送異步請求,通常都是true
若是是false,發送請求的時候,頁面不會消失,但是瀏覽器會鎖定當前頁面,用戶不可以對當前頁面作其餘操做
編程
xhr.onreadystatechange=function1;
綁定一個事件,在狀態轉換的時候會調用這個函數json
xhr.send(null);數組
xhr.open("post", "get_luckyNum.do", true);
複製代碼
三個參數和get差很少同樣,不過在請求地址中,再也不加入參數,這個參數會加載在最後的send裏面瀏覽器
xhr.send("name=mackyhuang");
複製代碼
這是第一個不一樣點
而後須要加上一個請求頭
(按照http協議,若是發送的是post請求,那麼在請求數據包中應該帶有conntent-type請求頭)默認狀況下,ajax不會帶有請求頭,因此須要緩存
xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
複製代碼
一般不須要返回完整的頁面,只須要返回部分數據
服務器
就是那個事件處理函數
function function1()
{
//獲取服務器返回的數據
if(xhr.readyState == 4 && xhr.status == 200)
{
var txt = xhr.responseText();
用txt的文件修改頁面內容
}
}
複製代碼
設置響應函數
<input id="username" type="text" name="username" onblur="check_name();">
複製代碼
function check_name() {
var username = document.getElementById("username").value;
var msg = document.getElementById("msg");
var xhr = getxhr();
xhr.open("get", "check_login.do?username=" + username, true);
xhr.onreadystatechange = function () {
if(xhr.readyState == 4 && xhr.status == 200)
{
var txt = xhr.responseText;
msg.innerHTML = txt;
}
};
xhr.send(null);
}
複製代碼
####post請求方式函數具體代碼
function get_num()
{
var pLable = document.getElementById("lucky");
var xhr = getxhr();
xhr.open("post", "get_luckyNum.do", true);
xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200)
{
var txt = xhr.responseText;
pLable.innerHTML = txt;
}
};
xhr.send("name=mackyhuang");
}
複製代碼
在使用ie瀏覽器發送get方式給ajax請求的時候,會有緩存問題 ,即只有第一次點擊有效,接下來的每一次點擊都沒有響應 ,由於ie會判斷請求地址是否訪問過,若是訪問過就會調用上次訪問的結果來顯示。
解決方式是在請求地址後方加上?隨機數
是一種輕量級的數據交換格式 相對於xml來講,是輕量級的,解析速度更快,文檔更小
須要一個包 json-lib
JSONObject jsonObject = JSONObject.fromObject(people);
return jsonObject.toString();
JSONArray jsonObject = JSONArray.fromObject(arrayList);
return jsonObject.toString();
複製代碼
包中的類 JSONObject 和 JSONArray, 分別是須要生成單個json,和json數組
javascripe的內置對象JSON,須要他的一個方法,parse():
var object = JSON.parse(jsonString);
複製代碼
<script type="text/javascript">
$(function(){
setInterval(do_query, 5000);
});
function do_query()
{
$("#tb1").empty();
$.ajax({
"url":"query.do",
"type":"post",
"dataType":"json",
"success":function(books){
$("#tb1").empty();
//alert(books);
for(var i = 0; i < books.length; i++)
{
var book = books[i];
$("#tb1").append("<tr><td>" + book.name + "</td><td>"
+ book.price + "</td><td>" +
book.page + "</td></tr>");
}
}
})
}
</script>
複製代碼
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
String path = request.getRequestURI();
String action = path.substring(path.lastIndexOf("/"), path.lastIndexOf("."));
System.out.println(action);
PrintWriter printWriter = response.getWriter();
if("/query".equals(action))
{
ArrayList<Book> books = new ArrayList<Book>();
Random random = new Random();
for(int i = 0; i < 8; i++)
{
books.add(new Book("Java企業級應用開發" + random.nextInt(8888),
88, 189 + random.nextInt(8888)));
}
JSONArray jsonArray = JSONArray.fromObject(books);
String json = jsonArray.toString();
System.out.println(json);
printWriter.print(json);
}
複製代碼
這是一個輕量級的ajax請求函數,
使用狀況是,須要直接將返回的參數添加到一個標籤上面的時候
在服務器端編寫代碼,而後在jsp中
$("#lucky").load("get_luckyNum.do");
複製代碼