1.AJAX引言
Ansynchronized JavaScript And XML (異步 javacript 和 xml)
異步請求
2.異步請求與同步請求
同步請求(地址欄 超級鏈接 表單 location href)
問題:用戶的交互體驗差
現象:同步請求響應給client是一張新的頁面
同步請求必須等待server的響應,纔可以進行後續操作,否則操作無異議(因爲會重新加載頁面,填寫的數據會丟失)
異步請求(XMLHttpRequest)
好處:用戶的交互體驗好
現象:異步請求響應給client不是一張新的頁面,而是頁面的一個局部(字符串)
異步請求無需等待server的響應,可以直接進行後續操作(操作不會丟失)
3.異步請求的編碼思路
異步請求對象 XMLHttpRequest是一個javascript對象,存在瀏覽器差異,簡稱xhr
a)創建xhr對象(根據瀏覽器不同,創建的xhr對象不同)
Webkit: var xhr = new XMLHttpRequest();
IE: var xhr = new ActiveXObject("Microsoft.XMLHTTP");
一般寫法:
//判斷是哪種瀏覽器,如果是Webkit,則返回true
var xhr;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
b)xhr對象發送請求並傳遞參數
xhr.open(“method”,”url”); 作用:發送請求
eg:xhr.open("get","/ajax/checkAjaxServlet");
xhr.send() 作用:往服務器端傳遞參數,括號內可寫null
c)xhr處理響應
//響應監聽
xhr.onreadystatechange=function(){
if(xhr.readyState == 4 && xhr.status == 200){//代表響應回來了且正常響應,要進行處理
處理代碼
}
}
xhr.readyState
0—4
readyState == 0 說明 xhr 對象未創建
readyState == 1 說明 xhr發送請求
readyState == 2 說明 說明服務器端得響應到達client
readyState == 3 說明 服務器端得響應開始解析
readyState == 4 說明 響應完畢
xhr.status
200 正常
404 路徑問題
500 服務器端程序錯誤
4.註冊中驗證用戶名是否重複
編碼思路
代碼
reg.jsp
//首先需要引入jquery-1.8.3.js插件,放在WebContent下面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="jquery-1.8.3.js"></script>
<script type="text/javascript">
$(function(){
//當name丟失焦點時調用此函數
$("#name").blur(function(){
//1.獲得文本框中的內容
var name = $(this).val();
//2.發送ajax異步請求
var xhr;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open("get","CheckName?name="+name);
xhr.send(null);
//xhr處理相應
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
/* alert(xhr.responseText); */
$("#msg").text(xhr.responseText);
}
});
});
});
</script>
<title>註冊</title>
</head>
<body>
<table>
<tr>
<td>UserName</td>
<td><input type="text" name="name" id="name"/><span id="msg"></span></td>
</tr>
<tr>
<td>UserPassword</td>
<td><input type="text" name="password" id="password"/><span id="msg"></span></td>
</tr>
<tr>
<td>UserEmail</td>
<td><input type="text" name="email" id="email"/><span id="msg"></span></td>
</tr>
<tr>
<td><input type="button" value="註冊"/></td>
</tr>
</table>
</body>
</html>
Day1CheckNameServlet.java
package com.ajax;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Day1CheckNameServlet extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//收集數據
String name = request.getParameter("name");
//zbj名字判斷
System.out.println(name);
PrintWriter out = response.getWriter();
if("zbj".equals(name)){
//輸出流輸出正確提示語句
out.println("your name was already used");
}else{
//輸出流輸出錯誤提示語句
out.println("your name is ok");
}
out.flush();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>AJAX</display-name>
<servlet>
<servlet-name>CheckName</servlet-name>
<servlet-class>com.ajax.Day1CheckNameServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CheckName</servlet-name>
<url-pattern>/CheckName</url-pattern>
</servlet-mapping>
</web-app>