AJAX+JSON转换处理+搜索框联想Demo

AJAX

一、概述

概念:Asynchronous JavaScript And XML 异步的JavaScript和XML

  • 本身不是一种新技术,而是多个技术综合。用于快速创建动态网页的技术。

  • 一般的网页如果需要更新内容,必需重新加载个页面。

  • 而 AJAX 通过浏览器与服务器进行少量数据交换,就可以使网页实现异步更新。也就是在不重新加载整个页

    面的情况下,对网页的部分内容进行局部更新。

同步和异步的区别

  • 同步方式:正常情况下,浏览器与服务器之间是串行操作,类似于一个Java线程的操作。

  • 异步方式:浏览器与服务器是并行操作,类似于Java中多个线路同时工作。

ajax使用的技术
  1. JavaScript:用于后台发送数据给服务器,并且对服务器返回的结果进行处理
  2. XML:用于接收服务器返回的数据,但是已经被JSON格式代替。

二、原生JavaScript实现AJAX

流程说明:

  1. 用户在浏览器端由JS创建一个对象XMLHttpRequest对象
  2. 这个对象是ajax的核心对象,由它发送请求给服务器
  3. 将请求的数据发送到服务器
  4. 在服务器处理数据,从数据库中查询用户是否存在,通过XML(JSON)把数据返回
  5. 在回调函数中得到服务器返回的数据,使用HTML和CSS更新页面的信息
  • 核心对象:XMLHttpRequest

​ 用于在后台与服务器交换数据。可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

  • 打开链接:open(method,url,async)

​ method:请求的类型 GET 或 POST。

​ url:请求资源的路径。

​ async:true(异步) 或 false(同步)。

  • 发送请求:send(String params)

    ​ params:请求的参数(POST 专用)。

  • 处理响应:onreadystatechange

    ​ readyState:0-请求未初始化,1-服务器连接已建立,2-请求已接收,3-请求处理中,4-请求已完成,且 响应已就绪。

    ​ status:200-响应已全部 OK。

  • 获得响应数据形式

    ​ responseText:获得字符串形式的响应数据。

    ​ responseXML:获得 XML 形式的响应数据。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户是否存在</title>
</head>
<body>
用户名:<input type="text" id="user"> <span id="info"></span>
<script type="text/javascript">
    /*用户注册时输入一个用户名,失去焦点以后,通过ajax后台判断用户名是否存在。
    服务器先不访问数据库,直接判断用户名,如果用户名为newboy,则表示用户已经存在,否则用户名可以注册使用。 */

    //用户名的改变事件
    document.getElementById("user").onchange = function () {
        //创建XMLHttpRequest对象
        let request = new XMLHttpRequest();
        //打开服务器的连接,参数:GET或POST,服务器地址,true
        request.open("GET", "json/users.json", true);
        //发送请求给服务器
        request.send();
        //设置回调函数,准备状态发生改变时激活这个函数
        request.onreadystatechange = function () {
            //准备状态等于4,服务器状态码等于200
            if (request.readyState == 4 && request.status == 200) {
                //接收服务器返回的数据
                let text = request.responseText;  //字符串
                //将字符串转成JSON
                let users = JSON.parse(text);  //所有用户的数组
                //得到用户在文本框中输入的数据
                let user = document.getElementById("user").value;
                //设置标记
                let exists = false;
                //遍历服务器返回的数组
                for (let u of users) {
                    if (u == user) {  //当前元素等于输入的用户名
                        exists = true;  //修改标记
                        break;
                    }
                }
                //判断标记
                if (exists) {  //用户名已经存在
                    document.getElementById("info").innerText = "用户名已经存在";
                }
                else {  //不存在
                    document.getElementById("info").innerText = "恭喜,可以注册";
                }
            }
        }
    }
</script>
</body>
</html>

三、jQuery实现ajax

jQuery 的 GET 方式实现 AJAX

​ 核心语法:$.get(url,[data],[callback],[type]);
​ url:请求的资源路径。
​ data:发送给服务器端的请求参数,格式可以是key=value,也可以是 js 对象。
​ callback:当请求成功后的回调函数,可以在函数中编写我们的逻辑代码。
​ type:预期的返回数据的类型,取值可以是 xml, html, js, json, text等。

jQuery 的 POST 方式实现 AJAX

​ 核心语法:$.post(url,[data],[callback],[type]);
​ url:请求的资源路径。
​ data:发送给服务器端的请求参数,格式可以是key=value,也可以是 js 对象。
​ callback:当请求成功后的回调函数,可以在函数中编写我们的逻辑代码。
​ type:预期的返回数据的类型,取值可以是 xml, html, js, json, text等。

区别: 两者的使用方法是一致的,但是本质上的实现方式是不一样的。get是将参数拼接到地址栏上的,post是将请求参数放在请求体中进行发送的。

演示案例(get)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户是否存在</title>
    <script src="js/jquery-3.3.1.js"></script>
</head>
<body>
用户名:<input type="text" id="user"> <span id="info"></span>
<script type="text/javascript">
    /*
    用户注册时输入一个用户名,失去焦点以后,通过ajax后台判断用户名是否存在。
    服务器先不访问数据库,直接判断用户名,如果用户名为newboy,则表示用户已经存在,否则用户名可以注册使用。

    $.get(url,data,callback,type)  $.post(url,data,callback,type)
    只有第1个是必须的选项
    1. url: 表示请求服务器地址
    2. data: 发送给服务器的数据
        格式1:键1=值2&键2=值2
        格式2:{键:值,键:值}
    3. callback:回调函数,参数是服务器返回的数据
    4. type:从服务器返回的数据类型,默认是字符串类型
        取值:xml, html, script, json, text
    */
    //用户名的改变事件
    $("#user").change(function () {
        //访问服务器获取数据,参数是服务器返回的数据,返回的类型是json格式
        $.get("json/users.json", function (users) {
            //判断用户名是否存在
            let user = $("#user").val();  //得到文本框的值
            //1.设置标记
            let exists = false;
            //2.遍历数组,查找名字是否存在
            for (let u of users) {
                if (u == user) {
                    exists = true;  //找到
                    break;
                }
            }
            //3.根据查找的结果显示信息
            if (exists) {  //用户存在
                $("#info").text("用户名已经存在");
            }
            else {
                $("#info").text("恭喜可以注册");
            }
        },"json");
    });
</script>
</body>
</html>

jQuery 的通用方式实现 AJAX

​ 核心语法:$.ajax({name:value,name:value,…});
​ url:请求的资源路径。
​ async:是否异步请求,true-是,false-否 (默认是 true)。
​ data:发送到服务器的数据,可以是键值对形式,也可以是 js 对象形式。
​ type:请求方式,POST 或 GET (默认是 GET)。
​ dataType:预期的返回数据的类型,取值可以是 xml, html, js, json, text等。
​ success:请求成功时调用的回调函数。
​ error:请求失败时调用的回调函数。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
    <script src="js/jquery-3.3.1.js"></script>
</head>
<body>
<h2>用户登录</h2>
<form id="loginForm">
    <table>
        <tr>
            <td>用户名</td>
            <td><input type="text" name="username" id="username"/></td>
        </tr>
        <tr>
            <td>密码</td>
            <td><input type="password" name="password" id="password"/></td>
        </tr>
        <tr>
            <!--登录按钮是一个普通按钮-->
            <td colspan="2" align="center"><input type="button" value="登录" id="btnLogin"/></td>
        </tr>
    </table>
</form>

<script type="text/javascript">
    /*
     $.ajax({键:值,键:值})
         url : 服务器访问地址
         async  :默认是异步,取值是true,设置为false表示同步
             异步:不会等服务器处理完,会一直向后执行
             同步:等服务器处理完毕,才执行后面的JS代码

         method: GET或POST方法,默认是get方法
         data : 发送给服务器的数据,2种格式:1. 键=值&键=值 2. {键:值, 键:值}
         dataType  : 服务器返回的数据类型<br />取值:xml, html, script, json, text
         success   :  服务器正常响应的回调函数,参数就是服务器返回的数据
         error   :     服务器出现异常的回调函数,参数是XMLHttpRequest对象
     */
    //登录按钮的点击事件
    $("#btnLogin").click(function () {
        //1.获取用户输入的用户名和密码
        let username = $("#username").val();
        let password = $("#password").val();
        //2.使用$.ajax访问服务器
        $.ajax({
            url: "json/login.json",
            data: "a=1&b=2",        //发送的数据,可以在浏览器上按f12,选network可以看到
            //async: false,   //默认是true,表示异步
            //服务器正常响应的回调函数,参数就是返回的用户数据
            success: function (users) {
                let exists = false;
                //遍历数组中每个用户
                for (let user of users) {
                    //比较用户名和密码是否相同
                    if (user.name == username && user.password == password) {
                        exists = true;
                        break;
                    }
                }
                //输出登录成功或失败
                if (exists) {
                    alert("登录成功,欢迎您:" + username);
                }
                else {
                    alert("登录失败,请重试");
                }
            },
            dataType: "json",   //指定返回数据类型是json
            error: function (request) {  //出现异常回调函数,参数是XMLHttpRequest对象
                alert("服务器出现异常,状态码是:" + request.status);
            }
        });

        //alert("浏览器端的代码继续执行");  //不会等服务器处理完,会一直向后执行
    });
</script>
</body>
</html>

JSON

  • JSON(JavaScript Object Notation):是一种轻量级的数据交换格式。
  • 它是基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于计算机解析和生成,并有效的提升网络传输效率。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lGiqVesn-1593308974476)(C:\Users\肖绍霆\AppData\Roaming\Typora\typora-user-images\1593307913275.png)]

JSON 的处理

  • 我们除了可以在 JavaScript 中来使用 JSON 以外,在 JAVA 中同样也可以使用 JSON。
  • JSON 的转换工具是通过 JAVA 封装好的一些 JAR 工具包。
  • 可以将 JAVA 对象或集合转换成 JSON 格式的字符串,也可以将 JSON 格式的字符串转成 JAVA 对象。
  • Jackson:开源免费的 JSON 转换工具,SpringMVC 转换默认使用 Jackson。

需要的jar包:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gdV1R33H-1593308974477)(C:\Users\肖绍霆\AppData\Roaming\Typora\typora-user-images\1593308163276.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pzGZj0ka-1593308974479)(C:\Users\肖绍霆\AppData\Roaming\Typora\typora-user-images\1593308234724.png)]

当集合里面使用的是自定义对象时,就需要使用 TypeReference

方法演示:

//User对象转json
User user = new User("张三",23);
String json = mapper.writeValueAsString(user);
System.out.println("json字符串:" + json);

//json转User对象
User user2 = mapper.readValue(json, User.class);
System.out.println("java对象:" + user2);

//--------------------------------------------------

//map<String,String>转json
HashMap<String,String> map = new HashMap<>();
map.put("姓名","张三");
map.put("性别","男");
String json = mapper.writeValueAsString(map);
System.out.println("json字符串:" + json);

//json转map<String,String>
HashMap<String,String> map2 = mapper.readValue(json, HashMap.class);
System.out.println("java对象:" + map2);

//----------------------------------------------------

//map<String,User>转json
HashMap<String,User> map = new HashMap<>();
map.put("黑马一班",new User("张三",23));
map.put("黑马二班",new User("李四",24));
String json = mapper.writeValueAsString(map);
System.out.println("json字符串:" + json);

//json转map<String,User>
//因为Map集合的值使用的是自定义对象,所以在json转map时需要使用TypeReference方法
HashMap<String,User> map3 = mapper.readValue(json,new TypeReference<HashMap<String,User>>(){});
System.out.println("java对象:" + map3);

搜索框联想Demo

浏览器端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户搜索</title>
    <style type="text/css">
        .content {
            width: 643px;
            margin: 100px auto;
            text-align: center;
        }

        input[type='text'] {
            width: 530px;
            height: 40px;
            font-size: 14px;
        }

        input[type='button'] {
            width: 100px;
            height: 46px;
            background: #38f;
            border: 0;
            color: #fff;
            font-size: 15px
        }

        .show {
            position: absolute;
            width: 535px;
            height: 100px;
            border: 1px solid #999;
            border-top: 0;
            display: none;
        }
    </style>
</head>
<body>
<form autocomplete="off">
    <div class="content">
        <img src="img/logo.jpg">
        <br/><br/>
        <input type="text" id="username">
        <input type="button" value="搜索一下">
        <!--用于显示联想的数据-->
        <div id="show" class="show"></div>
    </div>
</form>
</body>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
    //1.为用户名输入框绑定鼠标点击事件
    $("#username").mousedown(function () {
        //2.获取输入的用户名
        let username = $("#username").val();

        //3.判断用户名是否为空
        if(username == null || username == "") {
            //4.如果为空,将联想框隐藏
            $("#show").hide();
            return;
        }

        //5.如果不为空,发送AJAX请求。并将数据显示到联想框
        $.ajax({
            //请求的资源路径
            url:"userServlet",
            //请求参数
            data:{"username":username},
            //请求方式
            type:"POST",
            //响应数据形式
            dataType:"json",
            //请求成功后的回调函数
            success:function (data) {
                //将返回的数据显示到show的div
                let names = "";
                for(let i = 0; i < data.length; i++) {
                    names += "<div>"+data[i].name+"</div>";
                }
                $("#show").html(names);
                $("#show").show();
            }
        });
    });
</script>
</html>

控制层代码,省略的 service 和dao代码

@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求和响应的编码
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");

        //1.获取请求参数
        String username = req.getParameter("username");

        //2.调用业务层的模糊查询方法得到数据
        UserService service = new UserServiceImpl();
        List<User> users = service.selectLike(username);

        //3.将数据转成JSON,响应到客户端
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(users);
        resp.getWriter().write(json);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值