Ajax实现步骤和原理

Ajax实现步骤和原理

一、什么是Ajax?

Ajax = 异步 JavaScript 和XML。

Ajax是一种用于创建快速动态网页的技术。

通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

传统的网页(不使用 Ajax)如果需要更新内容,必需重载整个网页面。

二、Ajax工作原理

Ajax的工作原理相当于在用户和服务器之间加了---个中间层(AJAX引擎),使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像---些数据验证和数据处理等都交给Ajax引擎自己来做, 只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。

Ajax(Asynchronous javascript and xml),实现了客户端与服务器进行数据交流过程。使用技术的好处是:不用页面刷新,并且在等待页面传输数据的同时可以进行其他操作。

三、Ajax的使用及实现步骤

(1) 创建XMLHttpRequest对象,也就是创建一个异步调用对象.

(2) 创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.

(3)设置响应HTTP请求状态变化的函数.

(4)发送HTTP请求.

(5)获取异步调用返回的数据.

(6)使用JavaScript和DOM实现局部刷新.

AJAX运行步骤与状态值说明

在AJAX实际运行当中,对于访问XMLHttpRequest(XHR)时并不是一次完成的,而是分别经历了多种状态后取得的结果,对于这种状态在AJAX中共有5种,分别是:

0 - (未初始化)还没有调用send()方法

1 - (载入)已调用send()方法,正在发送请求

2 - (载入完成)send()方法执行完成,

3 - (交互)正在解析响应内容

4 - (完成)响应内容解析完成,可以在客户端调用了

对于上面的状态,其中"0"状态是在定义后自动具有的状态值,而对于成功访问的状态(得到信息)我们大多数采用"4"进行判断。

第一种:

通过 Promise 分装的 Ajax

java 复制代码
function Param(json) {
    var arr = [];
    for (var i in json) {
        arr,
        arr.push(i + "=" + json[i])
    }
    return arr.join("&");
}


function ajax(a) {
    return new Promise(function(resolve, reject) {
        a = a || {};
        a.type = a.type || "get";
        a.data = a.data || "";
        var xhr = null;
     
     // 处理兼容问题
        xhr = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
        if (a.type === "get") {
            a.url += "?" + Param(a.data) + "&t=" + new Date().getTime();
       //调用open()方法并采用异步方式
            xhr.open("get", a.url, true);
       //使用send()方法将请求发送出去
            xhr.send();
        } else if (a.type === "post") {
            xhr.open("post", a.url, true);
            xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xhr.send(Param(a.data))
        }
        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    resolve(JSON.parse(xhr.responseText));
                } else {
                    reject("Err:" + xhr.status)
                }
            }
        }

    })
}

第二种:

通过 class 构造函数分装的

java 复制代码
Ajaxclass Ajax {  constructor() {this.xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
    }
    fn() {
        this.xhr.onreadystatechange = () => {
            if (this.xhr.readyState === 4) {
                if (this.xhr.status === 200) {
                    if (responseType === 'json') {
                        resolve(JSON.parse(this.xhr.responseText))
                    } else {
                        resolve(this.xhr.responseText)
                    }
                } else {
                    reject(new Error(this.xhr.status))
                }
            }
        }
    }
    get(opt) {
        return new Promise((resolve, reject) => {
            let {
                url,
                async = true,
                params = {},
                responseType = 'json'
            } = opt;
            if (!url) {
                return;
            }
            url = this.formatData(params) ? url + '?' + this.formatData(params) : url
            this.xhr.open('get', url, async);

            this.fn();

            this.xhr.send();
        })
    }
    post(opt) {
        return new Promise((resolve, reject) => {
            let {
                url,
                async = true,
                params = {},
                responseType = 'json',
                paramsType = 'application/x-www-form-urlencoded'
            } = opt;
            if (!url) {
                return;
            }
            this.xhr.open('post', url, async);

            this.fn();

            this.xhr.setRequestHeader('content-type', paramsType)
            this.xhr.send(this.formatData(params, paramsType));
        })
    }
    formatData(params, paramsType = 'application/x-www-form-urlencoded') {
        if (paramsType === 'application/x-www-form-urlencoded') {
            return Object.entries(params).map(val => val[0] + '=' + val[1]).join('&')
        } else {
            return JSON.stringify(params);
        }
    }
}

AJAX状态码说明

1:请求收到,继续处理

2:操作成功收到,分析、接受

3:完成此请求必须进一步处理

4:请求包含一个错误语法或不能完成

5:服务器执行一个完全有效请求失败*

再具体就如下:

100------客户必须继续发出请求

101------客户要求服务器根据请求转换HTTP协议版本

200------交易成功

201------提示知道新文件的URL

202------接受和处理、但处理未完成

203------返回信息不确定或不完整

204------请求收到,但返回信息为空

205------服务器完成了请求,用户代理必须复位当前已经浏览过的文件

206------服务器已经完成了部分用户的GET请求

300------请求的资源可在多处得到

301------删除请求数据,重定向

302------在其他地址发现了请求数据

303------建议客户访问其他URL或访问方式

304------客户端已经执行了GET,但文件未变化

305------请求的资源必须从服务器指定的地址得到

306------前一版本HTTP中使用的代码,现行版本中不再使用

307------申明请求的资源临时性删除

400------错误请求,如语法错误

401------请求授权失败

402------保留有效ChargeTo头响应

403------请求不允许

404------没有发现文件、查询或URl

405------用户在Request-Line字段定义的方法不允许

406------根据用户发送的Accept拖,请求资源不可访问

407------类似401,用户必须首先在代理服务器上得到授权

408------客户端没有在用户指定的饿时间内完成请求

409------对当前资源状态,请求不能完成

410------服务器上不再有此资源且无进一步的参考地址

411------服务器拒绝用户定义的Content-Length属性请求

412------一个或多个请求头字段在当前请求中错误

413------请求的资源大于服务器允许的大小

414------请求的资源URL长于服务器允许的长度

415------请求资源不支持请求项目格式

416------请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段

417------服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求

500------服务器产生内部错误

501------服务器不支持请求的函数

502------服务器暂时不可用,有时是为了防止发生系统过载

503------服务器过载或暂停维修

504------关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长

505------服务器不支持或拒绝支请求头中指定的HTTP版本

Ajax前后端数据交互--SSM

前后台数据交互均使用json。

框架ssm(spring+springmvc+mybatis)

@RequestBody注解实现接收http请求的json数据,将json数据转换为java对象

@ResponseBody注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端

1.导包
java 复制代码
	<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.75</version>
		</dependency>
2.在配置映射器和适配器时使用
java 复制代码
<mvc:annotation-driven></mvc:annotation-driven>

它默认加载了很多格式的解析器,例如JSON等,不需要手动配置。

案例

前端
java 复制代码
   // 跳转 到tranferaddSub
                        $.ajax({
                            url : "/tranfermixtrue",
                            type : "POST",
                            dataType:"json",
                            contentType : "application/json;charset=UTF-8",
                            <!-- 向后端传输的数据 -->
                            data : JSON.stringify({
                                id:getdate(),
                                accuracy:parseFloat(eval(right/50)),
                                exercises:cons,
                                degreeOfDifficulty:1
                            }),
                            success:function(result) {
                            },
                            error:function(result){
                            }
                        });
后端
java 复制代码
  @RequestMapping(value = "/tranferaddSub")
    public  String tranferaddSub(@RequestBody Exercises exercises) {
//        作为addSUb的中转站
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        ExerciseSerivice serivice = context.getBean("ExerciseSeriviceImpl", ExerciseSerivice.class);
        String jsonString = JSON.toJSONString(exercises);
        Exercises exercisess = JSON.parseObject(jsonString, Exercises.class);
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("date",exercisess.getId());
        map.put("data",jsonString);
        serivice.addExercise(map);
        return "redirect:/addSub";
    }

    @RequestMapping(value = "/tranfermulDivide")
    public  String tranfermulDivide(@RequestBody Exercises exercises) {
//        作为mixtrue的中转站
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        ExerciseSerivice serivice = context.getBean("ExerciseSeriviceImpl", ExerciseSerivice.class);
        String jsonString = JSON.toJSONString(exercises);
        Exercises exercisess = JSON.parseObject(jsonString, Exercises.class);
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("date",exercisess.getId());
        map.put("data",jsonString);
        serivice.addExercise(map);
        return "redirect:/mulDivide";
    }
    @RequestMapping(value = "/tranfermixtrue")
    public  String tranfermixtrue(@RequestBody Exercises exercises) {
//        作为mixtrue的中转站

        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        ExerciseSerivice serivice = context.getBean("ExerciseSeriviceImpl", ExerciseSerivice.class);
        String jsonString = JSON.toJSONString(exercises);
        Exercises exercisess = JSON.parseObject(jsonString, Exercises.class);
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("date",exercisess.getId());
        map.put("data",jsonString);
        serivice.addExercise(map);
        return "redirect:/mixtrue";
    }

@RequestBody将传入的json数据转换位items对象,而@ResponseBody将return的i对象转换成json格式返回给jsp页面。
注:保证json的key和对应的pojo类的字段一致

相关推荐
狸克先生4 分钟前
如何用AI写小说(二):Gradio 超简单的网页前端交互
前端·人工智能·chatgpt·交互
baiduopenmap18 分钟前
百度世界2024精选公开课:基于地图智能体的导航出行AI应用创新实践
前端·人工智能·百度地图
loooseFish26 分钟前
小程序webview我爱死你了 小程序webview和H5通讯
前端
请叫我欧皇i38 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
533_41 分钟前
[vue] 深拷贝 lodash cloneDeep
前端·javascript·vue.js
guokanglun1 小时前
空间数据存储格式GeoJSON
前端
zhang-zan1 小时前
nodejs操作selenium-webdriver
前端·javascript·selenium
猫爪笔记1 小时前
前端:HTML (学习笔记)【2】
前端·笔记·学习·html
brief of gali2 小时前
记录一个奇怪的前端布局现象
前端
Json_181790144803 小时前
电商拍立淘按图搜索API接口系列,文档说明参考
前端·数据库