典型場景:百度搜索建議、用戶名註冊即時校驗。
// 1. 創建 XMLHttpRequest(兼容 IE5/6)
function createXHR() {
try { return new XMLHttpRequest(); }
catch(e) {
try { return new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e) {
try { return new ActiveXObject("Microsoft.XMLHTTP"); }
catch(e) { alert("瀏覽器太舊"); throw e; }
}
}
}
var xhr = createXHR();
// 2. 打開連接
xhr.open("GET", "/servlet/ValidateUser?username=" + encodeURIComponent(val), true);
// 3. 發送請求
xhr.send(null); // GET 必須傳 null
// 4. 註冊回調
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
var result = xhr.responseText; // 或 responseXML
// DOM 更新頁面
}
};
readyState:0-未調用 open、1-已 open、2-已 send、3-響應中、4-完成
status:HTTP 狀態碼(200 成功、404 未找到、500 服務器錯誤)
xhr.open("POST", "/servlet/Login", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send("username=zhangSan&password=123");
onblur 觸發 Ajax → ValidateUsernameServletitcast → 返回 1(已存在) 或 0(可用)1 顯示「用戶名已被註冊」response.setContentType("text/xml;charset=utf-8")var doc = xhr.responseXML 得到 Document 對象,用 DOM API 解析ProvinceServlet → 返回省份字符串 → 動態生成 <option>CityServlet?province=... → 返回該省城市 XML → 解析填充城市下拉框依賴:xstream-1.4.7.jar + xpp3_min-1.1.4c.jar
XStream xs = new XStream();
xs.alias("china", List.class);
xs.alias("province", Province.class);
xs.useAttributeFor(Province.class, "name"); // name 作為屬性
xs.addImplicitCollection(Province.class, "cities"); // 隱式集合
xs.omitField(City.class, "description"); // 忽略字段
String xml = xs.toXML(provinceList);
var person = {"name":"zhangSan","age":18,"sex":"male","hobby":["read","swim"]};
{}、數組 []、屬性名必須雙引號// Bean → JSON
JSONObject json = JSONObject.fromObject(person);
String jsonStr = json.toString();
// List → JSON
JSONArray arr = JSONArray.fromObject(list);
String arrStr = arr.toString();
| 維度 | XML | JSON |
|---|---|---|
| 可讀性 | 勝 | 略輸 |
| JS 解析難度 | 需 DOM/SAX | 原生對象,極簡單 |
| Ajax 領域流行度 | 早期主流 | 現為主流 |