Web前端-Ajax-01-Ajax概述

Web前端-Ajax-01-Ajax概述

1.全局刷新和局部刷新

在B/S结构项目中,浏览器负责向服务器发送请求,服务器负责接收请求,并将处理结果发送回浏览器。

浏览器将返回的html、jsp等命令文件进行解析并展示到页面中。

1.1全局刷新

浏览器在接收到响应包后,在展示数据时,浏览器原有内容被响应包中数据覆盖掉。

全局刷新原理:

  1. 必须由浏览器亲自向服务端发送请求协议包

  2. 这个行为导致服务端直接将【响应包】发送到浏览器内存中

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

  4. 这个行为导致浏览器在展示数据时候,只有响应数据可以展示

原理图:

全局刷新实例:

全局刷新特点:

  1. 整个浏览器被新的数据所覆盖。
  2. 在网络中传输大量的数据。
  3. 浏览器需要加载、渲染页面

1.2局部刷新

浏览器接受响应包后,在展示数据时,既可以在窗口中看到本次的响应数据,又可以看到浏览器内存中原有数据。

局部刷新原理:

  1. 不能由浏览器发送请求给服务端
  2. 浏览器委托位于浏览器内存中的一个脚本对象【异步对象】代替浏览器发送请求
    1. 这个行为会导致服务端直接将【响应包】发送到脚本对象内存中。
    2. 这个行为会导致脚本对象内容被覆盖掉,但是此时浏览器内存中绝大部分内容没有受到任何影响。
    3. 这个行为会导致浏览器在展示数据时,同时展示原有数据和本次响应数据。

原理图:

局部刷新实例:

局部刷新特点:

  1. 在浏览器内部,发起请求,获取数据。
  2. 只改变页面中的部分内容,其余页面无需加载和渲染。
  3. 网络中数据传输量少,给用户的体验感好。

Ajax就是用来做局部刷新的,而局部刷新需要使用到异步请求对象。

2.异步请求对象

局部刷新需要创建一个对象,代替浏览器发起请求行为,同时代替浏览器接收响应数据,这个对象就叫做异步请求对象【XMLHttpRequest】

  1. 异步请求对象位于浏览器内存中
  2. 可以同时存在多个异步请求对象
  3. 异步请求对象用于在后台与服务器交换数据

全局刷新是同步行为,异步刷新是异步行为【浏览器数据没有全部更新】

XMLHttpRequest对象是在JavaScript中创建的,语法:

var xmlHttp = new XMLHttpRequest();

XMLHttpRequest对象作用:

  1. 在不重新加载页面的情况下更新网页
  2. 在页面已加载后向服务器请求数据
  3. 在页面已加载后向服务器接收数据

Ajax中的核心对象就是XMLHttpRequest。

3.AJAX介绍

AJAX:Asynchronous JavaScript And XML(异步的JavaScript和XML)

AJAX是一种混合使用现有技术,实现局部刷新的新方法,不是一种新的编程语言。

AJAX中使用的技术有:JavaScript、HTML、DOM、XML、CSS等,主要使用JavaScript和XML。

  1. JavaScript作用:

    1. 负责创建异步对象
    2. 使用异步对象发送请求
    3. 更新页面的DOM对象
    4. 接收响应数据
  2. XML作用:

    1. 发送和接收的数据格式,现在主要由JSON代替。

    2. XML格式:

      <数据>
          <数据1>商品1</数据1>
          <数据2>商品2</数据2>
          <数据3>商品3</数据3>
      </数据>
      

AJAX不单单需要前端的技术,同时也需要后端(服务器)的配合。服务器需要提供数据,数据是AJAX请求的响应结果。

4.AJAX异步实现步骤

4.1创建异步对象

var xmlHttp = new XMLHttpRequest();

4.2给异步对象绑定onreadystatechange事件

onreadystatechange事件:

  1. 由该事件处理异步对象发送请求、获取数据的过程。
  2. 通过这个事件,我们可以知道异步对象是发送请求还是获取数据。
  3. 通过这个事件,我们还可以知道这个异步对象发布请求、处理请求的各种状态。

当异步对象的readystate属性值发生改变时,就会触发这个事件。

这个事件需要指定一个函数,在函数中处理状态的变化。

如:

xmlHttp.onreadystatechange = function() {
    //处理请求的状态变化
    if(xmlHttp.readyState === 4) {
        //处理服务端的数据,更新当前页面
    }
}

异步对象的readyState属性:表示异步对象请求的状态变化。

有0到4五个属性值:

  • 0:创建异步对象时。【new XMLHttpRequest()】
  • 1:初始化异步对象时。【xmlHttp.open()】
  • 2:异步对象发送请求时。【xmlHttp.send()】
  • 3:从服务端拿到初始数据时。注意3是异步对象内部使用
  • 4:异步对象将接收到的初始数据处理完毕时。开发人员负责处理此时的数据
    • 在4时,开发人员的职责就是用处理完毕的数据更新当前页面

回调:当请求的状态变化时,异步对象会自动调用onreadystatechange事件对应的函数。

异步对象的status属性:表示网络请求状况【200、404、500】。

当status === 200时,才表示网络请求是成功的。

xmlHttp.onreadystatechange = function() {
    //处理请求的状态变化
    if(xmlHttp.readyState === 4 && status === 200) {
        //处理服务端的数据,更新当前页面
    }
}

4.3初始化异步请求对象

异步的方法:open()

xmlHttp.open("请求方式【get/post】","服务端的访问地址","异步【true】/同步【false】");//默认为true

如:

xmlHttp.open("get","loginServlet?name=zhagnsan&pwd=123",true);

4.4使用异步对象发送请求

xmlHttp.send();

4.5获取服务端返回的数据

使用异步对象的属性【responseText/responseXML】

例子:var date = xmlHttp.responseText;

xmlHttp.onreadystatechange = function() {
    //处理请求的状态变化
    if(xmlHttp.readyState === 4 && status === 200) {
        //处理服务端的数据,更新当前页面
        var date = xmlHttp.responseText;
        document.getElementById("name").value = date;
    }
}

5.AJAX实例----BMI指数

需求:计算某个用户的BMI指数。

用户在jsp中输入自己的身高、体重,servlet自动计算BMI指数,并显示BMI指数的计算结果和建议。

BMI指数:身体质量指数,是用体重(kg)来除以身高(m)的平方得出的数字,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。

成人的BMI数值:

  1. 过轻:低于18.5
  2. 正常:18.5-23.9
  3. 过重:24-27
  4. 肥胖:28-32
  5. 非常肥胖:>32

5.1全局刷新实现计算BMI

5.1.1流程

  1. 新建一个网站MyWeb,

  2. 创建一个JSP文件【one.jsp】,通过表单提交用户信息

  3. 创建一个Servlet类【BmiServlet】,用于处理请求,然后转发调用result.jsp文件

  4. 创建一个JSP文件【result.jsp】,用于将处理结果写入响应体,发送给浏览器

  5. 浏览器接收响应数据,响应数据将浏览器原有数据替换

5.1.2编写表单提交信息页面

one.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>全局刷新计算BMI</title>
</head>
<body>
    <center>
        <h2>计算BMI</h2>
        <form action="/MyWeb/bmi" method="get">
            <table>
                <tr>
                    <td>姓名:</td>
                    <td><input type="text" name="name"></td>
                </tr>
                <tr>
                    <td>体重(kg):</td>
                    <td><input type="text" name="weight"></td>
                </tr>
                <tr>
                    <td>身高(m):</td>
                    <td><input type="text" name="height"></td>
                </tr>
                <tr>
                    <td><input type="submit" value="计算"></td>
                    <td><input type="reset" value="重置"></td>
                </tr>
            </table>
        </form>
    </center>
</body>
</html>

5.1.3编写Servlet处理请求

BmiServlet

package com.tsccg.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Author: TSCCG
 * @Date: 2021/08/27 22:48
 */
public class BmiServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取请求头中的请求参数【姓名、身高、体重】
        String name = request.getParameter("name");
        float height = Float.parseFloat(request.getParameter("height"));
        float weight = Float.parseFloat(request.getParameter("weight"));
        //2.计算BMI指数,并判断身体状况
        float bmi = weight/(height*height);
        /*
        1. 过轻:低于18.5
        2. 正常:18.5-23.9
        3. 过重:24-27
        4. 肥胖:28-32
        5. 非常肥胖:>32
         */
        String msg = null;
        if (bmi < 18.5) {
            msg = ",比较受";
        } else if (bmi >=18.5 && bmi <=23.9) {
            msg = ",很正常";
        } else if (bmi >= 24 && bmi <= 27) {
            msg = ",比较胖";
        } else {
            msg = ",贼胖";
        }
        //3.将BMI指数与建议放入当前请求作用域对象
        String result = "尊敬的用户" + name + ",您的BMI指数为:" + bmi + msg;
        request.setAttribute("result",result);
        //4.通过请求转发向Tomcat申请调用result.jsp,将BMI指数与建议写入响应体
        request.getRequestDispatcher("/result.jsp").forward(request,response);
    }
}

web.xml配置信息:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>BmiServlet</servlet-name>
        <servlet-class>com.tsccg.controller.BmiServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BmiServlet</servlet-name>
        <url-pattern>/bmi</url-pattern>
    </servlet-mapping>
</web-app>

5.1.4编写响应数据

result.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>计算结果</title>
    <style type="text/css">
        p {
            font-size: 20px;
            color: red;
        }
    </style>
</head>
<body>
    <center>
        <p>${result}</p>
    </center>
</body>
</html>

5.1.5测试

发布网站,开启Tomcat服务器,打开浏览器访问one.jsp文件

5.2局部刷新实现计算BMI

5.2.1流程

  1. 创建一个JSP文件【two.jsp】,通过【异步对象】发送请求,携带用户参数,申请访问BmiServlet
  2. 【BmiServlet】用于处理请求,然后转发调用result.jsp文件
  3. 【result.jsp】将处理结果写入响应体,发送回【异步对象】。
  4. 【two.jsp】中的【异步对象】接收响应数据,将接收到的响应数据写入当前页面中的一个div对象里,进行展示。

5.2.2编写异步对象提交并接收数据页面

two

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>局部刷新计算BMI</title>
    <script type="text/javascript">
    var doAjax = function() {
        //1.创建异步对象
        var xmlHttp = new XMLHttpRequest();
        //2.绑定onreadystatechange事件
        xmlHttp.onreadystatechange = function() {
            // alert("readState:" + xmlHttp.readyState + ";status:" + xmlHttp.status)//【测试语句】显示readyState和status属性值变化
            if (xmlHttp.readyState === 4 && xmlHttp.status === 200) {//readyState:4;status:200
                // alert(xmlHttp.responseText);//【测试语句】显示接收到的响应数据
                //接收响应数据
                var result = xmlHttp.responseText;
                //更新DOM对象
                document.getElementById("showResult").innerHTML = result;
            }
        }
        //3.初始化异步对象
        //获取参数对象value
        var name = document.getElementById("name").value;
        var height = document.getElementById("height").value;
        var weight = document.getElementById("weight").value;
        //拼接请求参数:name=张三&height=1.8&weight=100
        var param = "name=" + name + "&height=" + height + "&weight=" + weight;
        //初始化
        xmlHttp.open("get","bmi?"+param,true);//readyState:1;status:0
        //4.发送请求
        xmlHttp.send();//readyState:2;status:200
    }
    </script>
</head>
<body>
<center>
    <h2>计算BMI</h2>
    <!-- 通过异步对象发送请求,不需要使用表单 -->
    <table>
        <tr>
            <td>姓名:</td>
            <td><input type="text" name="name" id="name"></td>
        </tr>
        <tr>
            <td>身高(m):</td>
            <td><input type="text" name="height" id="height"></td>
        </tr>
        <tr>
            <td>体重(kg):</td>
            <td><input type="text" name="weight" id="weight"></td>
        </tr>
        <tr>
            <td><input type="button" value="计算" onclick="doAjax()"></td>
        </tr>
    </table>
    <!-- 展示响应数据 -->
    <div id="showResult"></div>
</center>
</body>
</html>

5.2.3测试

posted @ 2021-08-27 23:32  TSCCG  阅读(63)  评论(0编辑  收藏  举报