Java Web:自己想出的連接數(shù)據(jù)庫的AJAX重名驗(yàn)證實(shí)例源碼,PPT,學(xué)習(xí)筆記【詩書畫唱】
很多東西要從記錄小且簡(jiǎn)單的例子開始——詩書畫唱
下面是我自己想出的判斷數(shù)據(jù)庫中查詢用戶名,是否重名的判斷方法:


create table user(
id int primary key auto_increment,
act varchar(100) unique,
trueName varchar(100),
pwd varchar(100) ,
sex varchar(100) ,
sfid varchar(100),
phone varchar(100),
Email varchar(100) ,
tid int,
ShippingAddress varchar(100),
ZcTime timestamp default now(),
touXiangImg varchar(100)
);
insert into User(
act ,
trueName ,
pwd ,
sex,
sfid ,
phone ,
Email ,
tid,
ShippingAddress,touXiangImg) values?
?("1","真實(shí)姓名","1","男","11010519491231002X","16666666666","2531894166@qq.com",1,'北京市 北京市轄區(qū) 東城區(qū)','imgLogo/MyLogo.jpg'),
?("2","真實(shí)姓名","2","男","11010519491231002X","16666666666","2531894166@qq.com",2,'北京市 北京市轄區(qū) 東城區(qū)','imgLogo/MyLogo.jpg'),
("SSHC520","真實(shí)姓名","123456Aa","男","11010519491231002X","16666666666","2531894166@qq.com",1,'北京市 北京市轄區(qū) 東城區(qū)','imgLogo/MyLogo.jpg'),
?("SSHC666","真實(shí)姓名","123456Aa","男","11010519491231002X","16666666666","2531894166@qq.com",2,'北京市 北京市轄區(qū) 東城區(qū)','imgLogo/MyLogo.jpg');





package bean;
import java.sql.Timestamp;
import java.util.Date;
public class User {
private Integer id;
private String act;
private String pwd;
private Integer tid;
private String? trueName;?
private String sfid;
private String? phone;
private String? sex;
private String? Email;
private String ShippingAddress;
private Timestamp? ZcTime;
private String TouXiangImg;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAct() {
return act;
}
public void setAct(String act) {
this.act = act;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public Integer getTid() {
return tid;
}
public void setTid(Integer tid) {
this.tid = tid;
}
public String getTrueName() {
return trueName;
}
public void setTrueName(String trueName) {
this.trueName = trueName;
}
public String getSfid() {
return sfid;
}
public void setSfid(String sfid) {
this.sfid = sfid;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getEmail() {
return Email;
}
public void setEmail(String email) {
Email = email;
}
public String getShippingAddress() {
return ShippingAddress;
}
public void setShippingAddress(String shippingAddress) {
ShippingAddress = shippingAddress;
}
public Timestamp getZcTime() {
return ZcTime;
}
public void setZcTime(Timestamp zcTime) {
ZcTime = zcTime;
}
public String getTouXiangImg() {
return TouXiangImg;
}
public void setTouXiangImg(String touXiangImg) {
TouXiangImg = touXiangImg;
}
}

package com.SSHC.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import DAO.UserDao;
import bean.User;
/**
?* Servlet implementation class DupServlet
?*/
@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
? ? ? ?
? ? /**
? ? ?* @see HttpServlet#HttpServlet()
? ? ?*/
? ? public loginServlet() {
? ? ? ? super();
? ? ? ? // TODO Auto-generated constructor stub
? ? }
/**
* @see HttpServlet#doGet(HttpServletRequest request,?
* HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request,?
HttpServletResponse response)?
throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest?
* request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response)?
throws ServletException, IOException {
// TODO Auto-generated method stub
//——————
//獲取賬號(hào)和密碼
String act = request.getParameter("act");
String pwd = request.getParameter("pwd");
UserDao ud = new UserDao();
?List<Object> list;
try {
list = ud.selectAll(User.class,null);
String msg = "";
?int i=1;
? for(Object o : list) {
?User u = (User)o;
System.out.println(u.getAct());
//重名驗(yàn)證
if(u.getAct().equals(act)) {
i=i*0;
} else if(act.length()==0&&!u.getAct().equals(act)){
i=i;
}
else if(act.length()>0&&!u.getAct().equals(act)){
i=i*2;
}
? }
??
? if(i==0) {
msg = "該賬號(hào)名已被使用";
} else if(i==1){
msg = "請(qǐng)輸入賬號(hào)名,賬號(hào)名不能為空";
}
else if(i%2==0){
msg = "該賬號(hào)名可以使用";
}
? //中文亂碼處理
response.setCharacterEncoding("utf-8");
//將msg返回到j(luò)sp頁面中去
//servlet中的數(shù)據(jù)只能在ajax的回調(diào)函數(shù)中才能拿到
response.getWriter().write(msg);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


package DAO;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import utils.DBUtils;
//萬能Dao
//T不是一個(gè)具體的java類,他是一個(gè)泛型參數(shù)
public class BaseDao<T> {
? ? public<T> List<T>selectAll(Class cls,String SQL) throws Exception{
? ? Connection conn = null;
? ? PreparedStatement pstm = null;
? ? ResultSet rs = null;
? ? List<T>list = new ArrayList<T>();
? ? //通過反射技術(shù)獲取表的名字,表的名字剛好和bean的名字一樣
? ? //獲取類的類名
? ? String tableName = cls.getSimpleName();
? ? String sql=null;
? ? if(SQL==null){
? ? sql = "select * from " + tableName;}
? ? else if(SQL!=null){
? ? ? ? sql = "select * from " + tableName
? ? ? ? +SQL;}
? ? System.out.println(sql);
? ?
? ? conn = DBUtils.getConn();
? ? pstm = conn.prepareStatement(sql);
? ? rs = pstm.executeQuery();
? ? //獲取bean中的所有屬性名
Field []fs = cls.getDeclaredFields();
? ? while(rs.next()) {
? ? //通過反射創(chuàng)建出cls對(duì)象的實(shí)例
? ? Object obj = cls.newInstance();
? ? for(int i = 0;i < fs.length;i ++) {
? ? //bean中的屬性名
? ? String fname = fs[i].getName();
? ? //獲取bean中的屬性的類型
? ? Class type = fs[i].getType();
? ? Object o = rs.getObject(fname);
? ? //System.out.println(o);?
? ? //將屬性對(duì)應(yīng)的set方法名拼接出來
? ? //取出屬性名的首字母,將它變成大寫
? ?String methodName = "set"?
? ? + fname.substring(0,1).toUpperCase()?
? ? + fname.substring(1);
? ? //System.out.println(methodName);
? ? //通過反射調(diào)用set方法
? Method m = cls.getDeclaredMethod(methodName, type);
? ? System.out.println(m);
? ? m.invoke(obj, o);? ?
? ? }
list.add((T)obj);
? ? }
? ? return list;
? ? }
? ??
? ??
? ??
? ??
? ??
public static Integer countAdd;
? ? public Integer add(T t) throws Exception{
? ? Connection conn = null;
? ? PreparedStatement pstm = null;
Integer count = -1;
? ? String tableName = t.getClass().getSimpleName();
?//System.out.println(tableName);
StringBuilder sql = new StringBuilder("insert into "
?+ tableName + " (");
?//取出t對(duì)象中的所有的屬性名
? ? Field []fs = t.getClass().getDeclaredFields();
? ? String dot = "";
? ? for(int i = 0;i < fs.length;i ++) {
? ? sql.append(dot);
? ? String fname = fs[i].getName();
? ? sql.append(fname);
? ? dot = ",";
? ? }
? ? sql.append(")values(");
? ? String dot1 = "";
? ? for(int i = 0;i < fs.length;i ++) {
? ? sql.append(dot1);
? ? sql.append("?");
? ? dot1 = ",";
? ? }
? ? sql.append(")");
? ? //System.out.println(sql);
? ?
? ? conn = DBUtils.getConn();
? ? pstm = conn.prepareStatement(sql.toString());
? ? //調(diào)用t對(duì)象中所有的get方法
? ? for(int i = 0;i < fs.length;i ++) {
? ? //取出屬性名
? ? String fname = fs[i].getName();
? ? //拼接get方法
String methodName = "get"?
? ? + fname.substring(0,1).toUpperCase()
? ? + fname.substring(1);
? ? //取出需要調(diào)用的方法
Method m = t.getClass().getDeclaredMethod(methodName);
? ? //反射調(diào)用get方法
? ? Object val = m.invoke(t);
? ? System.out.println("新增的數(shù)據(jù)是:" + val);
? ? //設(shè)置占位符
? ? pstm.setObject(i + 1, val);
? ? }
? ? count = pstm.executeUpdate();
? ? countAdd=count;
? ? System.out.println(countAdd);
? ? return count;
? ? }
? ? public static Integer countUpdate;
? ? public Integer update(T t,String SQL) throws Exception{
? ?
? ? System.out.println("這時(shí)傳過來的SQL為:"+SQL);
? ? Connection conn = null;
PreparedStatement pstm = null;
Integer count = -1;
StringBuilder sql = new StringBuilder("update ");
//獲取表名,就是獲取t對(duì)象的類名
Class cls = t.getClass();
String tableName = cls.getSimpleName();
sql.append(tableName + " set ");
//獲取t對(duì)象的所有屬性名
Field[]fs = cls.getDeclaredFields();
//每個(gè)javabean的第一個(gè)屬性必須是id
//下標(biāo)是從1開始的,也就是排除了id屬性
String dot = "";
//定義一個(gè)List存放所有的修改的值
List<Object>params = new ArrayList<Object>();
for(int i = 0;i < fs.length;i ++) {
Field f = fs[i];
//獲取屬性名
String fname = f.getName();
System.out.println("下標(biāo)為"+i+"的屬性名:"+fname);
//調(diào)用getXXX方法來獲取t中的屬性值
String methodName = "get"?
+ fname.substring(0,1).toUpperCase()
+ fname.substring(1);
System.out.println(methodName);
//通過反射獲取方法對(duì)象
Method m = cls.getDeclaredMethod(methodName);
//反射調(diào)用getXXX方法
Object obj = m.invoke(t);
? ? ? ? ? ??
//當(dāng)獲取到的值不為空時(shí),才能進(jìn)行修改
if(obj != null) {
sql.append(dot);
sql.append(fname + " = ? ");
dot = ",";
params.add(obj);
}
}
//將id也放到params容器中去
// Method m1 = cls.getDeclaredMethod("getId");
Method m1 = cls.getDeclaredMethod(
"get"?
+fs[0].getName().substring(0,1)
.toUpperCase()
+ fs[0].getName().substring(1));
Object id = m1.invoke(t);
params.add(id);
//拼接where條件
fs[0].getName();
System.out.println("這個(gè)表的第一列的列名"
+ "(一般都為編號(hào)名)為:"+fs[0].getName());
// sql.append("where id = ? ");
if(SQL==null){
sql.append("where "+fs[0].getName()+" = ? ");}
System.out.println(sql);
conn = DBUtils.getConn();
System.out.println("SQL:"+SQL);
if(SQL!=null){
sql.append(SQL);?
}
System.out.println("這時(shí)執(zhí)行的修改語句為:"+sql);
pstm = conn.prepareStatement(sql.toString());
//設(shè)置占位符的值
if(SQL==null){
for(int i = 0;i < params.size();i ++) {
pstm.setObject(i + 1, params.get(i));
}}
if(SQL!=null){
pstm.setObject(1, "已支付");
}
System.out.println("這時(shí)執(zhí)行的修改語句為:"+sql);
count = pstm.executeUpdate();
countUpdate=count;
? ? return count;
? ? }
//? ? public Integer delete(Integer id){
//? ? return 0;
//? ? }
? //萬能Dao刪除方法
? ? public static Integer countDelete;
? ? public Integer delete(Integer id,Class cls)?
? ? throws Exception{
? ? Connection conn = null;
PreparedStatement pstm = null;
Integer count = -1;
String tableName = cls.getSimpleName();
Field[]fs = cls.getDeclaredFields();
for(int i = 0;i < fs.length;i ++) {
Field f = fs[i];
//獲取屬性名:fs[i].getName();
String fname = f.getName();
System.out.println("下標(biāo)為"+i+"的屬性名:"+fname);
//調(diào)用getXXX方法來獲取t中的屬性值
String methodName = "get"?
+ fname.substring(0,1).toUpperCase()
+ fname.substring(1);
System.out.println(methodName);
//通過反射獲取方法對(duì)象
Method m = cls.getDeclaredMethod(methodName);
//反射調(diào)用getXXX方法
//當(dāng)獲取到的值不為空時(shí),才能進(jìn)行修改
}
// String sql = "delete from " + tableName
// + " where id = ?";
String sql = "delete from " + tableName
+ " where "+fs[0].getName()+" = ?";
conn = DBUtils.getConn();
pstm = conn.prepareStatement(sql);
pstm.setInt(1, id);
count = pstm.executeUpdate();
countDelete=count;
? ? return count;
? ? }
? ? public static void main(String[] args) throws Exception {
?
? ?
? ? ? ?}
? ? ?
? ? ??
? ? ?
? ?
}





package utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class DBUtils {
? ? private static String driverName;
? ? private static String url;
? ? private static String userName;
? ? private static String pwd;
? ? //靜態(tài)塊,隨著類加載而運(yùn)行的
? ? static{
? ? //讀取db.properties文件中的內(nèi)容:
? ? Properties prop = new Properties();
? ? InputStream is = DBUtils.class.getClassLoader()
? ? .getResourceAsStream("db.properties");
? ? try {
prop.load(is);
driverName = prop.getProperty("dn");
url = prop.getProperty("url");
userName = prop.getProperty("un");
pwd = prop.getProperty("up");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
? ? }
? ??
? ? public static Connection getConn(){
? ? Connection conn = null;
? ? try {
Class.forName(driverName);
conn = DriverManager.getConnection(url,userName,pwd);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
? ? return conn;
? ? }
? ??
? ? public static void close(ResultSet rs,
? ? PreparedStatement pstm
? ? ,Connection conn){
? ? try {
? ? if(rs != null) {
? ? rs.close();
? ? }
? ? if(pstm != null) {
? ? pstm.close();
? ? }
? ? if(conn != null) {
? ? conn.close();
? ? }
? ? } catch(Exception e) {
? ? e.printStackTrace();
? ? }
? ? }
}

dn=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/firstjsp?useUnicode=true&characterEncoding=utf-8
un=root
up=root

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
? ? String path = request.getContextPath();
? ? String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? ? <head>
? ? ? ? <base hreff="<%=basePath%>">
? ? ? ? <title></title>
? ? ? ? <meta http-equiv="pragma" content="no-cache">
? ? ? ? <meta http-equiv="cache-control" content="no-cache">
? ? ? ? <meta http-equiv="expires" content="0">
? ? ? ? <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
? ? ? ? <meta http-equiv="description" content="This is my page">
? ? ? ? <script type="text/javascript">
? ? ? ? ? ? function dup(){
? ? ? ? ? ? //獲取輸入文本框中的內(nèi)容
? ? ? ? ? ? var act = document.getElementById('act').value;
? ? ? ? ? ? //console.log(act);
? ? ? ? ? ?
? ? ? ? ? ? var xhr = null;//ajax的核心對(duì)象
? ? ? ? ? ? if(window.XMLHttpRequest) {//判斷window對(duì)象中是否有XMLHttpRequest屬性
? ? ? ? ? ? xhr = new XMLHttpRequest();
? ? ? ? ? ? } else {//如果沒有XMLHttpRequest屬性,就使用ActiveXObject創(chuàng)建
? ? ? ? ? ? xhr = new ActiveXObject("Microsoft.XMLHTTP");
? ? ? ? ? ? }
? ? ? ? ? ? //將act傳遞到servlet中,也就是說要從js代碼跳轉(zhuǎn)到j(luò)ava代碼中去
? ? ? ? ? ? if(xhr) {//判斷xhr是否為null
? ? ? ? ? ? //設(shè)置ajax請(qǐng)求方式是post和提交的url路徑
? ? ? ? ? ? xhr.open('post','loginServlet');
? ? ? ? ? ? ? ? //設(shè)置ajax請(qǐng)求頭
? ? ? ? ? ? xhr.setRequestHeader("content-type",?
? ? ? ? "application/x-www-form-urlencoded");
? ? ? ? ? ? ? ? //設(shè)置回調(diào)函數(shù)
? ? ? ? ? ? ? ? xhr.onreadystatechange = function(){
? ? ? ? ? ? ? ? if (xhr.readyState == 4 && xhr.status == 200){
? ? ? ? ? ? ? ? //獲取servlet中傳遞過來的數(shù)據(jù)msg
? ? ? ? ? ? ? ? ? ? document.getElementById('ctx').innerHTML?
? ? ? ? ? ? ? ? ? ? ? ? = xhr.responseText;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //提交到servlet中去
? ? ? ? ? ? ? ? //將act的值傳遞到servlet中去
? ? ? ? ? ? ? ? xhr.send('act=' + act + '&pwd=123');
? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? </script>
? ? </head>
? ? <body>
? ? ? ? <form action="" method="post">
? ? ? ? ? ? <input type="text" name="act" id="act" placeholder="請(qǐng)輸入賬號(hào)"
? ? ? ? ? ? ? ? onpropertychange="dup();" oninput="dup();" />
? ? ? ? ? ? <div id="ctx"></div>
? ? ? ? ? ?
? ? ? ? ? ? <input type="submit" value="登錄" />
? ? ? ? </form>
? ? </body>
</html>







小例子:不從數(shù)據(jù)庫查就是



個(gè)人理解:AJAX可以增加運(yùn)行流暢度。

個(gè)人理解:AJAX可以在輸入用戶名,判斷是否重名等的局部刷新同時(shí),可以做別的操作,比如輸入密碼,而且辛苦寫的密碼不會(huì)因?yàn)橐驗(yàn)樗⑿露貙憽?/p>
AJAX的PPT:












AJAX簡(jiǎn)介
AJAX即Asynchronous Javascript And XML(異步的javascript和XML),由HTML、Javascript、DHTML和DOM組成。它是一種交互式的應(yīng)用程序,也是一種構(gòu)建網(wǎng)站的強(qiáng)大方法,它的出現(xiàn)使高效的WEB程序開發(fā)稱為現(xiàn)實(shí)。
應(yīng)用程序的基本選擇
●桌面應(yīng)用程序:可能使用互聯(lián)網(wǎng)下載更新,但運(yùn)行這些應(yīng)用程序的代碼在桌面計(jì)算機(jī)上。與用戶進(jìn)行交互時(shí)響應(yīng)很快。
●WEB應(yīng)用程序:Web 應(yīng)用程序運(yùn)行在某處的 Web 服務(wù)器上 ,要通過 Web 瀏覽器訪問這種應(yīng)用程序。與用戶進(jìn)行交互式時(shí)需要等待服務(wù)器響應(yīng)和屏幕刷新,速度比較慢。
AJAX幫我們做什么?
AJAX 嘗試建立桌面應(yīng)用程序的功能和交互性與不斷更新的 Web 應(yīng)用程序之間的橋梁??梢允褂孟褡烂鎽?yīng)用程序中常見的動(dòng)態(tài)用戶界面和漂亮的控件,不過是在 Web 應(yīng)用程序中。
開發(fā)AJAX應(yīng)用程序需要掌握的技術(shù)
●HTML:用于建立 Web 表單并確定應(yīng)用程序其他部分使用的字段。
●JavaScript :是運(yùn)行 Ajax 應(yīng)用程序的核心代碼,幫助改進(jìn)與服務(wù)器應(yīng)用程序的通信。
●DHTML 或 Dynamic HTML:用于動(dòng)態(tài)更新表單。我們將使用 div、span 和其他動(dòng)態(tài) HTML 元素來標(biāo)記 HTML。
●文檔對(duì)象模型 DOM :用于(通過 JavaScript 代碼)處理 HTML 結(jié)構(gòu)和(某些情況下)服務(wù)器返回的 XML。
XMLHttpRequest對(duì)象
? ? ? ?在一般的 Web 應(yīng)用程序中,用戶填寫表單字段并單擊 Submit 按鈕后就進(jìn)入了等待處理階段,此時(shí)網(wǎng)頁呈現(xiàn)出空白狀態(tài),在服務(wù)器的響應(yīng)沒有完成前,用戶不能做任何事情,這就是交互性差的原因,用戶得不到立即反饋,因此感覺不同于桌面應(yīng)用程序。
? ? ? 而AJAX使用XMLHttpRequest對(duì)象,對(duì)提交的請(qǐng)求進(jìn)行幕后的處理,即網(wǎng)頁不會(huì)出現(xiàn)閃爍、消失或者延遲,用戶甚至不知道請(qǐng)求的發(fā)出。更棒的是,由于請(qǐng)求是異步發(fā)出的,你甚至可以不用等待服務(wù)器的響應(yīng),繼續(xù)輸入數(shù)據(jù)、滾動(dòng)屏幕和使用應(yīng)用程序。
? ? ? 最后,服務(wù)器將數(shù)據(jù)返回給前臺(tái)javascript代碼,后者決定如何處理這些數(shù)據(jù)。它可以迅速更新表單數(shù)據(jù),讓人感覺應(yīng)用程序是立即完成的,表單沒有提交或刷新而用戶得到了新數(shù)據(jù)。結(jié)果就是類似于桌面應(yīng)用程序的動(dòng)態(tài)、快速響應(yīng)、高交互性的體驗(yàn),但是背后又擁有互聯(lián)網(wǎng)的全部強(qiáng)大力量。
編寫第一個(gè)AJAX程序
對(duì)于JAVA方向,AJAX的后臺(tái)響應(yīng)代碼可以寫在JSP頁面里,也可以是一個(gè)servlet或者是struts框架中的action。

編寫第一個(gè)AJAX程序(續(xù))
在用戶交互頁面的script塊中,創(chuàng)建XMLHttpRequest對(duì)象

編寫第一個(gè)AJAX程序(續(xù))
在用戶交互頁面的script塊中,進(jìn)行AJAX請(qǐng)求,注意回調(diào)函數(shù)ajaxCallback,在后面會(huì)進(jìn)行定義。

編寫第一個(gè)AJAX程序(續(xù))
在用戶交互頁面的script塊中,創(chuàng)建回調(diào)函數(shù),對(duì)服務(wù)器發(fā)送來的響應(yīng)信息進(jìn)行處理。

HTTP 就緒狀態(tài)
HTTP 就緒狀態(tài)表示請(qǐng)求的狀態(tài)或情形。它用于確定該請(qǐng)求是否已經(jīng)開始、是否得到了響應(yīng)或者請(qǐng)求/響應(yīng)模型是否已經(jīng)完成。它還可以幫助確定讀取服務(wù)器提供的響應(yīng)文本或數(shù)據(jù)是否安全。在 Ajax 應(yīng)用程序中需要了解五種就緒狀態(tài):

HTTP 狀態(tài)碼
有可能服務(wù)器履行了請(qǐng)求(即 HTTP 就緒狀態(tài)是 4)但是沒有返回客戶機(jī)預(yù)期的數(shù)據(jù)(例如找不到指定的頁面)。因此除了就緒狀態(tài)外,還需要檢查 HTTP狀態(tài)。我們期望的狀態(tài)碼是 200,它表示一切順利。下表列出了幾種常見的HTTP狀態(tài)碼

AJAX作業(yè)
設(shè)計(jì)一個(gè)注冊(cè)表單,只要求輸入賬號(hào)和密碼即可進(jìn)行注冊(cè),要求當(dāng)用戶輸入賬號(hào)名重復(fù)時(shí),馬上顯示一行“您注冊(cè)的賬號(hào)已存在,請(qǐng)重新輸入”。