**

Ajax 技术应用

1.Ajax 简介

1.1Ajax 是什么?

Ajax (Asynchronous JavaScript and XML) 是一种Web应用技术,可以借助客户端脚本(javascript)与服务端应用进行异步通讯,获取服务端数据以后,可以进行局部刷新。进而提高数据的响应和渲染速度。

传统Web应用中简易的同步模型分析,如图-1所示:

图-1

基于Ajax技术的异步请求响应模型分析,如图-2所示:

图-2

1.2Ajax 技术应用场景?

Ajax技术最大的优势就是底层异步,然后局部刷新,进而提高用户体验,这种技术现在在很多项目中都有很好的应用,例如:商品系统。

评价系统。

地图系统。

…..

AJAX可以仅向服务器发送并取回必要的数据,并在客户端采用JavaScript处理来自服务器的响应。这样在服务器和浏览器之间交换的数据大量减少,服务器响应的速度就更快了。但Ajax技术也有劣势,最大劣势是不能直接进行跨域访问。

1.3Ajax 技术时序模型分析?

传统Web应用中的,同步请求应用时序模型分析,如图-3所示:

图-3

在图-3中,客户端向服务端向服务端发送请求需要等待服务端的响应结果,服务端返回数据以后,客户端可以继续发送请求。

基于Ajax技术的Web异步请求响应模型如图-4所示:

图-4

在图-4中,客户端可以向服务端发送异步请求,客户端无需等待服务端的响应结果,可以不断向服务端发送请求。

2.Ajax 快速入门

2.1 Ajax 请求响应过程分析

所有的Ajax 请求都会基于DOM(HTML元素)事件,通过XHR(XMLHttpRequest)对象实现与服务端异步通讯局部更新,如图-4所示:

图-4

基于图-4的分析,Ajax应用的编程步骤如下:

第一步:基于dom事件创建XHR对象(XMLHttpRequest对象)

第二步:注册XHR对象状态监听,通过回调函数(callback)处理状态信息。

第三步:创建与服务端的连接

第四步:发送异步请求实现与服务端的通讯

2.2 Ajax入门代码简易实现

业务描述,设计如下页面,在页面上点击Get Request按钮时,向服务端发送异步请求获取服务端数据,然后将响应结果更新到页面上.

第一步:服务端代码设计

创建AjaxController类,用于处理客户端请求

package com.cy.ajax.controller;

@Controller

@RequestMapping("/")

public class AjaxController {

//处理ajax请求的服务端设计

@RequestMapping("doAjaxGet")

@ResponseBody //将方法返回值以字符串形式进行输出

public String doAjaxGet() throws Exception{

System.out.println("==doGet()==");

//Thread.sleep(3000);//模拟耗时操作

return "Ajax Get request result";

}

}

第二步:客户端代码设计

客户端页面关键dom元素设计:

异步请求

Get Request

loading data ....

客户端页面中关键Ajax代码设计与实现

//Ajax方式的请求

function doAjaxGet(){//错误调试:debugger,console.log(),排除法

//1.创建XHR对象

var xhr=new XMLHttpRequest();

//2.设置状态监听(将服务端响应的结果更新到ajaxResultId位置)

xhr.onreadystatechange=function(){

//console.log(xhr.readState);

if(xhr.readyState==4&&xhr.status==200){

console.log(xhr.responseText);

document.getElementById("ajaxResultId").innerHTML=xhr.responseText;

}

};

//3.建立连接

xhr.open("GET","http://localhost/doAjaxGet",true);//true表示异步(底层会启动线程与服务端通讯)

//4.发送请求

xhr.send();

}Ajax 基本业务实现

===============

3.1 基本业务描述

构建ajax-02页面,首先,在文本框中注册焦点事件,基于焦点事件判断输入内容是否存在.其次点击save按钮时,将用户内容异步提交到服务器端.

3.2 服务端关键代码实现

在服务端AjaxConotroller中添加如下代码,处理客户端请求:

private List names=new ArrayList();//假设这是存储数据的表

/*通过此方法校验名字是否存在/

@RequestMapping("doCheck")

@ResponseBody

public String doCheck(String name) {

if(names.contains(name))

return "名字"+name+"已经存在,请选择其它名字";

return "名字"+name+"不存在,可以注册";

}

/*将客户端请求数据写入到names对应的集合/

@RequestMapping("doSave")

@ResponseBody

public String doSave(String name) {

System.out.println("name="+name);

names.add(name);

return "save ok";

}

3.3 客户端关键代码实现

构建ajax-02页面,然后添加关键元素.

第一步:html关键表单元素设计

The Ajax 02 Page

Ajax 表单请求

第二步:添加JS关键业务代码

function doClear(){

document.getElementById("result").innerHTML="";

}

function doSave(){

//1.创建XHR对象

var xhr=new XMLHttpRequest();

//2.设置状态监听

xhr.onreadystatechange=function(){

if(xhr.readyState==4&&xhr.status==200){

document.getElementById("result").innerHTML=""+xhr.responseText+"";

}

};

//3.打开链接

//var name=document.getElementById("nameId").value;

var  name=document.forms[0].name.value;

xhr.open("POST","/doSave",true);

//post请求要设置请求头(规定)

xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

//4.发送请求

xhr.send("name="+name);//Post请求send方法传值

}

function doCheck(){//在此函数中向服务端发起异步请求,检测name是否存在

//1.创建XHR对象

var xhr=new XMLHttpRequest();

//2.设置状态监听

xhr.onreadystatechange=function(){

if(xhr.readyState==4&&xhr.status==200){

document.getElementById("result").innerHTML=""+xhr.responseText+"";

}

};

//3.打开链接

//var name=document.getElementById("nameId").value;

var  name=document.forms[0].name.value;

console.log("name",name);

xhr.open("GET","/doCheck?name="+name,true);

//4.发送请求

xhr.send(null);//Get请求send方法传值

}

4.Ajax 技术进阶实现

4.1 Ajax 关键代码的封装

在实际编程过程中我们通常会封装代码共性,提取代码特性.然后来提高代码的可重用性.例如:

第一步:封装AJax Get请求,关键代码分析如下:

function doAjaxGet(url,params,callback){

//1.创建XmlHttpRequest对象

var xhr=new XMLHttpRequest();

//2.设置状态监听,监听XmlHttpRequest对象与服务端通讯的过程(例如连接是否建立,请求是否在处理,响应是否已产生)

xhr.onreadystatechange=function(){//callback(回调函数)

//基于xhr对象获取的通讯状态,对响应数据进行处理

//readyState状态说明

//0:未初始化,尚未调用open() 方法

//1:启动。已经调用open() 方法,但尚未调用send() 方法

//2:发送。已经调用send() 方法,但尚未接收到响应

//3:接收。已经接收到部分响应

//4:完成。已经接收到全部响应数据,而且已经可以在客户端使用了

if(xhr.readyState==4&&xhr.status==200){//500表示服务端出错了

//服务端响应的结果会传递给XHR对象,我们可以借助responseText获取响应结果

callback(xhr.responseText);

}

}

//3.创建与服务端的连接

xhr.open("GET",url+"?"+params,true);//true表示异步

//4.发送请求

xhr.send(null); //Get请求,send方法不传内容

//5.对响应结果进行处理(在回调函数中处理)。

}

第二步:封装AJax Post请求,关键代码分析如下:

function doAjaxPost(url,params,callback){

//1.创建XmlHttpRequest对象

var xhr=new XMLHttpRequest();

//2.设置状态监听,监听XmlHttpRequest对象与服务端通讯的过程.

xhr.onreadystatechange=function(){//callback(回调函数)

//基于xhr对象获取的通讯状态,对响应数据进行处理

if(xhr.readyState==4&&xhr.status==200){//500表示服务端出错了

//服务端响应的结果会传递给XHR对象,

//我们可以借助xhr.responseText获取响应结果

callback(xhr.responseText);

}

}

//3.创建与服务端的连接

xhr.open("POST",url,true);//true表示异步

xhr.setRequestHeader("Content-Type",

"application/x-www-form-urlencoded");

//4.发送请求

xhr.send(params); //post请求将参数写到send方法

//5.对响应结果进行处理(在回调函数中处理)。

}

第三步:在业务方法中应用封装好的代码,例如:

保存业务的关键客户端代码分析及实现.

function doSave(){

//1.定义请求url

var url="doSave";

//2.定义请求参数

var params="name="+document.forms[0].name.value;

//3.发送异步的post请求

doAjaxPost(url,params,function(result){

document.getElementById("result").innerHTML=result;

})

}

检查名字是否存在的关键客户端代码实现

function doCheck(){//在此函数中向服务端发起异步请求,检测name是否存在

//1.定义请求url

var url="doCheck";

//2.定义请求参数

var name=document.forms[0].name.value;

var params="name="+name;

//3.发送异步Get请求

doAjaxGet(url,params,function(result){

document.getElementById("result").innerHTML=result;

})

}

调用过程分析:

断点:调试分析:

4.2 Ajax 编程框架基本实现(了解)

我们在实际的js编程中经常会以面向对象的方式进行实现,例如doAjaxGet函数如何以对象方式进行调用呢?关键代码分析如下:

(function(){

//定义一个函数,可以将其连接为java中的类

var ajax=function(){}

//在变量ajax指向的类中添加成员,例如doAjaxGet函数,doAjaxPost函数

ajax.prototype={

doAjaxGet:function(url,params,callback){

//创建XMLHttpRequest对象,基于此对象发送请求

var xhr=new XMLHttpRequest();

//设置状态监听(监听客户端与服务端通讯的状态)

xhr.onreadystatechange=function(){//回调函数,事件处理函数

if(xhr.readyState==4&&xhr.status==200){

//console.log(xhr.responseText);

callback(xhr.responseText);//jsonStr

}

};

//建立连接(请求方式为Get,请求url,异步还是同步-true表示异步)

xhr.open("GET",url+"?"+params,true);

//发送请求

xhr.send(null);//GET请求send方法不写内容

},

doAjaxPost:function(url,params,callback){

//创建XMLHttpRequest对象,基于此对象发送请求

var xhr=new XMLHttpRequest();

//设置状态监听(监听客户端与服务端通讯的状态)

xhr.onreadystatechange=function(){//回调函数,事件处理函数

if(xhr.readyState==4&&xhr.status==200){

//console.log(xhr.responseText);

callback(xhr.responseText);//jsonStr

}

};

//建立连接(请求方式为POST,请求url,异步还是同步-true表示异步)

xhr.open("POST",url,true);

//post请求传参时必须设置此请求头

xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

//发送请求

xhr.send(params);//post请求send方法中传递参数

}

}

window.Ajax=new ajax();//构建ajax对象并赋值给变量全局变量Ajax

})()

此时外界再调用doAjaxGet和doAjaxPost函数时,可以直接通过Ajax对象进行实现。

5.Ajax 技术在Jquery中应用

5.1Jquery 简介

jQuery是一个快速、简洁的JavaScript库框架,是一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。

5.2Jquery 中常用Ajax 函数

jQuery中基于标准的ajax api 提供了丰富的Ajax函数应用,基于这些函数可以编写少量代码,便可以快速实现Ajax操作。常用函数有:ajax(…)

get(…)

getJSON(…)

post(…)

说明:jquery 中ajax相关函数的语法可参考官网(jquery.com).

5.3Jquery 中常用Ajax 函数应用案例分享

get函数应用,代码如下

//向服务端发送Ajax Get 请求

function doGet(){

//1.定义请求的url

var url="doAjaxGet";

//2.定义请求的参数

var params="msg=hello jquery ajax get";

//3.发送异步Get请求

//这里的$符号为jQuery中的一个对象

//get(url,params[,dataType])为jquery中的一个ajax函数

$.get(url,params,function(result){

//document.getElementById("result").innerHTML=result;

$("#result").html(result);

},"text");//在这个函数中你看到ajax的代码了吗?

}

post函数应用,代码如下

//向服务端发送Ajax Post 请求

function doPost(){

//1.定义请求的url

var url="doAjaxPost";

//2.定义请求的参数

var params="msg=hello jquery ajax Post";

//3.发送异步POST请求

//这里的$符号为jQuery中的一个对象

//post(url,params[,dataType])为jquery中的一个ajax函数

$.post(url,params,function(result){//post请求一般用于向服务端提交数据

$("#result").html(result);

});//在这个函数中你看到ajax的代码了吗?

}

ajax函数应用

//向服务端发送Ajax Post 请求

function doAjax(){

//1.定义请求的url

var url="doAjaxGet";

//2.定义请求的参数

var params="msg=hello jquery ajax request";

//3.发送异步Get请求

//这里的$符号为jQuery中的一个对象

$.ajax({

type:"GET",//表示get请求(默认为get),省略不写为Get

url:url,//":"左边的内容为语法定义,我们不能修改.":"右边为我们自己定义

data:params,//请求参数

async:true,//true表示异步

success:function(result){ //回调函数

$("#result").html(result);

}

});//在这个函数中你看到ajax的代码了吗?

}

load函数应用

function doLoad(){

//1.定义请求的url

var url="doAjaxGet";

//2.定义请求的参数

var params="msg=hello jquery ajax request";

//3.发送异步Get请求

//在指定位置异步加载url对象的资源,

//在当前应用中表示把url对象的资源呈现到#result位置.

//$("#result").load(url,params,function(){//回调函数,资源加载完成执行此函数

//  console.log("load complete");

//});

$("#result").load(url);//假如不向服务端传值,不需要处理load完以后的结果,还可以这样写

}

4.Ajax 章节总结

4.1重难点分析客户端与服务端通讯时的请求响应模型?(同步,异步)

Ajax编程的基本步骤(入口对象-XMLHttpRequest),Ajax应用场景?

JQuery框架中ajax函数的基本应用?(ajax(),get(),getJSON(...).....)

JS代码编写过程中断点(debugger)的应用方式?

4.2FAQ分析Ajax技术有什么优势,劣势?(优势:按需异步加载,局部更新,改善用户体验)

Ajax技术中最核心对象?(XMLHttpRequest-入口对象)

客户端JS问题如何调试?(打桩console.log(),debugger,排除法)

对于一些js框架你是如何学习?官网(,demo,实践-浏览器测试,搜索引擎)

4.3BUG分析单词拼写错误,如图-7所示:

图-7

问题分析:点击错误提示中的54行代码,看看是不单词拼写错误,检查param单词在哪定义了。丢失括号,如图-8所示

图-8

问题分析:点击错误提示中的59行代码,看看是不是丢失了小括号“)”

**

ajax要不要入口函数,Ajax - SegmentFault 思否相关推荐

  1. 极客广州——EOS Asia郭达峰担任SegmentFault思否黑客马拉松技术顾问

    近日备受关注的 EOS 投票率超过 15%,主网激活,已正式上线.EOS Asia 联合创始人郭达峰将担任 SegmentFault 思否区块链黑客马拉松广州站技术顾问,为大赛项目提供技术咨询支持.届 ...

  2. SegmentFault 思否发布开源问答社区软件 Answer

    ONES 旗下技术问答社区 SegmentFault 思否(下称"思否")今日宣布,正式对外开源其问答社区软件 Answer. 作为国内领先的新一代技术问答社区,思否始于「聚集体智 ...

  3. 安势信息入选 SegmentFault思否「2022 中国新锐技术先锋企业」

    2023 年 1 月 4 日,中国技术先锋年度评选 | 2022 中国新锐技术先锋企业榜单正式发布.作为中国领先的新一代开发者社区,SegmentFault 思否依托数百万开发者用户数据分析,各科技企 ...

  4. 对比CSDN与开源中国、segmentFault思否

    前言:作为一个IT行业学生我遇到问题一般会通过搜索几个权威性论坛得到的结果,通常是CSDN.SegmentFault.开源中国. 1.需求测评以及对比 首先对于一个学生或者一个IT从业人员而言,相关I ...

  5. 网易云信入选《SegmentFault 思否 2019 中国技术品牌影响力企业榜单》!

    近日,SegmentFault 思否作为中国最大的新一代开发者社区,依托数百万开发者用户行为数据,及科技企业技术品牌在国内市场的大数据分析,评选出 30 家在开发者领域最具影响力的科技企业,权威发布& ...

  6. SegmentFault 思否社区被收购了!

    SegmentFault 思否被 ONES 收购了,而今年也刚好是思否的十周年,思否的创始人兼 CTO 祁宁在社区发布了一封致开发者的信 -- <10>,回顾了思否社区成立10年来的理想与 ...

  7. 开源社拍了拍 SegmentFault 思否,6 月杭州见

    5 月 19 日,OpenAI 突然官宣 ChatGPT 正式推出 iOS APP,迎来真 · iPhone 时刻.同日,国家超算天津中心发布国产中文语言大模型天河天元,并在此基础上启动了深度训练面向 ...

  8. 亚马逊云科技云创计划携手 SegmentFault 思否,成就 AI 探路者

    ‍‍ AI 无疑是这个夏天最"出圈"的话题. ChatGPT 的爆红向 AI 产业释放了"走出实验室"的信号,并提供了"从通用范式落地到具体场景&qu ...

  9. SegmentFault 思否联合开源社共同推出中国开源先锋 30 人评选

    点击上方"开源社"关注我们 | 转载自:SegmentFault | 编辑:黄欣宜 | 设计:刘颖洁 | 责编:王玥敏 # 前言 日新月异的技术革命,数字经济的新一轮爆发,背后是无 ...

最新文章

  1. 关于异常Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
  2. Revit API创建几何实体Solid并找到与之相交的元素
  3. java2实用教程_Java2实用教程(第5版)重要点及遗漏点(二)
  4. CentOS7.6 Open vSwitch安装
  5. 剑指offer十:矩形覆盖
  6. Mysql数据库(三)——mysql数据库高级操作
  7. 用代理技术实现简单的AOP框架
  8. 洛谷P1801 黑匣子 双堆套路的使用
  9. ttc文件linux安装,centos系统安装中文字体几种方法
  10. linux批量筛选序列变异位点,使用bedtools获取指定坐标上下游的序列
  11. LeetCode2.两数相加
  12. 一站式服务助力研发 2020 Ohayoo游戏开发者沙龙广州站成功揭幕
  13. 台式电脑主板插线步骤图_主板电池怎么放电?电脑主板电池放电的方法
  14. 【Flutter】基础组件【06】Image
  15. 前端保存之前输入的值_前端基础进阶(一):内存空间详细图解
  16. 数据库系统的结构(三级模式、两级映像)
  17. “为了对电脑进行保护,已经阻止此应用。”
  18. eclipse+ADT使用第三方静态库及COCOS2d问题汇总
  19. mac使用的pd虚拟机window黑屏 ---已解决
  20. Unity FairyGUI(十二)

热门文章

  1. bzoj 4517: [Sdoi2016]排列计数(错排+组合数逆元)
  2. C++新手入门学习笔记(跟着敲)
  3. 吴恩达神经网络和深度学习-学习笔记-3-参数随机初始化
  4. 8255A的工作方式控制字
  5. Excel里如何更改坐标轴起始位置使图落在正中心
  6. Java 9 揭秘(15. 增强的弃用注解)
  7. 了解Java密码扩展的基础
  8. 在VMware Workstation 9中安装Mac OS X 10.8 Mountain Lion
  9. 发一个招聘软件开发人员的帖子
  10. TD8.0管理员工具