Ajax异步数据交互----(JavaScript原生版和jQuery封装版)

  Ajax(Asynchronous JavaScript and XML)不是一门独立的技术,它是由HTML、JavaScript、CSS和DOM等技术组成。javascript

  传统的Web应用容许用户填写表单,当提交表单时就向服务器发送一个请求,服务器接收并处理用户提交过来的表单数据,并返回一个新的网页给用户,这样的作法会浪费许多带宽,因为每次的应用交互都要向服务器发送请求,应用的响应时间依赖于服务器的响应时间,致使了用户界面的响应时间慢,给予用户不佳的体验。html

  Ajax颇有用的地方就在于不刷新页面而且访问数据库处理数据(如在注册情景下,检测用户名是否已经存在,并返回结果的过程),并按照数据的处理结果按你想要的方式对界面作出即时的更改。整体上,使用Ajax具备以下优点:前端

  1. 减轻客户端的内存消耗。
  2. 无刷新更新页面,给用户一种连续的体验。
  3. 将传统的服务器工做转嫁到客户端,从而减轻服务器和带宽的负担,节约空间和带宽的租用成本。
  4. 基于标准化技术。

  使用 JavaScript 向服务器提出请求并处理响应而不阻塞用户!核心对象XMLHTTPRequest。经过这个对象,您的 JavaScript 可在不重载页面的状况与 Web 服务器交换数据,即在不须要刷新页面的状况下,就能够产生局部刷新的效果,理念为“按需取数据”。java

 

JS版本的Ajax使用jquery

  在JS中使用XMLHTTPRequest对象时须要注意不一样浏览器之间对它的实现,在IE中把XMLHTTPRequest实现为ActiveX控件对象,二其余浏览器把它实现为一个本地的javascript对象。因此建立时为了兼容需在代码中添加判断逻辑建立相应的服务器所需的XMLHTTPRequest对象,下表是它的方法。ajax

方    法 描    述
abort() 中止当前请求 
getAllResponseHeaders() 把HTTP请求的全部响应首部做为键/值对返回
getResponseHeader("header") 返回指定首部的串值
open("method","URL",[asyncFlag],["userName"],["password"])  创建对服务器的调用。method参数能够是GET、POST或PUT。url参数能够是相对URL或绝对URL。这个方法还包括3个可选的参数,是否异步,用户名,密码
send(content) 向服务器发送请求
setRequestHeader("header", "value") 把指定首部设置为所提供的值。在设置任何首部以前必须先调用open()。设置header并和请求一块儿发送 ('post'方法必定要 )

 

 

 

 

 

 

 

 

注意:open()方法中三个参数分别为发送数据的方式(get/post)、发送数据的目标URL、是否异步发送(true/false;若是不填默认为true,异步发送)。sql

  get和post发送数据方式的区别:get方式发送数据,在第二个参数URL后面追加?xxx=xxx(键值对结构发送),若是多个数据则以&链接,便是?xxx=xxx&yyy=yyy数据库

                post方式发送数据,需在open()方法以后和send()方法以前设置请求的响应头xmlHTTP.setRequestHeader("Content-type","application/x-www-form-urlencoded"),而且在send()方法中以键值对的形式发送数据,如send("username="+username);json

 

五步使用法:后端

  1.建立XMLHTTPRequest对象

 

  2.使用open方法设置和服务器的交互信息

 

  3.设置发送的数据,开始和服务器端交互

 

  4.注册事件

 

  5.更新界面

 

 


 

  下面用一个小案例实现Ajax的数据交互:

    需求:在用户输入完用户名后返回用户名是否存在,显示在输入框旁。

    

    

 

    实现:1.页面显示只须要一个输入框和span来显示用户名在数据库中的状态,以post方式进行ajax的数据交互

      2.页面的js代码部分须要建立Ajax进行异步通讯的核心对象XMLHTTPRequest对象、获取用户输入的用户名、将用户名以Ajax以GET/POST的方式发送给指定的URL(负责逻辑判断的servlet部分)、对XMLHTTPRequest对象的进行监听readyStatestatus,若是readyState==4而且status==200那么表示服务器响应成功,依据服务器返回的数据对前端页面进行更改或者提示,个人这个案例就是在span中提示用户名的状态

      3.后端servlet部分是负责接收前台发送过来的数据,使用C3P0数据源链接池和DBUtils对数据库进行链接和查询用户名,并返回JavaBean实体类,即时User类,若是不为null表示数据库中已经存在,不能使用,response.getWriter().write("0"),往前端返回0,前端根据返回值进行span提示;反之可使用,response.getWriter().write("1")

   


  

  代码部分:

     index.jsp(页面显示部分):

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>用户注册</title>
    <script>

          //全局变量声明XMLHTTPRequsert对象,方便各方法使用
          var xmlHTTP;

          //建立XMLHTTPRequest对象
          function createXMLHTTPRequest() {
              if(window.ActiveXObject){
                  //IE五、6对XMLHTTPRequest的实现
                  xmlHTTP=new ActiveXObject("Microsoft.XMLHTTP");
              }else{
                  // IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
                  xmlHTTP=new XMLHttpRequest();
              }
          }

          //获取用户输入的用户名
          function checkName() {
              var name=document.getElementById("username");
              if(name.value.length==0){
                alert("请输入用户名");
              }else{
                  doAjax(name.value);
              }
          }

          //进行Ajax操做,将用户名异步发送到服务器
          function doAjax(username) {
              //建立XMLHTTPRequest对象
              createXMLHTTPRequest();
              //创建链接(方式、URL、是否异步)
              xmlHTTP.open("post","AcceptAjax",true);
              //POST传送数据到后台服务器,须要设置请求头,这是与GET不一样的地方
              xmlHTTP.setRequestHeader("Content-type","application/x-www-form-urlencoded");
              //对该对象进行监听
              xmlHTTP.onreadystatechange=function () {
                  //对readyState和status进行判断,若是响应成功则获取后台返回的数据
                  if(xmlHTTP.readyState==4&&xmlHTTP.status==200){
                      //获取响应数据
                      var value=xmlHTTP.responseText;
                      var messageshow=document.getElementById("messageshow");
                      if(value=="0"){
                         messageshow.style.color="red";
                         messageshow.innerText="用户名存在";
                      }else{
                          messageshow.style.color="green";
                          messageshow.innerText="用户名可用";
                      }

                  }
              }
              //post方式在send中以键值对的方式发送数据,后台则以getParameter()方法获取用户发送过去的数据
              xmlHTTP.send("username="+username);
      }
    </script>
  </head>
  <body>
  <form action="" method="post">
    用户名:<input type="text" name="username" id="username" onblur="checkName()">
    <span id="messageshow"></span>
  </form>
  </body>
</html>

 

 

  AcceptAjax(servlet逻辑判断部分):

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应的类型和编码格式
        resp.setContentType("html/text;charset=UTF-8");
        //获取前台发来的数据
        String username = req.getParameter("username");
        //获取C3P0数据源链接池中的数据源
        DataSource dataSource=new ComboPooledDataSource();
        //用DBUtils工具类对数据库进行查找操做
        QueryRunner qr=new QueryRunner(dataSource);
        //查找用户输入的用户名在数据库中是否存在,sql查询语句返回一个User对象,若是存在即不为空,给前台返回"0"反之不存在返回"1"
        try {
            //new BeanHandler<>(User.class)以反射为基础new对象,设定返回对象的类
            User query = qr.query("select * from user where username=?", new BeanHandler<>(User.class), username);
            if(query!=null){
                resp.getWriter().write("0");
            }else{
                resp.getWriter().write("1");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            return;
        }

    }

 

 

  User(JavaBean实体类)

public class User {

    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

 

 

简单数据库部分(MYSQL):

  

2018.01.31  记

 


 

补充:

  XMLHttpRequest 对象的三个重要的属性:
属性
描述
onreadystatechange
存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
readyState
存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
0:请求未初始化(尚未调用 open())。
1:请求已经创建,可是尚未发送(尚未调用 send())。
2:请求已发送,正在处理中(一般如今能够从响应中获取内容头)。
3:请求在处理中;一般响应中已有部分数据可用了,可是服务器尚未完成响应的生成。
4:响应已完成;您能够获取并使用服务器的响应了。
status
200: "OK"
404: 未找到页面
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
status状态码大全:
100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本
200——交易成功
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不肯定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求
300——请求的资源可在多处获得
301——删除请求数据
302——在其余地址发现了请求数据
303——建议客户访问其余URL或访问方式
304——客户端已经执行了GET,但文件未变化
305——请求的资源必须从服务器指定的地址获得
306——前一版本HTTP中使用的代码,现行版本中再也不使用
307——申明请求的资源临时性删除
400——错误请求,如语法错误
401——请求受权失败
402——保留有效ChargeTo头响应
403——请求不容许
404——没有发现文件、查询或URl
405——用户在Request-Line字段定义的方法不容许
406——根据用户发送的Accept拖,请求资源不可访问
407——相似401,用户必须首先在代理服务器上获得受权
408——客户端没有在用户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上再也不有此资源且无进一步的参考地址
411——服务器拒绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器容许的大小
414——请求的资源URL长于服务器容许的长度
415——请求资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417——服务器不知足请求Expect头字段指定的指望值,若是是代理服务器,多是下一级服务器不能知足请求
500——服务器产生内部错误
501——服务器不支持请求的函数
502——服务器暂时不可用,有时是为了防止发生系统过载
503——服务器过载或暂停维修
504——关口过载,服务器使用另外一个关口或服务来响应用户,等待时间设定值较长
505——服务器不支持或拒绝支请求头中指定的HTTP版本
总结: 
  1xx:信息响应类,表示接收到请求而且继续处理
  2xx:处理成功响应类,表示动做被成功接收、理解和接受
  3xx:重定向响应类,为了完成指定的动做,必须接受进一步处理
  4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
  5xx:服务端错误,服务器不能正确执行一个正确的请求

 


 

 JQuery版本的Ajax使用

   JQuery的Ajax操做,对JavaScript底层Ajax操做进行了封装,提供了两种方法进行操做,能够用IDEA的模板工具作成模板,智能提示快捷使用。

   特别地,------>jQuery有一个吸引人的功能就是它所提供的Ajax支持,提供了大量的工具方法:

    jQuery.param(obj):将obj参数转换为查询字符串。

    serialize():将该jQuery对象包含的表单或表单控件转换为查询字符串,如username=alice&age=20的格式,极大地方便了咱们进行数据发送。

    serializeArray():序列化表单元素(相似 .serialize() 方法),返回 JSON 数据结构数据,返回的 JSON 对象是由一个对象数组组成的。

    

  对于json,有个快捷的工具类Gson的toJson(object o)方法能够将java的对象转换为json返回前端,截取片断。

  User转换为json:

        Gson gson=new Gson();
        String s = gson.toJson(user);
        resp.getWriter().write(s);    

 

 


  第一种是底层的$.ajax()操做(参数为经常使用的几种,后有详细参数大全和回调函数):

 

 
 $.ajax({  
                url:"url",  //指定的URL
                type:"get",  //发送的方式
                dataType:"json",  //发送的数据类型,json能够将javascript对象中表示的一组数据转换为字符串,格式为{"xxx":"yyy"}形式出现
                data:{  
                    userID:"1"  //发送的json数据
                },  
                success:function(response){  //Ajax响应成功的回调函数
      
                },  
                error:function() {  //指定服务器响应出错的回调函数
                }  
            }); 
 

 

 

 

  第二种是快捷操做$.get()..$.post()...:

 

$.get(  
            "url",  
            {userID:"123"},  
            function(response) {  
            }  
        ) 

 

 

 $.post(  
             "url",  
             {userID:"123"},  
             function(response) {  
      
             }  
        )  

 

 

 

 


 

补充:

$ajax()中的参数大全:

 

options

类型:Object

可选。AJAX 请求设置。全部选项都是可选的。

async

类型:Boolean

默认值: true。默认设置下,全部请求均为异步请求。若是须要发送同步请求,请将此选项设置为 false。

注意,同步请求将锁住浏览器,用户其它操做必须等待请求完成才能够执行。

beforeSend(XHR)

类型:Function

发送请求前可修改 XMLHttpRequest 对象的函数,如添加自定义 HTTP 头。

XMLHttpRequest 对象是惟一的参数。

这是一个 Ajax 事件。若是返回 false 能够取消本次 ajax 请求。

cache

类型:Boolean

默认值: true,dataType 为 script 和 jsonp 时默认为 false。设置为 false 将不缓存此页面。

jQuery 1.2 新功能。

complete(XHR, TS)

类型:Function

请求完成后回调函数 (请求成功或失败以后均调用)。

参数: XMLHttpRequest 对象和一个描述请求类型的字符串。

这是一个 Ajax 事件。

contentType

类型:String

默认值: "application/x-www-form-urlencoded"。发送信息至服务器时内容编码类型。

默认值适合大多数状况。若是你明确地传递了一个 content-type 给 $.ajax() 那么它一定会发送给服务器(即便没有数据要发送)。

context

类型:Object

这个对象用于设置 Ajax 相关回调函数的上下文。也就是说,让回调函数内 this 指向这个对象(若是不设定这个参数,那么 this 就指向调用本次 AJAX 请求时传递的 options 参数)。好比指定一个 DOM 元素做为 context 参数,这样就设置了 success 回调函数的上下文为这个 DOM 元素。

就像这样:

$.ajax({ url: "test.html", context: document.body, success: function(){
        $(this).addClass("done");
      }});
data

类型:String

发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。若是为数组,jQuery 将自动为不一样值对应同一个名称。如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。

dataFilter

类型:Function

给 Ajax 返回的原始数据的进行预处理的函数。提供 data 和 type 两个参数:data 是 Ajax 返回的原始数据,type 是调用 jQuery.ajax 时提供的 dataType 参数。函数返回的值将由 jQuery 进一步处理。

dataType

类型:String

预期服务器返回的数据类型。若是不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,好比 XML MIME 类型就被识别为 XML。在 1.4 中,JSON 就会生成一个 JavaScript 对象,而 script 则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。可用值:

  • "xml": 返回 XML 文档,可用 jQuery 处理。
  • "html": 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行。
  • "script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 "cache" 参数。注意:在远程请求时(不在同一个域下),全部 POST 请求都将转为 GET 请求。(由于将使用 DOM 的 script标签来加载)
  • "json": 返回 JSON 数据 。
  • "jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
  • "text": 返回纯文本字符串
error

类型:Function

默认值: 自动判断 (xml 或 html)。请求失败时调用此函数。

有如下三个参数:XMLHttpRequest 对象、错误信息、(可选)捕获的异常对象。

若是发生了错误,错误信息(第二个参数)除了获得 null 以外,还多是 "timeout", "error", "notmodified" 和 "parsererror"。

这是一个 Ajax 事件。

global

类型:Boolean

是否触发全局 AJAX 事件。默认值: true。设置为 false 将不会触发全局 AJAX 事件,如 ajaxStart 或 ajaxStop 可用于控制不一样的 Ajax 事件。

ifModified

类型:Boolean

仅在服务器数据改变时获取新数据。默认值: false。使用 HTTP 包 Last-Modified 头信息判断。在 jQuery 1.4 中,它也会检查服务器指定的 'etag' 来肯定数据没有被修改过。

jsonp

类型:String

在一个 jsonp 请求中重写回调函数的名字。这个值用来替代在 "callback=?" 这种 GET 或 POST 请求中 URL 参数里的 "callback" 部分,好比 {jsonp:'onJsonPLoad'} 会致使将 "onJsonPLoad=?" 传给服务器。

jsonpCallback

类型:String

为 jsonp 请求指定一个回调函数名。这个值将用来取代 jQuery 自动生成的随机函数名。这主要用来让 jQuery 生成度独特的函数名,这样管理请求更容易,也能方便地提供回调函数和错误处理。你也能够在想让浏览器缓存 GET 请求的时候,指定这个回调函数名。

password

类型:String

用于响应 HTTP 访问认证请求的密码

processData

类型:Boolean

默认值: true。默认状况下,经过data选项传递进来的数据,若是是一个对象(技术上讲只要不是字符串),都会处理转化成一个查询字符串,以配合默认内容类型 "application/x-www-form-urlencoded"。若是要发送 DOM 树信息或其它不但愿转换的信息,请设置为 false。

scriptCharset

类型:String

只有当请求时 dataType 为 "jsonp" 或 "script",而且 type 是 "GET" 才会用于强制修改 charset。一般只在本地和远程的内容编码不一样时使用。

success

类型:Function

请求成功后的回调函数。

参数:由服务器返回,并根据 dataType 参数进行处理后的数据;描述状态的字符串。

这是一个 Ajax 事件。

traditional

类型:Boolean

若是你想要用传统的方式来序列化数据,那么就设置为 true。请参考工具分类下面的 jQuery.param 方法。

timeout

类型:Number

设置请求超时时间(毫秒)。此设置将覆盖全局设置。

type

类型:String

默认值: "GET")。请求方式 ("POST" 或 "GET"), 默认为 "GET"。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可使用,但仅部分浏览器支持。

url

类型:String

默认值: 当前页地址。发送请求的地址。

username

类型:String

用于响应 HTTP 访问认证请求的用户名。

xhr

类型:Function

须要返回一个 XMLHttpRequest 对象。默认在 IE 下是 ActiveXObject 而其余状况下是 XMLHttpRequest 。用于重写或者提供一个加强的 XMLHttpRequest 对象。这个参数在 jQuery 1.3 之前不可用。

 

 

回调函数

 

若是要处理 $.ajax() 获得的数据,则须要使用回调函数:beforeSend、error、dataFilter、success、complete。

beforeSend

在发送请求以前调用,而且传入一个 XMLHttpRequest 做为参数。

error

在请求出错时调用。传入 XMLHttpRequest 对象,描述错误类型的字符串以及一个异常对象(若是有的话)

dataFilter

在请求成功以后调用。传入返回的数据以及 "dataType" 参数的值。而且必须返回新的数据(多是处理过的)传递给 success 回调函数。

success

当请求以后调用。传入返回后的数据,以及包含成功代码的字符串。

complete

当请求完成以后调用这个函数,不管成功或失败。传入 XMLHttpRequest 对象,以及一个包含成功或错误代码的字符串。

相关文章
相关标签/搜索