【Ajax】Ajax学习笔记

1、全局刷新与局部刷新

  • 全局刷新:整个浏览器覆盖。在网络中传输大量的数据。浏览器需要加载,渲染页面。
    【Ajax】Ajax学习笔记(基础用法)_异步请求

    • 全局刷新的原理:

      (1) 必须由浏览器亲自向服务器发送请求协议包。

      (2) 这个行为导致服务器直接将‘响应包’发送到浏览器内存中。

      (3) 这个行为导致浏览器内存中原有内容被覆盖掉。

      (4) 这个行为导致浏览器在展示数据时,只有相应数据可以展示。

  • 局部刷新:在浏览器的内部,发起请求,获取数据,改变也买那种的部分内容。其余的页面无需加载和渲染。网络中数据传输量少,给用户的感受好。
    【Ajax】Ajax学习笔记(基础用法)_异步请求_02

    • 局部刷新的原理:

      (1)不能由浏览器发送请求给服务器。

      (2) 浏览器委托浏览器内存中一个脚本对象代替浏览器发送请求。

      (3) 这个行为导致服务器端直接将“响应包”发送至脚本对象内存中。

      (4) 这个行为导致脚本对象内容被覆盖掉,但是此时浏览器内存中绝大部分内容没有受到任何影响。

      (5) 这个行为导致浏览器在展示数据的同时,展示原有数据和相应数据。

2、Ajax简介

  • Ajax:Asynchronous JavaScript And XML(异步JavaScript和XML)
  • Ajax是一种无需重新加载整个网页的情况下,能够更新部分页面内容的新方法,不是一种语言。Ajax包含的技术主要有JavaScript、DOM、CSS、XML等。核心是JavaScript和XML。
  • Ajax不仅需要前端的技术,同时需要后端的配合。服务器需要提供数据,数据是Ajax请求的响应结果。

3、异步请求对象XMLHttpRequest

  • 在局部刷新时,需要创建一个对象,代替浏览器发起请求的行为,这个对象存在内存中。代替浏览器发起请求并接收相应数据。这个对象叫做异步请求对象。
  • 全局刷新是同步行为,局部刷新是异步行为(浏览器数据没有全部更新)。
  • 这个异步对象用于在后台与服务器交换数据。XMLHttpRequest就是我们说的异步对象。
  • 异步对象的作用:
  • 在不重新加载页面的情况下更新网页。
  • 在页面已加载后向服务器请求数据。
  • 在页面已加载后从服务器接收数据。
  • 注:
  • 所有现代浏览器都内建了XMLHttpRequest对象。通过一些简单的JavaScript代码,我们就可以创建XMLHttpRequest对象。
  • **异步不等同于多线程,JavaScript不支持多线程操作! **
  • XMLHttpRequest对象的三个重要属性
  • onreadystatechange:一个js函数名或直接定义函数,每当readyState属性改变时,就会调用该函数。
  • readyState:存有XMLHttpRequest的请求状态。从0~4的变化。
  • 0:请求未初始化,创建异步请求对象 var xmlHttp = new XMLHttpRequest()
  • 1:初始化异步请求对象,xmlHttp.open(请求方式,请求地址,true)
  • 2:异步对象发送请求,xmlHttp.send()
  • 3:异步对象接收应答数据从服务端返回数据。XMLHttpRequest内部处理。
  • 4:异步请求对象已经将数据解析完毕。此时才可以读取数据。
  • status属性(返回的状态码) ,常用的如下:
  • 200:“OK”
  • 404:未找到页面

4、Ajax异步实现步骤

(1) 创建异步对象

var xmlHttp = new XMLHttpRequest();

(2) 绑定onreadystatechange事件

  • 当请求被发送到服务器时,我们需要执行一些基于响应的任务。每当readyState改变时,就会触发(回调)onreadystatechange事件。此事件可以指定一个处理函数。我们通常通过判断XMLHttpRequest对象的状态,获取服务端返回的数据。
  • 语法格式:
    ​xmlHttp.onreadystatechange = function() { if(xmlHttp.readyState === 4 && xmlHttp.status === 200) { // 处理服务其返回的数据 } } ​

(3) 初始化请求参数

  • 方法:open(method, url, async): 初始化异步请求对象。
  • 参数说明:
  • method:请求的类型(get或post)
  • url:服务器的servlet地址
  • async:true(异步)或false(同步)
  • 例:
    ​xmlHttp.open(“get”,”http:192.168.1.20:8080/myweb/query”,true); ​

(4) 发送请求

xmlHttp.send();

(5) 接受服务端返回的数据

  • 如需获得来自服务器的响应数据,可使用XMLHttpRequest对象的responseText或responseXML属性。
  • responseText:获得字符串形式的响应数据
  • responseXML:获得XML形式的响应数据

5、JSON数据格式

  • JSON格式容易理解。
  • JSON格式数据在多种语言中,比较容易处理。使用Java、JavaScript读写JSON格式的数据都比较容易。
  • JSON格式数据它占用的空间,在网络中传输快,用户的体验好。
  • JSON的工具库:GSON(Google)、FastJSON(阿里)、Jackson、json-lib

6、Ajax应用实例

  • 该案例涉及到数据库、JDBC方面的知识,由于本文主要介绍Ajax的使用,故将从数据库获取数据的代码省略。

(1) 目录结构

【Ajax】Ajax学习笔记(基础用法)_Ajax_03

(2) index.jsp ——异步的实现代码在这里

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<script type="text/javascript">
var searchProvince = function () {
// 需要查询的省份id
var id = document.getElementById("provinceId").value;
// 创建异步对象
var xmlHttp = new XMLHttpRequest();
// 绑定事件
xmlHttp.onreadystatechange = function () {
if(xmlHttp.readyState === 4 && xmlHttp.status === 200) {
var result = xmlHttp.responseText;
// alert(result);
// 响应的字符串转换为一个JSON对象
var jsobj = eval("(" + result + ")");
document.getElementById("provinceName").innerText = jsobj.name;
document.getElementById("provinceAlias").innerText = jsobj.jiancheng;
document.getElementById("provincial").innerText = jsobj.shenghui;
}
}

// 初始异步对象的请求参数
/*
true: 异步处理请求,使用异步对象发起请求后,不用等待数据处理完毕,就可以执行其他操作。
false: 同步,异步对象必须处理完成请求,从服务端获取数据后,才能执行send之后的代码。任意时刻只能执行一个异步请求。
注:异步不等同于多线程,JavaScript是不支持多线程的!
*/
xmlHttp.open("get", "searchProvince?provinceId=" + id, true);
// 转型异步操作
xmlHttp.send();

// alert("send之后的代码!");
}
</script>
</head>
<body>
<center>
<table border="2">
<tr>
<td>省份编号</td>
<td><input type="text" id="provinceId"></td>
<td><input type="button" onclick="searchProvince()" value="查询"></td>
</tr>
<tr>
<td>省份名称</td>
<td colspan="2"><span id="provinceName"></span></td>
</tr>
<tr>
<td>省份简称</td>
<td colspan="2"><span id="provinceAlias"></span></td>
</tr>
<tr>
<td>省会名称</td>
<td colspan="2"><span id="provincial"></span></td>
</tr>
</table>
</center>
</body>
</html>

(3) SearchProvinceServlet.java ——服务器端处理代码

package com.Etui.controller;

import com.Etui.dao.ProvinceDao;
import com.Etui.entity.Province;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;

public class SearchProvinceServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 默认值,{}: 表示json格式的数据
String json = "{}";
ProvinceDao dao = new ProvinceDao();
// 读取参数
String provinceId = request.getParameter("provinceId");

// 判断provinceId有值时,调用dao查询数据

if(provinceId != null && provinceId.trim().length() != 0) {
// System.out.println("测试 ====++++ provinceId ---》" + provinceId);
// 根据id查询省名与简称
Province province = dao.searchForId(provinceId);

// 使用jackson将Province实例对象转换为JSON格式的数据
ObjectMapper om = new ObjectMapper();
json = om.writeValueAsString(province);
// 测试
// System.out.println("查询结果" + province);
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.print(json);
}

}
}

(4) Province.java——Province类

package com.Etui.entity;

public class Province {
private int id;
private String name;
private String jiancheng;
private String shenghui;

@Override
public String toString() {
return "Province{" +
"id=" + id +
", name='" + name + '\'' +
", jiancheng='" + jiancheng + '\'' +
", shenghui='" + shenghui + '\'' +
'}';
}

public void setId(int id) {
this.id = id;
}

public void setName(String name) {
this.name = name;
}

public void setJiancheng(String jiancheng) {
this.jiancheng = jiancheng;
}

public void setShenghui(String shenghui) {
this.shenghui = shenghui;
}

public int getId() {
return id;
}

public String getName() {
return name;
}

public String getJiancheng() {
return jiancheng;
}

public String getShenghui() {
return shenghui;
}

public Province(int id, String name, String jiancheng, String shenghui) {
this.id = id;
this.name = name;
this.jiancheng = jiancheng;
this.shenghui = shenghui;
}

public Province() {
}
}

(5) 运行结果

【Ajax】Ajax学习笔记(基础用法)_Ajax_04

Over!