Ajax

Ajax

一、JS的AJAX

1.AJAX的概述

1.1 什么是AJAX

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZsxqPHfa-1629123976624)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day31_Ajax/笔记/img/tu_2.png)]

​ 说白了: AJax是可以做异步的请求,实现局部刷新一种客户端技术

1.2 什么是异步
  • 同步

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aTzGZIyP-1629123976629)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day31_Ajax/笔记/img/tu_3.png)]

  • 异步

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pt41fgct-1629123976632)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day31_Ajax/笔记/img/tu_4.png)]

1.3为什么要学习AJAX

​ 提升用户的体验。(异步)

​ 实现页面局部刷新。

​ 将部分的代码,写到客户端浏览器。

知识点-JS的Ajax入门【了解】

​ 第一步:创建异步请求对象。

​ 第二步:打开连接。

​ 第三步:发送请求。

​ 第四步:设置监听对象改变所触发的函数,处理结果

1.1GET请求方式的入门
//使用原生的js代码发送异步请求
function fn1() {
    //1. 创建XMLHTTPRequest对象
    var xhr = new XMLHttpRequest();
    //2. 建立与服务器的连接
    xhr.open("GET","demo01?username=jay")
    //3. 发送请求
    xhr.send()

    //4.自己编写代码处理响应,展示响应数据
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            //获取响应数据
            var responseText = xhr.responseText;
            document.getElementById("msg").innerHTML = responseText
        }
    }
}
1.2POST请求方式的入门
//使用js原生的代码发送异步的post请求
function fn2() {
    //1. 创建XMLHTTPRequest对象
    var xhr = new XMLHttpRequest();
    //2. 建立与服务器的连接
    xhr.open("POST","demo01")
    //3. 发送请求
    //设置一个请求头,用来设置请求参数的类型
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
    xhr.send("username=jay")
    //4.自己编写代码处理响应,展示响应数据
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            //获取响应数据
            var responseText = xhr.responseText;
            document.getElementById("msg").innerHTML = responseText
        }
    }
}

二、JQ的AJAX【重点】

1.JQ的AJAX介绍

1.1 为什么要使用JQuery的AJAX

​ 因为传统(js里面)的AJAX的开发中,AJAX有两个主要的问题:

​ 浏览器的兼容的问题 , 编写AJAX的代码太麻烦而且很多都是雷同的。

​ 在实际的开发通常使用JQuery的Ajax ,或者Vue里面的axios

1.2 JQuery的Ajax的API
请求方式语法
GET请求$.get(url, [data], [callback], [type])
POST请求$.post(url, [data], [callback], [type])
AJAX请求$.ajax([settings])

2.JQ的AJAX入门【重点】

2.1get()
  • get方式, 语法 $.get(url, [data], [callback], [type]);

    参数名称解释
    url请求的服务器端url地址
    data发送给服务器端的请求参数,格式是key=value;get请求的参数可以直接写在url后面
    callback当请求成功后的回掉函数,可以在函数体中编写我们的逻辑代码
    type预期的返回数据的类型(默认为text),取值可以是 xml, html, script, json, text, _defaul等
  • 实例

//声明一个方法使用jQuery的ajax发送异步的get请求
function fn3() {
    $.get("/demo01?username=tom",function (result) {
        //在这个回调函数中处理响应数据result
        //将响应数据展示在id为msg的div中
        $("#msg").html(result)
    })
}
2.2post()
  • post方式, 语法 $.post(url, [data], [callback], [type])

    参数名称解释
    url请求的服务器端url地址
    data发送给服务器端的请求参数,格式是key=value
    callback当请求成功后的回掉函数,可以在函数体中编写我们的逻辑代码
    type预期的返回数据的类型(默认为text),取值可以是 xml, html, script, json, text, _defaul等
  • 实例

//声明一个方法使用jQuery的ajax发送异步的post请求
function fn4() {
    $.post("/demo01","username=jack",function (result) {
        //result就是服务器端的响应数据
        $("#msg").html(result)
    })
}
2.3 ajax()了解
  • 语法 $.ajax([settings])

    其中,settings是一个js字面量形式的对象,格式是{name:value,name:value… …},常用的name属性名如下

    属性名称解释
    url请求的服务器端url地址
    async(默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false
    data发送到服务器的数据,可以是键值对形式,也可以是js对象形式
    type(默认: “GET”) 请求方式 (“POST” 或 “GET”), 默认为 “GET”
    dataType预期的返回数据的类型,取值可以是 xml, html, script, json, text, _defaul等
    success请求成功后的回调函数
    error请求失败时调用此函数
  • 实例

//声明一个方法使用jQuery的ajax方法发送异步请求
function fn5() {
    $.ajax({
        url:"/demo01", //请求路径
        data:"username=lucy", //请求参数
        type:"POST", //请求方式
        success:function (result) {
            $("#msg").html(result)
        }, //请求成功时候的回调函数
        error:function () {
            $("#msg").html("服务器异常")
        } //请求失败时候的回调函数
    })
}

案例-使用JQ的Ajax完成用户名异步校验

1.需求分析

​ 我们有一个网站,网站中都有注册的页面,当我们在注册的页面中输入用户名的时候,这个时候会提示,用户名是否存在。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BTRAkWl7-1629123976635)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day31_Ajax/笔记/img/tu_1.png)]

2,思路分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PYLNi9xd-1629123976637)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day31_Ajax/笔记/img/check.png)]

步骤:
  1. 导入jar包,拷贝配置文件、工具类、解决乱码的过滤器、jquery文件
  2. 创建包结构
  3. 编写前端代码发送异步请求
  4. 编写Servlet代码接收请求、调用业务层的方法处理请求、响应数据给客户端
  5. 编写业务层的代码处理请求
  6. 编写Dao层的代码查询数据
3.代码实现
  • 前端
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
    <script src="js/jquery-3.3.1.js"></script>
</head>
<body>
    <form action="#" method="post">
        用户名<input type="text" name="username" onblur="checkUsername(this.value)">
        <span id="uspan" style="color: red"></span>
    </form>

    <script>
        function checkUsername(username) {
            //校验用户名
            //发送异步请求给UserServlet,并且携带参数action和username
            $.post("user","action=checkUsername&username="+username,function (result) {
                //这个result就是服务器端的响应结果
                $("#uspan").html(result)
            })
        }
    </script>
</body>
</html>
  • UserServlet代码
package com.work.web.servlet;

import com.work.pojo.User;
import com.work.service.UserService;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author Leevi
 * 日期2020-10-22  10:12
 */
@WebServlet("/user")
public class UserServlet extends BaseServlet {
    private UserService userService = new UserService();
    /**
     * 校验用户名
     * @param request
     * @param response
     */
    public void checkUsername(HttpServletRequest request, HttpServletResponse response){
        try {
            //1. 获取请求参数
            String username = request.getParameter("username");
            //2. 调用业务层的方法,根据username查找用户
            User user = userService.findByUsername(username);
            //3. 判断user是否为null
            if (user == null) {
                //用户名可用

            }else {
                //用户名已被占用

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • UserService的代码
public class UserService {
    private UserDao userDao = new UserDao();
    public User findByUsername(String username) throws SQLException {
        return userDao.findByUsername(username);
    }
}
  • UserDao的代码
public class UserDao {
    private QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
    public User findByUsername(String username) throws SQLException {
        String sql = "select * from user where username=?";
        User user = queryRunner.query(sql, new BeanHandler<>(User.class), username);
        return user;
    }
}

4.小结

当前案例存在问题:

服务器直接向客户端响应普通的字符串,客户端拿到了普通字符串之后,只能显示该字符串,没法根据服务器端的响应数据的不同而做一些自定义的处理,所以我们的想法是接下来将服务器端的响应数据封装成一个JavaBean对象

3.创建ResultBean用于封装项目的响应数据

分析

服务器要响应哪些数据给客户端?

  1. 服务器的状态: 是否出现异常
  2. 这次请求的处理结果: 比如说要显示在客户端的数据、用户名是否可用、联系人列表等等
  3. 如果服务器出现异常,则要将服务器想给客户端看的异常信息响应给客户端
实现

封装的ResultBean的代码

package com.work.pojo;

import java.io.Serializable;

/**
 * 包名:com.work.pojo
 * @author Leevi
 * 日期2020-10-22  10:41
 * 封装服务器端给客户端的响应数据
 */
public class ResultBean implements Serializable {
    /**
     * 服务器端是否出现异常
     */
    private Boolean flag;
    /**
     * 服务器端处理请求之后要响应的数据
     */
    private Object data;
    /**
     * 服务器端的异常信息
     */
    private String errorMsg;

    @Override
    public String toString() {
        return "ResultBean{" +
                "flag=" + flag +
                ", data=" + data +
                ", errorMsg='" + errorMsg + '\'' +
                '}';
    }

    public Boolean getFlag() {
        return flag;
    }

    public void setFlag(Boolean flag) {
        this.flag = flag;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }
}

小结

封装好ResultBean之后,服务器的响应数据就会封装在ResultBean对象中;然后再想办法将ResultBean对象的信息响应给客户端,但是客户端是无法解析ResultBean对象的,所以我们需要先将ResultBean对象转换成客户端能够认识的数据格式,然后再响应给客户端

4.JSON

4.1.json简介

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OP3MCyXZ-1629123976639)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day31_Ajax/笔记/img/tu_7.png)]

  • 用我们自己的话来说: JSON就是一个容易生成和解析的数据格式;

    ​ 常用作客户端(前端,IOS,安卓)和服务器(JavaEE)之间的数据交换

4.2. 语法介绍
  • 定义方式:
    • json是由键值对构成的,key和value之间使用冒号,个个键值对之间使用逗号隔开
    • json的value也可以是json类型
    • 如果有多个json对象,则可以存放在数组中
  • 解析语法:
    • 获取json对象里的value值:json对象.key
    • 获取数组里指定索引的元素:数组[索引]
4.3. 使用示例
  • 对象形式
var person01 = {name:"张三疯",age:189,address:"武当山"}

var person02 = { name:"张三疯",age:189,address:"武当山",wife:{
                name:"小花",
                age:18
            }
        }

  • 数组形式
//二,JSON数组 [ele,ele]
var sons = [{"name": "张三", "age": 18}, {"name": "张四", "age": 19}];

  • 混合形式
var person03 = {name:"张三疯", age:189, address:"武当山",
            wife:{
                name:"小花",
                age:18
            },
            sons:[
                {
                    nickanme:"张三",
                    age:1
                },
                {
                    nickname:"张四",
                    age:2
                }
            ]
        }

4.4.小结
  1. JSON: 一种容易生成和解析的数据格式, 通常用作数据的交换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KyVEArfl-1629123976640)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day31_Ajax/笔记/img/image-20191218122123393.png)]

  1. JSON格式
    • JSON对象 {key:value,key:value}
      • key是字符串
      • value是任意的合法数据类型
    • JSON数组 [ele,ele…]
    • 嵌套: 对象和数组的嵌套

5.使用Jackson将java对象转换成json字符串

5.1. 常见工具类
  • 在Ajax使用过程中,服务端返回的数据可能比较复杂,比如List<User>;这些数据通常要转换成json格式,把json格式字符串返回客户端
  • 常见的转换工具有:
    • Jackson:SpringMVC内置的转换工具
    • jsonlib:Java提供的转换工具(一般不用)
    • gson:google提供的转换工具(轻量级的框架)
    • fastjson:Alibaba提供的转换工具(效率高速度快)
5.2.Jackson的API介绍
  • Jackson提供了转换的核心类:ObjectMapper
  • ObjectMapper的构造方法:无参构造
  • ObjectMapper的常用方法:
方法说明
writeValueAsString(Object obj)把obj对象里的数据转换成json格式
5.3.java对象转成JSON

步骤:

  1. 导入jar包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kDK3jEqJ-1629123976641)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day31_Ajax/笔记/img/image-20191104111038508.png)]

  1. 创建ObjectMapper对象
  2. 调用writeValueAsString(Object obj)

实现

package com.work;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.work.pojo.ResultBean;
import com.work.pojo.User;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * 包名:com.work
 * @author Leevi
 * 日期2020-10-22  10:59
 * 测试json转换
 * 为什么要将java对象转成json:因为我们要将java对象中的数据通过http协议传给各种客户端,而json是一种所有语言都能解析的数据格式
 * 在Java代码中怎么将Java对象转成json: 使用框架
 * 1. json-lib: 很古老的很重量级的框架,一般不用
 * 2. jackson: spring默认支持的json解析框架
 * 3. fastjson: 阿里开发的速度飞快的json解析框架
 * 4. gson: 谷歌开发一款使用特别简单的json解析框架
 *
 * 一: 使用jackson进行json和java对象的转换
 *    目标: 将Java对象转成json字符串
 */
public class TestJson {
    @Test
    public void test01() throws JsonProcessingException {
        User user = new User(1, "张三丰", "123456", "18999999999@163.com", "18999999999");

        //使用jackson将user对象转换成json字符串
        String jsonStr = new ObjectMapper().writeValueAsString(user);

        System.out.println(jsonStr);
    }

    @Test
    public void test02() throws JsonProcessingException {
        User user = new User(1, "张三丰", "123456", "18999999999@163.com", "18999999999");

        ResultBean resultBean = new ResultBean(true, user);

        //将resultBean对象转成json字符串
        String jsonStr = new ObjectMapper().writeValueAsString(resultBean);
        System.out.println(jsonStr);
    }

    @Test
    public void test03() throws JsonProcessingException {
        List<User> userList = new ArrayList<>();
        userList.add(new User(1, "张三丰", "123456", "18999999999@163.com", "18999999999"));
        userList.add(new User(2, "周杰棍", "654321", "19898989898@163.com", "19898989898"));
        userList.add(new User(3, "奥巴马", "666666", "666666@163.com", "19866666666"));

        String jsonStr = new ObjectMapper().writeValueAsString(userList);
        System.out.println(jsonStr);
    }

    @Test
    public void test04() throws JsonProcessingException {
        List<User> userList = new ArrayList<>();
        userList.add(new User(1, "张三丰", "123456", "18999999999@163.com", "18999999999"));
        userList.add(new User(2, "周杰棍", "654321", "19898989898@163.com", "19898989898"));
        userList.add(new User(3, "奥巴马", "666666", "666666@163.com", "19866666666"));


        ResultBean resultBean = new ResultBean(true, userList);

        String jsonStr = new ObjectMapper().writeValueAsString(resultBean);
        System.out.println(jsonStr);
    }
}

小结
  • Map对象或者JavaBean对象转换成json的时候会得到一个json字符串
  • List或者List转换成json的时候会得到一个json数组的字符串

6.fastjson转换工具

6.1. fastjson的API介绍
  • fastjson提供了核心类:JSON
  • JSON提供了一些常用的静态方法:
方法说明
toJSONString(Object obj)把obj对象里的数据转换成json格式
6.2. java对象转成json

步骤

  1. 导入jar包

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BV0fFyrO-1629123976641)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day31_Ajax/笔记/img/image-20191115174142074.png)]

  2. 调用JSON.toJSONString(Object obj);

实现

@Test
public void test06(){
    //使用fastjson将user对象转换成json字符串
    User user = new User(1,"奥巴马","123456","123456@qq.com","18999999999");

    String jsonStr = JSON.toJSONString(user);

    System.out.println(jsonStr);
}

//其它的map、list转成json对象也是一样的调用JSON.toJSONString(obj)实现

案例-能够完成自动补全的(返回JSON数据)

1.需求

​ 实现一个搜索页面,在文本框中输入一个值以后(键盘抬起的时候),给出一些提示

2.思路分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sPyav190-1629123976643)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day31_Ajax/笔记/img/search.png)]

  1. 创建数据库和页面, 实体类
  2. 给搜索框设置键盘抬起事件
inputEle.keyup(function(){
	//1.获得用户输入关键词
	//2.发送Ajax请求WordServlet 携带关键词, 获得响应的数据
	//3.解析响应的数据 填充页面

});

  1. 创建WordsServlet
//1.获得请求参数(关键词)
//2.调用业务 根据关键词获得List<Words> list
//3.将list存储到ResultBean中,转成json字符串输出到浏览器

  1. 创建WordsService
public List<Words> findByKeyWord(String keyWord){
	//调用Dao 查询

}

  1. 创建WordsDao
SELECT * FROM words WHERE word LIKE '%a%' LIMIT 0,5
SELECT * FROM words WHERE word LIKE ? LIMIT 0,5

3.代码实现
3.1.环境的准备
  • 创建数据库
create table words(
    id int primary key auto_increment,
    word varchar(50)
);
insert into words values (null, 'all');

insert into words values (null, 'after');

insert into words values (null, 'app');

insert into words values (null, 'apple');

insert into words values (null, 'application');

insert into words values (null, 'applet');

insert into words values (null, 'and');

insert into words values (null, 'animal');

insert into words values (null, 'back');

insert into words values (null, 'bad');

insert into words values (null, 'bag');

insert into words values (null, 'ball');

insert into words values (null, 'banana');

insert into words values (null, 'bear');

insert into words values (null, 'bike');

insert into words values (null, 'car');

insert into words values (null, 'card');

insert into words values (null, 'careful');

insert into words values (null, 'cheese');

insert into words values (null, 'come');

insert into words values (null, 'cool');

insert into words values (null, 'dance');

insert into words values (null, 'day');

insert into words values (null, 'dirty');

insert into words values (null, 'duck');

insert into words values (null, 'east');

insert into words values (null, 'egg');

insert into words values (null, 'every');

insert into words values (null, 'example');

  • 创建JavaBean

    package com.work.bean;
    
    import java.io.Serializable;
    
    public class Words implements Serializable{
    
    
        private int id;
        private String word;
    
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getWord() {
            return word;
        }
    
        public void setWord(String word) {
            this.word = word;
        }
    
        @Override
        public String toString() {
            return "Words{" +
                    "id=" + id +
                    ", word='" + word + '\'' +
                    '}';
        }
    }
    
    
    
  • 导入jar,工具类, 配置文件

  • 创建页面,search.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <center>
    
        <h1>黑马</h1>
    
        <input id="inputId" type="text" style="width: 500px; height: 38px;" /><input
          type="button" style="height: 38px;" value="黑马一下" />
        <div id="divId"
             style="width: 500px; border: 1px red solid; height: 300px; position: absolute; left: 394px;">
            <table id="tabId" width="100%" height="100%"  border="1px">
                
            </table>
        </div>
    
    </center>
    </body>
    </html>
    
    
3.2实现
  • search.htm
<script>
    //声明一个搜索的方法
    function searchWords(keyword) {
        //判断输入框中的内容是否是空字符串,如果不是空字符串,才发请求
        if (keyword != "") {
            $("#divId").show()
            //发送异步请求给WordsServlet,携带参数action以及搜索关键字keyword
            $.post("words","action=search&keyword="+keyword,function (result) {
                //判断是否查询成功
                if (result.flag) {
                    //查询成功
                    var data = result.data;//json数组,每一个json对象就对应一个Words对象

                    //每次遍历添加之前,先要清除原来的数据
                    $("#tabId").empty()
                    //遍历出每一个json对象
                    $.each(data,function (index,words) {
                        //words就是遍历出来的每一个json
                        //获取word属性的值
                        var word = words.word;

                        //有一个word就往展示的table中添加一行
                        $("#tabId").append($("<tr><td>"+word+"</td></tr>"))
                    })
                }else {
                    //查询失败
                    $("#msg").html("网络异常")
                }
            },"json")
        }else {
            //说明:输入框的内容为空,就应该隐藏那个展示框
            $("#divId").hide()
        }
    }
</script>

  • WordsServlet
package com.work.web.servlet;

import com.alibaba.fastjson.JSON;
import com.work.pojo.ResultBean;
import com.work.pojo.Words;
import com.work.service.WordsService;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * @author Leevi
 * 日期2020-10-22  11:58
 */
@WebServlet("/words")
public class WordsServlet extends BaseServlet {
    private WordsService wordsService = new WordsService();
    /**
     * 搜索提示
     * @param request
     * @param response
     */
    public void search(HttpServletRequest request, HttpServletResponse response) throws IOException {
        ResultBean resultBean = new ResultBean(true);
        try {
            //1. 获取请求参数keyword的值
            String keyword = request.getParameter("keyword");
            //2. 调用业务层的方法,根据搜索关键字进行搜索
            List<Words> wordsList = wordsService.search(keyword);
            //3. 将搜索到的内容封装到ResultBean对象中
            resultBean.setData(wordsList);
        } catch (Exception e) {
            e.printStackTrace();
            //服务器出现异常
            resultBean.setFlag(false);
            resultBean.setErrorMsg("查询失败");
        }

        //将resultBean转换成json字符串响应给客户端
        String jsonStr = JSON.toJSONString(resultBean);

        response.getWriter().write(jsonStr);
    }
}

  • WordsService
package com.work.service;

import com.work.dao.WordsDao;
import com.work.pojo.Words;

import java.util.List;

/**
 * 包名:com.work.service
 *
 * @author Leevi
 * 日期2020-10-22  11:58
 */
public class WordsService {
    private WordsDao wordsDao = new WordsDao();
    public List<Words> search(String keyword) throws Exception {
        return wordsDao.search(keyword);
    }
}

  • WordsDao
package com.work.dao;

import com.work.pojo.Words;
import com.work.utils.DruidUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.util.List;

/**
 * 包名:com.work.dao
 *
 * @author Leevi
 * 日期2020-10-22  11:58
 */
public class WordsDao {
    private QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
    public List<Words> search(String keyword) throws Exception {
        String sql = "select * from words where word like ? limit 0,11";
        List<Words> wordsList = queryRunner.query(sql, new BeanListHandler<>(Words.class), "%" + keyword + "%");
        return wordsList;
    }
}

7.将json字符串转换成Java对象

1. 使用jackson将json字符串转换成java对象

1.1 API介绍
方法功能
readValue(String json, Class type)把json字符串,还原成type类型的Java对象
readValue(String json, TypeReference reference)把json字符串,还原成带泛型的复杂Java对象(比如List)
  • 其中TypeReferencecom.fasterxml.jackson.core.type.TypeReference
    • 是一个抽象类,用于配置完整的泛型映射信息,避免泛型丢失的问题。用法示例:
// List<Integer> 类型的映射信息
TypeReference ref1 = new TypeReference<List<Integer>>() {};

// List<User> 类型的映射信息
TypeReference ref2 = new TypeReference<List<User>>() {};

// Map<String,User> 类型的映射信息
TypeReference ref3 = new TypeReference<Map<String,User>>(){};

1.2 使用jackson将json字符串转换JavaBean对象或者Map
@Test
//把json转成JavaBean(user对象)
public void test06() throws IOException {
    String jsonStr = "{\"id\":1,\"username\":\"zs\",\"password\":\"123456\",\"email\":\"zs@163.com\",\"phone\":\"1386789898\"}";
    //1.调用JSON.parseObject(String json,Class clazz);
    //转换成user
    User user = JSON.parseObject(jsonStr, User.class);
    System.out.println(user);
    
    //转换成map
    Map map = JSON.parseObject(jsonStr, Map.class);
    System.out.println(map);
}

1.3 使用jackson将json数组字符串转换成List
@Test
//把json转成List<JavaBean>对象
public void test07() throws Exception {
    String jsonStr = "[{\"id\":1,\"username\":\"zs\",\"password\":\"123456\",\"email\":\"zs@163.com\",\"phone\":\"1386789898\"},{\"id\":2,\"username\":\"ls\",\"password\":\"123456\",\"email\":\"ls@163.com\",\"phone\":\"1386781898\"},{\"id\":3,\"username\":\"ww\",\"password\":\"123456\",\"email\":\"ww@163.com\",\"phone\":\"1386782898\"}]";
	
    //1.创建ObjectMapper对象
    ObjectMapper objectMapper = new ObjectMapper();

    //2.调用readValue()
    TypeReference<List<User>> ref = new TypeReference<List<User>>(){};
    List<User> list = objectMapper.readValue(jsonStr, ref);
    System.out.println(list);
}

2. 使用fastjson将json字符串转换成java对象

2.1 API 介绍
方法功能
parseObject(String json, Class type)把json字符串,还原成type类型的Java对象
parseArray(String json, Class type)把json字符串,还原成List
2.2 使用fastjson将json字符串转换成JavaBean对象或者Map
@Test
    //把json转成JavaBean(user对象)
    public void test08() throws IOException {
        String jsonStr = "{\"id\":1,\"username\":\"zs\",\"password\":\"123456\",\"email\":\"zs@163.com\",\"phone\":\"1386789898\"}";

        //1.调用JSON.parseObject(String json,Class clazz);
        User user = JSON.parseObject(jsonStr, User.class);
        System.out.println(user);

    }

    @Test
    //把json转成Map
    public void test09() throws IOException {
        String jsonStr = "{\"id\":1,\"username\":\"zs\",\"password\":\"123456\",\"email\":\"zs@163.com\",\"phone\":\"1386789898\"}";

        //1.调用JSON.parseObject(String json,Class clazz);
        Map map = JSON.parseObject(jsonStr, Map.class);

        System.out.println(map);
    }

2.3 使用fastjson将json字符串转换成List
@Test
public void test11(){
    //使用fastjson将json数组的字符串,转换成List<User>
    String jsonArr = "[{\"id\":1,\"username\":\"奥巴马\",\"password\":\"123456\",\"email\":\"123456@qq.com\",\"phone\":\"18999999999\"},{\"id\":2,\"username\":\"周杰棍\",\"password\":\"654321\",\"email\":\"654321@qq.com\",\"phone\":\"18666666666\"},{\"id\":3,\"username\":\"王丽红\",\"password\":\"777777\",\"email\":\"777777@qq.com\",\"phone\":\"18777777777\"}]";

    List<User> userList = JSON.parseArray(jsonArr, User.class);

    for (User user : userList) {
        System.out.println(user.getUsername());
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值