zoukankan      html  css  js  c++  java
  • AJAX

    AJAX初探,XMLHttpRequest介绍

    AJAX(只需要页面的一部分进行刷新,整个页面不用刷新)

         AJAX = Asynchronous JavaScript and XML. 异步的JavaScript和XML.
         AJAX是一种在不需要重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术.
         之前传统的网页如果需要更新内容,必须重新加载整个页面.
     
         AJAX基于已有标准,已被使用多年. 2005年的Google Suggest使其流行起来,当你输入关键字时,会返回搜索建议的列表.
         优点:更快,给用户的体验更好,减少了传输的流量.
         举例:
         在百度,Google的搜索框输入文字时,可以看到已经发送出请求,所以有搜索建议列表;
         百度地图,在拖动地图的时候,也可以看到它在不断地发出请求,页面内容在发生改变,但是整个页面并没有被刷新.
     

    AJAX中的重要对象:XMLHttpRequest

         这个对象是微软最先在ie里面提供的,使用的是ActiveX对象(IE5和IE6):
         variable=new ActiveXObject("Microsoft.XMLHTTP");
      现在,所有的现代浏览器(IE7+,Firefox,Chrome,Safari 以及 Opera)均内建XMLHttpRequest对象:
         variable=new XMLHttpRequest();
         为了应对所有的现代浏览器,包括 IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest 对象.
         如果支持,则创建 XMLHttpRequest 对象.如果不支持,则创建 ActiveXObject:
    复制代码
    var xmlHttpRequest;
    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 {
        // code for IE6, IE5
        xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
    }
    复制代码
         也可以先判断IE6,5的情况:         
    if (window.ActiveXObject) {
        //code for IE6, IE5
    }
    else {
        //code for others
    }
     

    使用AJAX跟服务器端通信

         1.准备阶段:使用Ajax准备向服务器端发送请求
         
    xmlHttpRequest.open("GET", "AjaxServlet", true);

         open方法的原型是:XMLHttpRequest.prototype.open = function(method,url,async,user,password) {};

         我们这里只指定了三个参数:方法,路径和发送异步请求为true,同步为flase.
     
         2.关联好回调函数:
         当状态改变的时候,进入处理器,这里是一个回调方法(当返回响应的时候,自动调用。类似于监听器):
    xmlHttpRequest.onreadystatechange = ajaxCallback;

      状态分为多种,被数字标识.参见: http://www.w3school.com.cn/ajax/ajax_xmlhttprequest_onreadystatechange.asp

      readyState存有 XMLHttpRequest 的状态,从 0 到 4 发生变化:
    0: 请求未初始化
    1: 服务器连接已建立
    2: 请求已接收
    3: 请求处理中
    4: 请求已完成,且响应已就绪
         3.真正地向服务器端发送数据:
         
    xmlHttpRequest.send();
         这里使用GET方法,可以不传入参数,或者写send(null),发送POST请求时,需要在这里传入参数.
     
         4.处理回调: 
    复制代码
    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;
        }
    }
    复制代码

      先判断readyState再判断响应的返回值为4,表示请求已完成,status返回200表示响应的返回值为200,即HTTP请求成功.

         这里将服务器返回的内容设置入div节点,显示出来.
     
     

    完整代码

    服务器端程序:
    复制代码
    package com.mengdd.servlets;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    
    public class HelloAjaxServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("doGet invoked!");
            PrintWriter out = response.getWriter();
            out.println("Hello World");
            out.flush();
        }
    }
    复制代码
     
    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) {
    
                    //1. prepare request
                    xmlHttpRequest.open("GET", "AjaxServlet", true);
                    // 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();//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();">
    
    <div id="div1"></div>
    </body>
    </html>
    复制代码
    web.xml:
    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
        <servlet>
            <servlet-name>HelloAjaxServlet</servlet-name>
            <servlet-class>com.mengdd.servlets.HelloAjaxServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>HelloAjaxServlet</servlet-name>
            <url-pattern>/AjaxServlet</url-pattern>
        </servlet-mapping>
    </web-app>
    复制代码
     

     

    参考资料:

      圣思园张龙老师JavaWeb视频教程63: AJAX深度剖析,XMLHttpRequest对象大揭秘.

  • 相关阅读:
    (1)一步一步开发一个简单二维CAD之基本框架
    weekly review 200844: Lazy
    《理解专业程序员》读书笔记
    weekly review 200843: House M.D.
    weekly review 200846: table tennis
    weekly review 200845: Work Hard Not Enough
    Change Your Mind and Your Life Will Follow
    weekly review 200847: tdd
    爱心·王搏计划“走出地震”影展需要志愿者(11月24日——11月26日)
    read_notes
  • 原文地址:https://www.cnblogs.com/liu-Gray/p/4912200.html
Copyright © 2011-2022 走看看