AJAX请求详解 同步异步 GET和POST

AJAX请求详解 同步异步 GET和POST

  

  上一篇博文(http://www.cnblogs.com/mengdd/p/4191941.html)介绍了AJAX的概念和基本使用,附有一个小例子,下面基于这个例子做一些探讨.

同步和异步

在准备请求的时候,我们给open方法里传入了几个参数,其中第三个参数为true时,表示是异步请求:

//1. prepare request
xmlHttpRequest.open("GET", "AjaxServlet", true);
// XMLHttpRequest.prototype.open = function(method,url,async,user,password) {};

  

  为了模拟服务器的响应,并且不使用缓存内容,我们把服务器代码改成如下,加了5秒延时:

public class HelloAjaxServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet invoked!");
        //mock the processing time of server
        try {
            Thread.sleep(5000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //no cache
        response.setHeader("pragma","no-cache");
        response.setHeader("cache-control","no-cache");
        PrintWriter out = response.getWriter();
        out.println("Hello World");
        out.flush();
    }
}

  下面就可以比较出同步和异步的差别了:

  xmlHttpRequest.open()方法,第三个参数设置为async=true时,异步:

  点击按钮后过了5秒出现Hello World字样,但是这5秒过程中页面中的其他地方都是不受影响的,可以操作.

  xmlHttpRequest.open()方法,第三个参数设置为async=false时,同步:

  同样是点击按钮5秒后出现Hello World字样,但是这5秒中,按钮是不可点击状态,页面不可做其他操作.

  当使用同步设置时,其实不需要写回调函数,直接把响应的操作放在后面的语句即可.

  注:不推荐使用async=false.

GET和POST

让我们把原来的程序改得复杂一点,计算两个输入框的值.

加入两个输入框,然后在发送请求之前获取它们的值:

<body>
    <input type="button" value="get content from server" onclick="ajaxSubmit();"><br>
    <input type="text" value="value1" id="value1Id">
    <input type="text" value="value2" id="value2Id">

    <div id="div1"></div>
</body>

服务器端获取参数值并返回计算结果:

public class HelloAjaxServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet invoked!");
        process(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost invoked!");
        process(req, resp);
    }

    private void process(HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("process invoked!");

        String v1 = request.getParameter("v1");
        String v2 = request.getParameter("v2");
        String result = String.valueOf(Integer.valueOf(v1) + Integer.valueOf(v2));

        //mock the processing time of server
//        try {
//            Thread.sleep(5000L);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        //no cache
        response.setHeader("pragma", "no-cache");
        response.setHeader("cache-control", "no-cache");
        PrintWriter out = response.getWriter();
        out.println("Hello World: " + result);
        out.flush();
    }
}

首先用GET方法:

GET方法的参数拼接在url的后面:

xmlHttpRequest.open("GET", "AjaxServlet?v1=" + value1 + "&v2=" + value2, true);//GET
xmlHttpRequest.send(null);//GET
      

POST方法:

xmlHttpRequest.open("POST", "AjaxServlet", true);//POST
xmlHttpRequest.send("v1=" + value1 + "&v2=" + value2);//POST requset needs params here, for GET, just leave params empty or set it to null.

  注意,使用POST方法提交,在请求发送之前,必须要加上如下一行:

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

  完整index.jsp代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Hello Ajax</title>
    <script type="text/javascript">
        var xmlHttpRequest;
        function ajaxSubmit() {
            if (window.XMLHttpRequest) {//in JavaScript, if it exists(not null and undifine), it is true.
                // code for IE7+, Firefox, Chrome, Opera, Safari
                xmlHttpRequest = new XMLHttpRequest();
            } else if (window.ActiveXObject) {
                // code for IE6, IE5
                xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
            } else {
                //very rare browsers, can be ignored.
            }

            //also, we can handle IE5,6 first using:
            /*
             if (window.ActiveXObject) {
             //code for IE6, IE5
             }
             else {
             //code for others
             }
             */

            //send request
            if (null != xmlHttpRequest) {
                //get parameters from DOM
                var value1 = document.getElementById("value1Id").value;
                var value2 = document.getElementById("value2Id").value;

                //1. prepare request
//                xmlHttpRequest.open("GET", "AjaxServlet?v1=" + value1 + "&v2=" + value2, true);//GET
                xmlHttpRequest.open("POST", "AjaxServlet", true);//POST
                // XMLHttpRequest.prototype.open = function(method,url,async,user,password) {};

                //2. set callback function to handle events
                xmlHttpRequest.onreadystatechange = ajaxCallback;

                //3. do sending request action
//                xmlHttpRequest.send(null);//GET

                //POST
                xmlHttpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                xmlHttpRequest.send("v1=" + value1 + "&v2=" + value2);//POST requset needs params here, for GET, just leave params empty or set it to null.

            }

        }

        function ajaxCallback() {
            //alert("test");//this alert will show several times when click the button.
            if (4 == xmlHttpRequest.readyState && 200 == xmlHttpRequest.status) {
                var responseText = xmlHttpRequest.responseText;
                document.getElementById("div1").innerHTML = responseText;
            }
        }
    </script>

</head>
<body>
<input type="button" value="get content from server" onclick="ajaxSubmit();"><br>
<input type="text" value="" id="value1Id">
<input type="text" value="" id="value2Id">

<div id="div1"></div>
</body>
</html>

时间: 2024-10-06 00:51:44

AJAX请求详解 同步异步 GET和POST的相关文章

论如何把JS踩在脚下 —— JQuery基础及Ajax请求详解

一.什么是JQuery? JQuery是一种JavaScript框架,是一堆大神搞出来的能够让前端程序猿敲更少代码.实现更多功能的工具(在此,跪谢各位JQuery开发大大们!!!).JQuery的使用给优化HTML文档操作.事件处理.动画设计和Ajax交互提供了巨大的便利.而且,其特有的链式语法也较与JS更为清晰. 二.JQuery入门 想要使用JQuery框架,就必须在html文档中导入JQuery插件,导入方式和日常导入外部JS文件的方式是相同的.但要注意,在同一html文档中插入多个外部J

Ajax请求详解

一.get()和post()基本区别 1.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址.用户看不到这个过程. 2.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据.两种方式的参数都可以用Reques

ajax入门详解

l 一个实例 在开始正式讲解 Ajax之前,首先让我们先来看看Google Map使用Ajax改善其产品设计的效果. 1. 在浏览器地址栏中输入http://maps.google.com打开Google Map的界面. 2. 在页面顶端的搜索框中输入“China”,单击“Search”按钮. 3. 单击地图右上角的“Satellite”按钮,切换到卫星界面. 4. 调整地图左上角的尺寸,方法或者缩小当前区域.可以看到,地图区域的图象根据标尺的位置快速的变换. 5. 按住鼠标左键,拖拽地图,地图

从零开始学 Web 之 Ajax(五)同步异步请求,数据格式

大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:http://www.cnblogs.com/lvonve/ CSDN:https://blog.csdn.net/lvonve/ 在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目.现在就让我们一起进入 Web 前端学习的冒险之旅吧! 一.同步请求与异步

Jquery ajax 参数 详解

Jquery ajax 参数主要如下: url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 delete也可以使用,但仅部分浏览器支持. timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设 置. async:要求为Boolean类型的参数,默认设置为true,所有请求均为异步

jquery中的ajax方法详解

定义和用法ajax() 方法通过 HTTP 请求加载远程数据.该方法是 jQuery 底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等.$.ajax() 返回其创建的 XMLHttpRequest 对象.大多数情况下你无需直接操作该函数,除非你需要操作不常用的选项,以获得更多的灵活性.最简单的情况下,$.ajax() 可以不带任何参数直接使用.注意:所有的选项都可以通过 $.ajaxSetup() 函数来全局设置. 语法 jQuery.ajax([settings])

$.ajax()常用方法详解(推荐)

AJAX 是一种与服务器交换数据的技术,可以在补充在整个页面的情况下更新网页的一部分.接下来通过本文给大家介绍ajax一些常用方法,大家有需要可以一起学习. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持. 3.timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆

JavaEE基础(03):Http请求详解,握手挥手流程简介

本文源码:GitHub·点这里 || GitEE·点这里 一.Http协议简介 1.概念说明 HTTP超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议,基于TCP/IP通信协议来传递数据:HTML文件.图片.查询数据等.HTTP协议基于客户端-服务端架构模式.浏览器作为HTTP客户端通过URL向服务端即WEB服务器发送请求.Web服务器根据接收到的请求后,处理完请求后向客户端发送响应信息. 2.协议特点 简单快速 请求服务器时,只需传送请求方法和路径.请求类型常用GET.PO

跨域请求详解

同源策略 Ajax的一个限制是同源策略(same origin policy),它要求所有请求必须来自同一个域名.子域名,并且地址的端口也应当一致.主要原因是处于安全考虑:因为当一个ajax请示被发送,所有的请求都会附带主域的cookie信息一起发送.也就是说,对于远程服务来讲,请求如果是来自于登陆后的用户,若没有同源策略的限制,攻击者就有可能获取你的Gmail里的邮件.得到你的 Fackbook 状态或者你 Twitter 中的好友,这是一个非常严重的安全性问题. 但是,尽管出于安全问题的考虑