原生ajax及其与服务器交互(java)学习笔记
Posted SaltFishYe
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原生ajax及其与服务器交互(java)学习笔记相关的知识,希望对你有一定的参考价值。
ajax主要用于与服务器进行异步交互数据(当然技术上也能做同步处理)。
因为传统的非ajax的web交互,是整个浏览器将数据传到后台处理,而后台处理时,用户只能等待,这样就非常效率低下。而且服务器会返回整个html页面,用户还得等待整个页面加载。这样是非常浪费资源。
ajax就可以做到在用户触发ajax请求的同时,任然能够进行操作,并且服务处理且返回数据时不进行页面重新加载,而用户也可以得到想要的数据。
以下直接通过代码和相应注释解释ajax请求过程
1 function buttonOnClick() { 2 // 页面数据 3 var info = ‘content=‘ + document.getElementById(‘contentId‘).value; 4 // xhr对象 5 var xhr; 6 /* 7 * XMLHttpRequest 对象提供了对 HTTP 协议的完全的访问,包括做出 POST 和 HEAD 请求以及普通的 GET 请求的能力。 8 * XMLHttpRequest 可以同步或异步地返回 Web 服务器的响应,并且能够以文本或者一个 DOM 文档的形式返回内容。 9 * XMLHttpRequest 得到了所有现代浏览器较好的支持。唯一的浏览器依赖性涉及 XMLHttpRequest 对象的创建。 在 IE 5 和 10 * IE 6 中,必须使用特定于 IE 的 ActiveXObject() 构造函数 以上说明来自W3school 11 */ 12 if (window.XMLHttpRequest) { 13 xhr = new XMLHttpRequest(); 14 } else { 15 xhr = new ActiveXObject(‘Microsoft.XMLHTTP‘); 16 } 17 xhr.onreadystatechange = function() { 18 /* 19 * 0 Uninitialized 初始化状态。XMLHttpRequest 对象已创建或已被 abort() 方法重置。 1 Open 20 * open() 方法已调用,但是 send() 方法未调用。请求还没有被发送。 2 Sent Send() 方法已调用,HTTP 21 * 请求已发送到 Web 服务器。未接收到响应。 3 Receiving 所有响应头部都已经接收到。响应体开始接收但未完成。 4 Loaded 22 * HTTP 响应已经完全接收。 readyState 的值不会递减 23 */ 24 if (xhr.readyState == 4) { 25 // status为http状态码,内容过多,不详细展开,大体分为五类 26 /* 27 * 1XX 100-101 信息提示 2XX 200-206 成功 3XX 300-305 重定向 4XX 400-415 客户端错误 28 * 5XX 500-505 服务器错误 29 */ 30 if (xhr.status == 200) {//表示成功 31 /* 32 * responseText 响应内容作为文本 33 * 34 * responseXML 响应内容作为xml文档 35 */ 36 return ajaxsuccess(xhr.responseText); 37 } 38 } 39 } 40 /* 41 * 第一个参数为发送请求方式,常用POST/GET,不区分大小写,但是通常大写。 42 * ‘GET’用于常规请求,它适用于URL完全指定的资源。当请求对服务器没有任何副作用是可缓存的情况下, 43 * ‘POST’常用于含有额外的数据的请求 44 * 45 * 第二个参数为url 46 * 47 * 第三个参数为是否异步请求,默认为true,异步请求 48 */ 49 xhr.open(‘POST‘, ‘/WebDemo/ServletDemoA‘, true); 50 51 /* 52 * Http Header里的Content-Type一般有这三种: 53 * 54 * application/x-www-form-urlencoded:数据被编码为名称/值对。这是标准的编码格式。 55 * 56 * multipart/form-data: 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。 text/plain: 57 * 58 * 数据以纯文本形式(text/json/xml/html)进行编码,其中不含任何控件或格式字符。postman软件里标的是RAW。 59 * 60 * form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。 61 * 62 * 上传文件时。 63 * 也就是有type=file控件,要用multipart/form-data了,指定传输数据为二进制类型 64 * 65 * 当action为post且Content-Type类型是multipart/form-data,浏览器会把整个表单以控件为单位分割, 66 * 并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。 67 * 68 * 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串追加到url后面,用?分割,加载这个新的url。 69 * 70 * 当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 71 * 因为url长度有限所以get请求的数据是有限的,而post无限 72 */ 73 // Content-type详细内容见Content-type对照表 74 xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 75 xhr.send(info); 76 } 77 78 function ajaxsuccess(resTxt) { 79 console.log(‘成功‘); 80 console.log(resTxt); 81 }
简单且常用的原生ajax过程
以下是servlet代码
1 /** 2 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse 3 * response) 4 */ 5 protected void doPost(HttpServletRequest request, HttpServletResponse response) 6 throws ServletException, IOException { 7 /* 8 * 本例中 9 * 分号之前 10 *‘/‘之前 媒体格式,常见text application 11 * text/plain 为普通文本 12 * 13 *‘/‘之后 常用的有 14 * html html代码 15 * xml xml 16 * javascript js 17 * json json对象 18 * 详细见content-Type对照表 19 * 20 * utf-8 为编码格式,不详细展开,都懂。。。。 21 */ 22 response.setContentType("text/plain;charset=utf-8"); 23 // 传输的数据到前台 24 // response.getWriter().write("success"); 25 // 完成操作的对象为java.io.PrintWriter,通过io输出流传递数据 26 PrintWriter writer = response.getWriter(); 27 writer.write("success"); 28 }
补充说明
contentType是向服务器说明输出的数据是什么。
而在jqeury中的ajax有一个属性dataType,是用于说明要接受的数据类型,并强制转换,并且可能导致失败。
当dataType没指定时,将会自动推断并将返回数据转型,特别是contentType中指明数据类型时。
要是dataType有指定,则无论contentType内容,都将返回的数据转换为dataType指定类型。
以上是关于原生ajax及其与服务器交互(java)学习笔记的主要内容,如果未能解决你的问题,请参考以下文章