一.概念

  • 只刷新局部的技术
  • Asynchronous:异步的
  • JavaScript:更新局部网页
  • XML:用于请求数据和响应数据的封装
  • CSS:美化页面样式
  • 异步:发送请求后不等返回结果,由回调函数处理结果
  • XMLHttpRequest对象:发送请求到服务器并获得返回结果(这个是ajax的核心)

二.核心对象XMLHttpRequest的常用方法和属性:

  • 方法:
    • open(method,URL,async(异步的/异步串口))
      • 用来建立与服务器的连接
      • method参数指定请求的HTTP方法,典型的值是GET或POST
      • URL参数指定请求的地址
      • async参数指定是否使用异步请求,值为true或false
    • send(Content)
      • 发送请求,content参数指定请求的参数
    • setRequestHeader(header.value)
      • 设置请求的头信息
  • 属性:
    • onreadystatechange:指定回调函数
    • readystate :XMLHttpRequest的状态信息
    • 就绪状态码:
      • 0:XMLHttpRequest对象还没有初始化
      • 1:XMLHttpRequest对象开始发送请求
      • 2:XMLHttpRequest对象的请求发送完成
      • 3:XMLHttpRequest对象开始读取响应,还没有结束
      • 4:XMLHttpRequest对象读取响应结束
    • 状态码:
      • status:Http的状态码
        • 200:服务器响应正常
        • 400;无法找到请求的资源
        • 403:没有访问权限
        • 404:访问的资源不存在
        • 500:服务器内部错误
        • responseText:获得响应的文本内容
        • responseXML:获得响应的XML的文档对象
        • 只有就绪状态是4且状态码是200,才可以处理服务器数据​​​
    • 由响应对象response创建一个从服务器端到客户端的管道
    • 以前是通过转发或者重定向的方式来响应数据,但在局部刷新当中使通过管道的方式来响应数据,因此,首先创建管道,然后写入数据,再通过flush推进,清空管道内数据,最后关闭管道
    •  
      //由响应对象创建一个从服务器端到客户端的一个管道
              PrintWriter writer = resp.getWriter();
              writer.write(msg);
              //清空管道数据
              writer.flush();
              //关闭
              writer.close();
    •  java在使用流时,都会有一个缓冲区,按一种它认为比较高效的方法来发数据:把要发的数据先放到缓冲区,缓冲区放满以后再一次性发过去,而不是分开一次一次地发.而flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满. ,要养成writer后面写flush的习惯,避免在数据特别小的情况下,另一边读不到数据

三.用户名重名校验代码示例

在JavaScript中使用ajax,代码复杂,原生

  • servlet
package com.pro.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 UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("UTF-8");
        //
        String userName = req.getParameter("userName");

        //
        String msg = "用户已存在!";
        if (!"admin".equals(userName)){
         msg ="可以注册";
        }

        //由响应对象创建一个从服务器端到客户端的一个管道
        PrintWriter writer = resp.getWriter();
        writer.write(msg);
        //清空管道数据
        writer.flush();
        //关闭
        writer.close();
    }
  •  index.jsp
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<script>

    //首先创建核心对象
    var xmlHttp;
    function creatXMLHttpRequest() {
        //表示如果你是IE浏览器
        if (window.ActiveXObject){
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        }else{//非IE浏览器
            xmlHttp = new XMLHttpRequest();
        }

    }

    function f() {
        //调用上面的方法创建一个核心对象
        creatXMLHttpRequest();
        var userName = document.getElementById("userName").value;
        var url = "userServlet?userName="+userName;
        xmlHttp.open("get",url,true);//使用get方式和URL地址建立连接,目的是为了把请求的数据发送过去
        //当readystate的值发生改变时,会调用xx函数,这个xx虽然没有括号,但他也是一个函数,是一个指针
 //第一次经过xmlHttp.onreadystatechange=xx;只是去指定回调函数,并不会把回调函数执行完,
        // 而是去执行完发送请求,当状态码发生改变时,才会去执行之前指定的回调函数
        xmlHttp.onreadystatechange=xx;
        //用这个方法来发送请求数据
        xmlHttp.send();

    }

    //核心对象的readyState发生变化,就会触发这个响应函数
    function xx() {
        //必须状态信息readyState=4且状态码status=200才能获取到数据(谁来获取呢,是获取请求的数据还是响应的数据--->获取到响应的数据)
        if (xmlHttp.readyState == 4){
            if(xmlHttp.status == 200){
                var result = xmlHttp.responseText;
                document.getElementById("info").innerHTML = result;
            }
        }
    }

   /* function userList() {

    }

    function displayUser() {

    }*/
</script>

<!--
    需要局部刷新,首先就应该想到核心对象XMLHttpRequest
-->
<body>

<input type="text" name="userName" id="userName" onblur="f();"><span id="info"></span>
<hr>
<select name="" id="">
    <option value="aaa">aaa</option>
    <option value="bbb">bbb</option>
    <option value="ccc">ccc</option>
</select>

</body>
</html>

  • 在JQuery中使用ajax:代码简单,推荐使用 
  • // 值均写在引号内,单引号和双引号都可以
    $.ajax({
        url: '', 	// 请求的地址,即要给那里发送请求
        data: {		// 请求参数,有多个时以逗号分割
            name: 'zhangsan',
            pwd: '123'
        },
        type: 'get',		// 请求方式,get、post
        dataType: 'text',	// 返回值类型, json、text等
        success: function (res) { // 请求成功执行此方法,res为返回值,名称自定义
            $('#get1').html(res)
        },
        error: function (xhr, errorMessage, e) { //请求异常执行此方法,参数名不建议修改,可以不写这个函数
            alert(errorMessage);
        }
    })
    

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐