zoukankan      html  css  js  c++  java
  • 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>

    复制代码

  • 相关阅读:
    TFS对签入文件忽略设置,解决pdb弹出警告
    利用MSSQL对不经常使用的表进行依赖缓存
    IIS 使用多个https和通配证书解决方案
    传递参数安全验证代码示例
    利用GetType反射方法再调用方法进行传递参数实现调用
    ms10_002 IE浏览器漏洞
    ms17-010漏洞复现
    ms08-067漏洞复现
    tomcat使用log4j管理日志
    Popen No such file or directory 错误
  • 原文地址:https://www.cnblogs.com/liu-Gray/p/4916531.html
Copyright © 2011-2022 走看看