day22 --> (AJAX、JSON)

AJAX :

概念:ASynchronous JavaScript And XMl  异步的JavaScript 和 XML

1.异步和同步 : 客户端和服务器端相互通信的基础上

 

 AJAX 是一种无需重新加载整个页面的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。传统的网页【不使用Ajax技术】如果需要更新内容,必须加载整个网页页面。

作用:提升用户的体验

2.实现方式【2种】:

1.原生的JS实现方式【较少使用,了解】

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <script>
    //定义方法
    function fun(){
      //发送异步请求
      //1、创建核心对象
      var xhttp;
      if (window.XMLHttpRequest) {
        xhttp = new XMLHttpRequest();
      } else {
        // code for IE6, IE5
        xhttp = new ActiveXObject("Microsoft.XMLHTTP");
      }

      //2、建立连接
      /*
        参数:
          1、请求方式:GET、POST
                    get方式:请求参数在URL后边拼接,send方法为空参
                    post方式:请求参数在send方法中定义
          2、请求的URL路径
          3、同步或异步:true(同步),false(异步)
       */
      xhttp.open("GET", "ajaxServlet?username=tom", true);

      //3、发送请求
      xhttp.send();

      //4、接收并处理来自服务器的响应结果
      //获取方式 :xmlhttp.responseText
      //什么时候获取?当服务器响应成功后在获取
        ///当xhttp对象的就绪状态改变时,触发事件onreadystatechange
        xhttp.onreadystatechange = function() {
            //判断readyState就绪状态是否为4,响应状态码为200
            if (this.readyState == 4 && this.status == 200) {
                //获取服务器的响应结果
                let responseText = xhttp.responseText;
                alert(responseText);
            }
        };
    }
  </script>
</head>
<body>
  <input type="button" value="发送异步请求" onclick="fun();">
<input>
</body>
</html>

 

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、获取请求参数
        String username = request.getParameter("username");

        //处理业务逻辑,耗时
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        //2、打印username
        System.out.println(username);

        //3、响应
        response.getWriter().write("hello: " + username);

    }

2.JQuery实现方式【重点掌握】

1.$.ajax()

语法:$.ajax({键值对})

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <script src="js/jquery-3.3.1.min.js"></script>
  <script>
    //定义方法
    function fun(){
      //使用$.ajax的方式发送异步请求

      //注意:每个键值对用逗号隔开,最后一个不用逗号
      $.ajax({
        url:"ajaxServlet1", //请求路径
        type:"POST", //请求方式,默认GET
        //data:"username=jack&age=23", //请求参数 <方式一>
        data:{"username":"jack","age":23}, //请求参数<方式二,推荐>
        success:function (data) { //data参数:接收服务器响应的值
          //响应成功后的回调函数
          alert(data);
        },
        error:function () {
          //响应请求出现错误会执行的回调函数
          alert("出错了");
        },
        dataType:"text" //设置接收到的响应数据的格式
      });
    }
  </script>
</head>
<body>
  <input type="button" value="发送异步请求" onclick="fun()">
  <input type="text">
</body>
</html>

2.$.get() :发送get请求

语法:$.get(url,[data],[callback],[type]) ,红色:必须,绿色:可选

参数:

url : 请求路径

data : 请求参数

callback : 回调函数

type : 响应结果类型 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <script src="js/jquery-3.3.1.min.js"></script>
  <script>
    //定义方法
    function fun(){
        $.get("ajaxServlet",{username:"rose"},function (data) {
            alert(data);
        },"text");
    }
  </script>
</head>
<body>
  <input type="button" value="发送异步请求" onclick="fun()">
  <input type="text">
</body>
</html>

3.$.post()

post的实现方式和get方式极其类似,不同之处仅仅是$.get变为$.post

 

 JSON :

1.概念:JavaScript Object Notation :JavaScript对象表示法【用JSON表示对象】

Person p = new Person();

p.setName("张三");

p.setAge(23);

p.setGender("男");

----------------------------

var p = {"name":"张三","age":23,"gender":"男"};

json现在多用于存储和交换文本信息的语法

进行数据的传输

json比xml更小、更快,更易解析

 2.语法:

1、基本规则

数据名称/值 对中 :json数据是由键值对构成的

键:用引号【" "、' '】引起来,也可以不使用引号

值的取值类型:

1.数字(整数或者浮点数)

2.字符串(在双引号中)

3.逻辑值(true 或者 false)

4.数组(在方括号中){"persons":[{ },{ },...]}

5.对象(在花括号中) {"address"{"province":"北京"...}}

数据由逗号分隔:数据:多个键值对用逗号分隔

花括号保存对象:使用 { } 定义 json 格式

方括号保存数据:[ ] 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        //1、定义基本格式
        var person = {"name":"张三",age:23,'gender':true};
        //alert(person);
        //获取name的值
        //var name = person.name;
        var name = person["name"];
        //alert(name);

        //2.1、嵌套格式 : {} --> []
        var persons = {
            "persons":[
                {"name":"张三","age":23,"gender":true},
                {"name":"李四","age":24,"gender":true},
                {"name":"王五","age":25,"gender":false}
                ]};
        //alert(person);
        //获取对象”王五“姓名
        let name1 = persons.persons[2].name;
        //alert(name1);

        //2.2、嵌套格式 :[] --> {}
        var ps = [
            {"name":"张三","age":23,"gender":true},
            {"name":"李四","age":24,"gender":true},
            {"name":"王五","age":25,"gender":false
        }];
        //alert(ps);
        //获取对象“李四”的值
        alert(ps[1].name);
    </script>
</head>
<body>

</body>
</html>

 

2、获取数据

 1. json对象.键名

2. json对象["键名"]

3.数组对象[索引]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        //1、定义基本格式
        var person = {"name":"张三",age:23,'gender':true};

        //2.2、嵌套格式 :[] --> {}
        var ps = [
            {"name":"张三","age":23,"gender":true},
            {"name":"李四","age":24,"gender":true},
            {"name":"王五","age":25,"gender":false
        }];

        //获取person对象中所有的键和值
        //for in 循环
        /*for (var key in person){
            alert(key + ":" + person[key]);
        }*/

        //双层for循环嵌套
        for (let i = 0; i < ps.length; i++) {
            for (let key in ps[i]){
                alert(key + ": " + ps[i][key]);
            }
        }

    </script>
</head>
<body>

</body>
</html>

 

 3、JSON数据和Java对象的相互转换

JSON解析器:

常见的解析器:Jsonlib,Gson,fastjson,jackson【学习】

 1.Java对象转为JSON

使用步骤:

1.导入 jackson 相关 jar 包

2.创建Jack核心对象:ObjectMapper

3.调用ObjectMapper的相关方法进行转换

1、转换方法

public class JacksonTest {
    //Java对象转为JSON对象
    @Test
    public void test1() throws Exception {
        //1、创建Person对象
        Person p = new Person();
        p.setName("张三");
        p.setAge(23);
        p.setGender("男");

        //2、创建Jackson的核心对象 ObjectMapper
        ObjectMapper mapper = new ObjectMapper();

        //3、转换
        /*
            转换方法:
                writeValue(参数1,obj) :
                    参数1:
                        File : 将obj对象转换为JSON对象,并保存到指定的文件中
                        Writer :将obj对象转换为JSON对象,并将json数据填充到字符输出流中
                        OutputStream : 将obj对象准换为JSON字符串,并将json数据填充到字节输出流中
                writeValueAsString(obj) : 将对象转为json字符串
         */
        String json = mapper.writeValueAsString(p);
        //System.out.println(json);

        //writeValue,将数据写到d盘homework文件夹下
        //mapper.writeValue(new File("d://homework//a.txt"),p);

        //writeValue,将数据关联到Writer中
        mapper.writeValue(new FileWriter("d://homework//b.txt"),p);
    }
}

 

2、注解:

1.@JsonIgnore : 排除属性

2.@JsonFormat : 属性值的格式化

 

    @Test
    public void test2() throws Exception{
        //1、创建Person对象
        Person p = new Person();
        p.setName("张三");
        p.setAge(23);
        p.setGender("男");
        p.setBirthday(new Date());

        //2、转换
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(p);

        System.out.println(json);
    }

 

3、复杂Java对象转换

1.List :数组

 @Test
    public void test3() throws Exception{
        //1、创建Person对象
        Person p = new Person();
        p.setName("张三");
        p.setAge(23);
        p.setGender("男");
        p.setBirthday(new Date());

        Person p1 = new Person();
        p1.setName("张三");
        p1.setAge(23);
        p1.setGender("男");
        p1.setBirthday(new Date());

        Person p2 = new Person();
        p2.setName("张三");
        p2.setAge(23);
        p2.setGender("男");
        p2.setBirthday(new Date());

        //创建List集合
        List<Person> ps = new ArrayList<>();
        Collections.addAll(ps,p,p1,p2);
        /*
        [{"name":"张三","age":23,"gender":"男","birthday":"2022-12-02"},
         {"name":"张三","age":23,"gender":"男","birthday":"2022-12-02"},
         {"name":"张三","age":23,"gender":"男","birthday":"2022-12-02"}]
         */

        //2、转换
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(ps);

        System.out.println(json);
    }

 

2.Map : 对象格式一致

@Test
    public void test4() throws Exception {
        //1、创建map对象
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("name","张三");
        map.put("age",23);
        map.put("gender","男");
        //2、转换
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(map);
        System.out.println(json);
        /*
            {"gender":"男","name":"张三","age":23}
         */
    }

 

2.JSON对象转换为Java对象(较少使用)

 1.使用步骤:

1.导入 jackson 相关 jar 包

2.创建Jack核心对象:ObjectMapper

3.调用ObjectMapper的相关方法进行转换

//演示:JSON字符串转换为Java对象
    @Test
    public void test5() throws Exception{
        //1、初始化JSON字符串
        String json = "{\"gender\":\"男\",\"name\":\"张三\",\"age\":23}";

        //2、创建ObjectMapper对象
        ObjectMapper mapper = new ObjectMapper();

        //3、转换为Java对象 【Person】
        Person person = mapper.readValue(json, Person.class);

        System.out.println(person);

    }

 

 案例:

校验用户名是否存在:

 1.服务器响应的数据,在客户端使用时,要想当作json数据格式使用

方式一: $.get(type) : 将最后一个参数 type 指定为 "json"

方式二:在服务器端设置 MIME 类型 --> response.setContentType("application/json;charset=utf-8");

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-3.3.1.min.js"></script>
</head>
<body>
<form>
  <input type="text" id="username" placeholder="请输入用户名">
    <span id="s_span"></span><br>
  <input type="password" placeholder="请输入密码"><br>
  <input type="button" value="注册">
</form>
</body>
    <script>
        //用户名文本框失去焦点
        $("#username").blur(function () {
            //1、获取username文本框的内容
            let username = $(this).val();
            //发送ajax异步请求
            //期望服务器响应回的数据格式:{"userExist":true,"msg":此用户名太受欢迎,请更换一个"}
            //                        {"userExist":false,"msg":用户名可用}
            $.get("findUserServlet",{username:username},function (data) {
                //alert(data);
                //判断userExist键的值是否是true
                let span = $("#s_span");
                if (data.userExist){
                    //用户名存在
                    span.css("color","red");
                    span.html(data.msg);
                }else {
                    //用户名不存在
                    span.css("color","green");
                    span.html(data.msg);
                }
            })
        })
    </script>
</html>
@WebServlet("/findUserServlet")
public class FindUserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、获取用户名
        String username = request.getParameter("username");

        //2、调用service层来判断用户名是否存在

        //期望服务器响应回的数据格式:{"userExist":true,"msg":此用户名太受欢迎,请更换一个"}
        //                        {"userExist":false,"msg":用户名可用}

        //设置响应的数据格式为json
        response.setContentType("application/json;charset=utf-8");
        Map<String,Object> map = new HashMap<>();

        //此处模拟数据库中的名字为 tom
        if ("tom".equals(username)){
            //存在
            map.put("userExist",true);
            map.put("msg","此用户名太受欢迎,请更换一个");
        }else {
            //不存在
            map.put("userExist",false);
            map.put("msg","用户名可用");
        }

        //将map转为json,并且将其写入到页面上【传递给客户端】
        //将map --> json
        ObjectMapper mapper = new ObjectMapper();
        //传递给客户端
        mapper.writeValue(response.getWriter(),map);

    }
}

 

 

 

posted @ 2022-12-02 20:47  羽梦齐飞  阅读(7)  评论(0编辑  收藏  举报