什么是Ajax ,异步,同步,JSON,XMLHttpRequest对象,什么是JSON,使用JQuery实现Ajax

Posted 小智RE0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是Ajax ,异步,同步,JSON,XMLHttpRequest对象,什么是JSON,使用JQuery实现Ajax相关的知识,希望对你有一定的参考价值。



什么是Ajax


Ajax即Asynchronous Javascript And XML(异步JavaScript和XML) 2005年被Jesse James Garrett提出的新术语,用来描述一种使用现有技术集合的‘新’方法,包括: html 或 XHTML, CSS, javascript, DOM, XML, XSLT, 以及最重要的XMLHttpRequest。使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。

Ajax实质是利用浏览器提供的对象(XMLHttpRequest) ;异步地向服务器发送请求服务器返回部分数据,浏览器使用这些数据对页面做部分的更新,整个过程页面无刷新,不打断用户的操作。


同步异步概念


同步: 当客户端与服务器交互时,不能进行其他操作,需要等服务器响应数据过来;在这个过程中,客户端的操作会被打断; 而且服务器响应的过来时会刷新数据;

异步:客户端与服务器交互时,客户端还可以进行其他操作,客户端使用的是XMLHttpRequest对象与服务器交互的,那么服务器在响应时也是通过这个对象将提示信息返回,将信息更新到页面,页面不刷新.

例如,用户正在填写某个注册的表单,信息已经全部填写了,但是点击注册后,由于数据库中已存在了这个账户名,返回给用户信息提示时,用户之前填写的所有数据都被刷新清除了.
这要是用异步交互,那么用户填的数据就不会被全部清除了.


同步异步实例案例

(1)同步:

用户实体类User

public class User {
    //Id
    private int uId;
    //用户名;
    private String account;
    //密码
    private String password;
     //性别
    private String sex;
    //年龄;
    private int age;
    //电话;
    private String mobile;

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
     public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public int getuId() {
        return uId;
    }

    public void setuId(int uId) {
        this.uId = uId;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

数据访问交互层UserDao;
其中用到了自定义的JDBC工具类

public class UserDao {
    //连接对象connection;
    Connection connection = null;
    //执行查询语句的PreparedStatement;
    PreparedStatement pst = null;
    //查询的结果集;
    ResultSet resultSet = null;

    /**
     * 根据管理员账号查询管理员;
     */
    public User findAdminByAccount(String account)throws SQLException{
        User user=null;
        try{
            //加载数据库驱动;
            connection=JdbcUtils.getConnection();
            //定义SQL语句
            String sql="select Id,account from tb_admin where account=? ";
            //预编译;
            pst=connection.prepareStatement(sql);
            //向占位符 ? 赋值;
            pst.setString(1,account);
            //获取结果集;
            resultSet= pst.executeQuery();
            while (resultSet.next()){
                user=new User();
                user.setuId(resultSet.getInt("Id"));
                user.setAccount(resultSet.getString("account"));
            }
        }finally {
            //关闭资源;
            JdbcUtils.closeSource(connection,pst,resultSet);
        }
        return user;
    }
 }

Jdbc工具类

public class JdbcUtils {

    static {
        try {
            //在Web项目中仅加载一次驱动;
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //关闭资源的方法;
    public static void closeSource(Connection connection, PreparedStatement ps, ResultSet resultSet) throws SQLException {
        //若不为空就关闭资源;
        if (connection != null) {
            connection.close();
        }
        if (ps != null) {
            ps.close();
        }
        if (resultSet != null) {
            resultSet.close();
        }
    }
}

用到的Ajax01Servlet类;用于数据的获取,验证,以及跳转页面.

//使用反射;
@WebServlet(name = "byAjax01",urlPatterns = "/byAjax01")
public class Ajax01Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取到账号信息;
        try {
            String account = req.getParameter("account");

            //新建数据交互层对象;
            UserDao userDao=new UserDao();
            //根据账号密码--查询到管理员;
            User adminByAccount = userDao.findAdminByAccount(account);
            //判断是否与数据库中的用户相同;
            if (adminByAccount==null) {
                //账号唯一,提示;
               req.setAttribute("errorMsg","☺,账号唯一,可注册.");
            } else {
                //若不是数据库中的账号,给出提示;
                req.setAttribute("errorMsg", "该账号已被注册");
            }
            //将页面请求转发到原来的页面.jsp;
            req.getRequestDispatcher("ajax/studyAjax01.jsp").forward(req,resp);
        }catch (Exception e){
            e.printStackTrace();
            //若异常,则跳转到预先设置的异常页面;
            resp.sendRedirect("404.jsp");
        }
    }
}

显示页面jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript">
        function getAcc(account){
            //账号失去焦点时就把其中的账号数据返回到servlet层.
            location.assign("${pageContext.request.contextPath}/byAjax01?account="+account);
        }
    </script>
</head>
<body>
性别:<input type="radio" name="sex" value="男"><input type="radio" name="sex" value="女"><br/>
电话:<input type="text" name="mobile" ><br/>
<%--onblur:标签失去焦点时触发;--%>
账号:<input type="text" name="account" onblur="getAcc(this.value)">
<%--errorMsg,验证消息后返回的信息--%>
${errorMsg}<br/>
密码:<input type="password" name="password"><br/>
</body>
</html>

在启动服务器后,输入账号,鼠标离开账号框,数据就和数据库中的账号数据进行验证,弹出提示消息,但是页面已经被刷新,前面填的数据已经没了.响应过来整个页面


(2)异步

用到的Ajax02servlet类

//使用反射;
@WebServlet(name = "byAjax02",urlPatterns = "/byAjax02")
public class Ajax02Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取到账号信息;
        try {
            String account = req.getParameter("account");

            //新建数据交互层对象;
            UserDao userDao=new UserDao();
            //根据账号密码--查询到管理员;
            User adminByAccount = userDao.findAdminByAccount(account);
            
            //设置响应的内容以及编码方式;
            resp.setContentType("text/html;charset=UTF-8");
            //使用流的方式返回信息;
            PrintWriter out= resp.getWriter();
            //判断是否与数据库中的用户相同;
            if (adminByAccount==null) {
                //账号唯一,提示;
                out.print("☺,账号唯一,可注册.");
            } else {
                //若不是数据库中的账号,给出提示;
                out.print("该账号已被注册");
            }
        }catch (Exception e){
            e.printStackTrace();
            //若异常,则跳转到预先设置的异常页面;
            resp.sendRedirect("404.jsp");
        }
    }
}

显示的jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript">
        function getAcc(account){
            //新建XMlHttpRequest对象;
            var httpRes=new XMLHttpRequest();
            //建立与服务器的连接;
            // open方法:有三个参数;第一个参数是请求方式method;get或者post请求;
            //第二个参数是请求地址url ;第三个参数是async;决定是否使用异步参数;(true/false)
            httpRes.open("get","${pageContext.request.contextPath}/byAjax02?account="+account,true);
            //发送请求;
            httpRes.send();
            //获取响应过来的数据信息;
            //onreadystatechange:指定回调函数
            httpRes.onreadystatechange=function (){
                //readyState: XMLHttpRequest的状态信息;就绪状态码有5个;
                //readyState为4:表示读取响应结束;
                //status:HTTP的状态码;这里判断为200是正常状态码;
                if(httpRes.readyState==4 && httpRes.status==200){
                    //responseText:获得响应的文本内容;
                    document.getElementById("errorMsgId").innerHTML=httpRes.responseText;
                }
            }
        }
    </script>
</head>
<body>
<%--onblur:标签失去焦点时触发; 将输入框中填入的值--%>
性别:<input type="radio" name="sex" value="男"><input type="radio" name="sex" value="女"><br/>
电话:<input type="text" name="mobile" ><br/>
账号:<input type="text" name="account" onblur="getAcc(this.value)"><span id="errorMsgId"></span>
<br/>
密码:<input type="password" name="password"><br/>
</body>
</html>

启动服务器;账号数据验证后,并未刷新清除前面的数据;仅响应提示信息


XMLHttpRequest对象


通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL,获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。

常用方法

open(method,URL,async)
该方法用来建立与服务器的连接;
第一个参数method:请求方式;为GET/POST;
第二个参数URL:指定请求的地址;
第三个参数async:指定是否使用异步请求;为布尔值(true/false)

send(content)
用来发送请求的方法;
content:指定请求参数;

setRequestHeader(header,value)
设置请求的头信息

在返回服务器响应的数据信息时,需要触发回调函数onreadystatechange;


常用属性

使用responseText获取响应的文本内容

可根据需要使用就绪状态码进行判断.
readyState: XMLHttpRequest的状态信息 ;就绪状态码.

就绪状态码注释
0XMLHttpRequest对象未完成初始化
1XMLHttpRequest对象开始发送请求
2XMLHttpRequest对象请求发送完成
3XMLHttpRequest对象开始读取响应,没有结束
4XMLHttpRequest对象读取响应结束

还可以根据HTTP状态码status进行判断

常用状态码说明
200服务器响应正常
400无法找到请求资源
403无权限访问
404访问资源不存在
500服务器错误

使用Ajax时,GET与POST请求方式的区别


  • Get方式提交时,建立连接后,仅需要发送请求即可;

例如:
XMLHttpRequest对象.open(“GET”,“Servlet?name=”+数据信息,true);
XMLHttpRequest对象.send(null);

  • Post方式提交时,建立连接后,需要设置http的请求头,然后才发送请求.

例如:
XMLHttpRequest对象.open(“POST”,“Servlet”,true);
设置请求头时,内容提交方式为表单的默认提交方式.
XMLHttpRequest对象.setRequestHeader(“Content-Type”,“application/x-www-form-urlencoded”);
XMLHttpRequest对象.send(“name=”+数据信息);

这里设置请求头时的值:“application/x-www-form-urlencoded”;
这是enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码;默认的表单数据会编码为 “application/x-www-form-urlencoded”。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)

在上面同步异步案例中,已使用get请求方式;
现在试试post方式. ;注意servlet那边是doPost方法接收.

<%--异步    使用POST方式提交  ;注意servlet端--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript">
        function getAcc(account){
            //新建XMlHttpRequest对象;
            var httpRes=new XMLHttpRequest();
            //建立与服务器的连接;
            // open方法:有三个参数;第一个参数是请求方式method;get或者post请求;
            //第二个参数是请求地址url ;第三个参数是async;决定是否使用异步参数;(true/false)
            httpRes.open("POST","${pageContext.request.contextPath}/byAjax03",true);

            //设置请求头;
            httpRes.setRequestHeader("content-Type","application/x-www-form-urlencoded");
            //发送请求;
            httpRes.send("account="+account);
            //获取响应过来的数据信息;
            //onreadystatechange:指定回调函数
            httpRes.onreadystatechange=function (){
                //readyState: XMLHttpRequest的状态信息;就绪状态码有5个;
                //readyState为4:表示读取响应结束;
                //status:HTTP的状态码;这里判断为200是正常状态码;
                if(httpRes.readyState==4 && httpRes.status==200){
                    //responseText:获得响应的文本内容;
                    document.getElementById("errorMsgId").innerHTML=httpRes.responseText;
                }
            }
        }
    </script>
</head>
<body>
<%--onblur:标签失去焦点时触发; 将输入框中填入的值--%>
性别:<input type="radio" name="sex" value="男"><input type="radio" name="sex" value="女"><br/>
电话:<input type="text" name="mobile" ><br/>
账号:<input type="text" name="account" onblur="getAcc(this.value)"><span id="errorMsgId"></span>
<br/>
密码:<input type="password" name="password"><br/>
</body>
</html>

启动服务器,URL并未出现参数.


在java对象中封装了数据;想要传递给Ajax这边;
而XMLHttpRequest对象属于JavaScript;
之前上面是传递的文本信息,可以实现;
但是,两种语言需要数据交换;两个不同的对象数据;就得需要一个中间的转换格式;
那么,引入JSON这个概念.


什么是JSON


JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据;

约定大于配置

例如:
[ { 属性 : 值 , 属性 : 值 } , { 属性 : 值 ,属性 : 值 } ]

  • 数据存在键值对中
  • 多个数据使用逗号分隔
  • 大括号保存对象
  • 方括号保存数组


案例:根据Id查询用户信息,且其中将java对象先转为json格式的字符串,然后再把json格式的字符串转为javaScript对象;

  • 用户实体类User省略…
  • 数据访问层userDao;
public class UserDao {
    //连接对象connection;
    Connection connection = null;
    //执行查询语句的PreparedStatement;
    PreparedStatement pst = null;
    //查询的结果集;
    ResultSet resultSet = null;
    /**
     * 根据用户Id查询单个用户;
     */
    public User findUserById(String id) throws SQLException{
        //创建用户对象;
        User user=new User();
        try{
            //加载驱动,获取连接;
            connection=JdbcUtils.getConnection();
            //定义SQL语句;
            String sql="SELECT * " +
                    "FROM tb_admin " +
                    "WHERE id=?";
            //预编译;
            pst=connection.prepareStatement(sql);
            //为占位符赋值;
            pst.setString(1,id);
            //获取结果集;
            resultSet=pst.executeQuery()以上是关于什么是Ajax ,异步,同步,JSON,XMLHttpRequest对象,什么是JSON,使用JQuery实现Ajax的主要内容,如果未能解决你的问题,请参考以下文章

JAVA学习日志——Ajax和Json

跟随我在oracle学习php(34)

AJAX中的同步加载与异步加载

Ajax与jQueryjson

Ajax json 数据格式

Ajax json 数据格式