XMLHttpRequest和Ajax的关系

ajax是一种技术方案,但并不是一种新技术。
ajax最核心的依赖是浏览器提供的XMLHttpRequest对象。
所以我用一句话来总结两者的关系:我们使用XMLHttpRequest对象来发送一个Ajax请求

XMLHttpRequest的发展历程

XMLHttpRequest一开始只是微软浏览器提供的一个接口,后来各大浏览器纷纷效仿也提供了这个接口,再后来W3C对它进行了标准化,提出了XMLHttpRequest标准XMLHttpRequest标准又分为Level 1Level 2
相应的区别和用法参考:
你真的会使用XMLHttpRequest吗?
阮一峰的XMLHttpRequest Level 2 使用指南

实例代码

pom.xml

<!--servlet--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet.version}</version><scope>provided</scope></dependency><!--json--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.29</version></dependency><!--上传文件--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency>

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>ajax测试</title><script type="text/javascript" src="<%=request.getContextPath()%>/resource/js/jquery3.3.1/jquery.min.js"></script><script type="text/javascript"  src="<%=request.getContextPath()%>/resource/js/ajax.js"></script><script type="text/javascript"  src="<%=request.getContextPath()%>/resource/js/jqueryAjax.js"></script>
</head>
<body>
<h1>XMLHttpRequest level 1</h1>
<button onclick="xhr1_get()">xhr level 1 get请求</button>
<button onclick="xhr1_post()">xhr level 1 post请求</button><h1>jQuery ajax</h1>
<button id="jquery_ajax_get">jquery get请求</button>
<button id="jquery_ajax_post">jquery post请求</button><h1>XMLHttpRequest level 2</h1>
<button onclick="xhr2_get()">xhr level 2 get请求</button>
<button onclick="xhr2_post()">xhr level 2 post请求</button>
</body>
</html>

XMLHttpRequest level 1

ajax.js

//等到所有内容,包括外部图片之类的文件加载完后,才会执行
window.onload = function () {console.log("文档就绪后执行");
}

GET请求

function xhr1_get() {var xhr = new XMLHttpRequest();//默认是异步请求async:truexhr.open("GET", "./xhr1Servlet?name=zhangsan&age=23", true);//设置响应数据解析格式(优先级大于后端设置)// xhr.overrideMimeType('text/html;charset=UTF-8');xhr.onreadystatechange = function (e) {if (this.readyState === 4 && this.status === 200) {console.log(this.response);}}xhr.send();
}

Xhr1Servlet.java

@WebServlet("/xhr1Servlet")
public class Xhr1Servlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//和前端设置只一处就可以了,get通常后端设置,后端设置浏览器响应头才能看见resp.setContentType("text/html;charset=UTF-8");String name = req.getParameter("name");String age = req.getParameter("age");resp.getWriter().print("名字:" + name + "年龄:" + age);}
}

POST请求

function xhr1_post() {var data = "name=zhangsan&age=23";var xhr = new XMLHttpRequest();xhr.open("POST", "./xhr1Servlet", true);//必须设置请求头,因为request.getParameter()获取的参数只能是符合URL编码格式的// ajax的默认请求ContentType:text/plain(纯文本)xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");xhr.onreadystatechange = function (e) {if (this.readyState === 4 && this.status === 200) {console.log(this.response);}}//data数据格式必须符合URL编码字符串格式,如:“param1=value1&param2=value2”xhr.send(data);
}

Xhr1Servlet .java

@WebServlet("/xhr1Servlet")
public class Xhr1Servlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//和前端设置只一处就可以了,get通常后端设置,后端设置浏览器响应头才能看见resp.setContentType("text/html;charset=UTF-8");String name = req.getParameter("name");String age = req.getParameter("age");resp.getWriter().print("名字:" + name + " 年龄:" + age);}
}

XMLHttpRequest level 2

xhr.send(data),data可以是什么类型的数据
xhr.responseType用来指定xhr.response的数据类型
跨域资源共享 CORS 详解

GET请求

function xhr2_get() {var xhr = new XMLHttpRequest();xhr.responseType = "json";xhr.open("GET", "./xhr2Servlet?name=zhangsan&age=23", true);//注册相关事件回调处理函数xhr.onload = function (e) {if (this.status == 200 || this.status == 304) {console.log(this.response);}};xhr.send();
}

Xhr2Servlet.java

@WebServlet("/xhr2Servlet")
public class Xhr2Servlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//默认转换成了iso-8859-1的编码格式;和前端设置一处就可以了resp.setContentType("application/json;charset=UTF-8");String name = req.getParameter("name");String age = req.getParameter("age");JSONObject data = new JSONObject();data.put("名字:", name);data.put("年龄:", age);resp.getWriter().print(data);}
}

POST请求

function xhr2_post() {var formData = new FormData();formData.append('name', 'zhangsan');formData.append('age', 12);var xhr = new XMLHttpRequest();//设置xhr请求的超时时间xhr.timeout = 30000;//设置响应返回的数据格式xhr.responseType = "json";//创建一个 post 请求,采用异步xhr.open('POST', './xhr2postServlet', true);//注册相关事件回调处理函数xhr.onload = function (e) {if (this.status == 200 || this.status == 304) {console.log(this.response);}};//FormData 类型,content-type默认值为multipart/form-dataxhr.send(formData);
}

Xhr2postServlet.java

@WebServlet("/xhr2postServlet")
public class Xhr2postServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//默认转换成了iso-8859-1的编码格式;和前端设置一处就可以了resp.setContentType("application/json;charset=UTF-8");JSONObject data = new JSONObject();DiskFileItemFactory factory = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(factory);InputStream inputStream = null;try {List<FileItem> fileItems = upload.parseRequest(req);for (FileItem item : fileItems) {//普通字段if (item.isFormField()) {String fieldName = item.getFieldName();String value = item.getString("UTF-8");if("name".equals(fieldName)){data.put("名字:", value);}if("age".equals(fieldName)){data.put("年龄:", value);}} else {//文件名称String fileName = item.getName();//文件输入流inputStream = item.getInputStream();}}} catch (FileUploadException e) {data.put("失败原因:", e.getMessage());} finally {IOUtils.closeQuietly(inputStream);}resp.getWriter().print(data);}
}

jQuery ajax

jqueryAjax.js

GET请求

//在 html 所有标签(DOM)都加载之后,就会去执行
//DOM文档对象转换为jQuery对象,然后通过ready(fn)注册页面加载事件,当页面加载完毕后执行fn函数
$(document).ready(function(){//AJAX 请求完成时运行的函数,$(document)表示DOM对象转换为jQuery对象$(document).ajaxComplete(function () {console.log("jqueryAjax请求结束");});//为将来的 $.ajax()请求设置默认值,$.get()和$.post()不能触发$.ajaxSetup({url:"./xhr1Servlet?name=zhangsan&age=25",async:true,type:"GET",headers: {"Accept" : "text/html; charset=utf-8","Content-Type": "text/html; charset=utf-8"},success:function(data){console.log("ajax()请求结束,结果:" );console.log(data);}});$("#jquery_ajax_get").click(function() {$.ajax();$.get("./xhr1Servlet?name=zhangsan&age=23", function (data) {console.log(data);}, "text");$.get("./xhr2Servlet", {"name": "zhangsan", "age": 23}, function (data) {console.log(data);}, "json");});
});

POST请求

//在 html 所有标签(DOM)都加载之后,就会去执行
//DOM文档对象转换为jQuery对象,然后通过ready(fn)注册页面加载事件,当页面加载完毕后执行fn函数
$(document).ready(function(){$("#jquery_ajax_post").click(function() {$.post("./xhr1Servlet?name=zhangsan&age=23", function (data) {console.log(data);}, "text");$.post("./xhr2Servlet", {"name": "zhangsan", "age": 23}, function (data) {console.log(data);}, "json");//运行报错,因为header is application/x-www-form-urlencoded$.post("./xhr2postServlet", {"name": "zhangsan", "age": 23}, function (data) {console.log(data);}, "json");});
});

XMLHttpRequest和Ajax相关推荐

  1. 异步请求-XMLHttpRequest、ajax、axios原理浅析

    异步请求-XMLHttpRequest.ajax.axios原理浅析 XMLHTTPRequest 参考 readyState responseType XMLHttpRequest Level 1 ...

  2. 使用 XMLHttpRequest 实现 ajax

    使用 XMLHttpRequest 实现 ajax function ajax (url, method, body, headers) {return new Promise((resolve, r ...

  3. 使用XMLHttpRequest实现AJAX

    一.介绍 本文介绍利用原生态Javascript打造Ajax的全过程. 达到的效果是:点击页面上的按钮,通过传统的Javascript的Ajax方式从服务端取回一个"Hello Ajax!& ...

  4. XMLHttpRequest对象AJAX技术的基本使用

    AJAX技术 文章目录 AJAX技术 Ajax技术的诞生 一.Ajax的概念? 二.XMLHttpRequest对象的概念 1.XMLHttpRequest对象的属性 2.XMLHttpRequest ...

  5. AJAX初探,XMLHttpRequest介绍

    AJAX初探,XMLHttpRequest介绍 AJAX      AJAX = Asynchronous JavaScript and XML. 异步的JavaScript和XML.      AJ ...

  6. ASP.NET MVC中使用AJAX(XMLHttpRequest、Microsoft AJAX Library......)

    AJAX的好处就是不会堵塞页面,可以提高用户体验,可以减少数据传输尺寸,提高应用程序的性能.目前,AJAX技术可以说是已经成为WEB开发的标准技术. AJAX技术是纯客户端技术,任何客户端框架(如:M ...

  7. Ajax入门(创建 XMLHttpRequest 对象)

    XMLHttpRequest 是 AJAX 的基础. 所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject). XMLHttpRequest ...

  8. java ajax报错500,(Struts2+JSON+Ajax) XMLHttpRequest ==500如何解决

    (Struts2+JSON+Ajax) XMLHttpRequest ==500怎么解决? 本帖最后由 zjlisok 于 2013-01-29 02:00:05 编辑 XMLHttpRequest. ...

  9. Ajax(二)-XMLHttpRequest(核心)对象的属性和方法

    XMLHttpRequest:Ajax核心对象 一.概念 二.属性 三.事件 四.方法 一.概念 XMLHttpRequest对象提供了与服务器端进行通信的协议,浏览器可以通过该对象向服务器发送请求, ...

最新文章

  1. 【K8S】Docker向私有仓库拉取/推送镜像报错(http: server gave HTTP response to HTTPS client)
  2. react 子传参父_React 子组件向父组件传值的方法
  3. C#反射设置属性值和获取属性值
  4. [转]centos7下yum安装mysql
  5. Python基础教程(020)--集成开发环境IDE简介--Pycharm
  6. 论文笔记_S2D.46_2013-3DV_基于点融合的动态场景实时三维重建
  7. 机器学习cs229——(一)概要
  8. Python抖音去水印_一步到位_一蓑烟雨任平生
  9. 荣耀继承者android,荣耀继承者后期阵容推荐,一套万金油阵容介绍给大家
  10. ARP协议的工作流程
  11. 淘宝/京东/苏宁/拼多多/唯品会 返利消息批量转链思路
  12. Mysql获取当天用户生日
  13. VIRTIO-BLK设备SERIAL ID
  14. 手把手教用matlab做无人驾驶
  15. 计算机键盘灯光怎么关闭,笔记本怎么关键盘的灯_笔记本电脑关闭键盘背光的步骤-win7之家...
  16. Python——Day4(基础知识练习二)
  17. 面试官:你对Redis缓存了解吗?面对这11道面试题你是否有很多问号?
  18. 在元宇宙的概念之下,互联网与数字经济不再是水火不容的存在
  19. 问答网站Quora副总裁杨蕾博士:让知识改变世界
  20. CV实战项目--人脸考勤

热门文章

  1. 禁用服务器系统关机,关机 允许系统在无需登录 Windows 10 (的情况下) - Windows security | Microsoft Docs...
  2. 【2021软件创新实验室暑假集训,小白勿进
  3. web component指南
  4. (结构体+指针)定义“车”结构体,实现改变车颜色,车牌操作
  5. python打开excel并写入数据,Python中,添加写入数据到已经存在的Excel的xls文件,即打开excel文件,写入新数据......
  6. SQL注入之打狗棒法(安全狗绕过)
  7. 联动天下CDN技术原理
  8. DELL R740 服务器安装
  9. Python in minute
  10. 新人使用Git获取远程仓库项目