Day23-Ajax&Json


title: Day23-Ajax&Json
date: 2020-08-10 11:49:12
author: 子陌


AJAX

  1. 概念:ASynchronous JavaScript And XML 异步的JavaScript和XML

    1. 异步和同步:客户端和服务端的相互通信的前提下
      • 客户端必须等待服务端的响应。在等待的期间客户端不能做其他的操作
      • 客户端不需要等待服务端的响应。在服务器处理请求过程中,客户端可以进行其他操作

同步和异步

  • ajax无需重新加载整个网页的情况下,能够更新部分网页的技术
  1. 实现方式

    1. 原生的JS实现方式

      <!DOCTYPE html>
      <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>原生js实现ajax</title>
              <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
              <script>
                  // 定义方法
                  function fun() {
               
               
                      // 发送异步请求
                      // 1.创建核心对象
                      var xmlhttp;
                      if (window.XMLHttpRequest){
               
                // 高版本方式
                          xmlhttp = new XMLHttpRequest();
                      }else {
               
                // 低版本ie6 ie5创建方式
                          xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                      }
                      // 2.建立连接
                      xmlhttp.open("GET","ajaxServlet?name=zimo",true);    // 请求方式   请求路径   true:异步 false:同步
                      // 3.发送请求
                      xmlhttp.send(); // get:在url路径后空参    post:在send方法中定义
                      // 4.接受并响应
                      // 4.1获取方式xmlhttp.responseText,当服务器返回的时候
                      // 当xmlhttp对象的就绪状态改变时,触发onreadystatechange
                      xmlhttp.onreadystatechange = function(){
               
               
                          // 当readyState状态为4时就绪,响应状态码200成功
                          if (xmlhttp.readyState==4 && xmlhttp.status==200){
               
               
                              var response = xmlhttp.responseText;
                              console.log(response);
                              document.getElementById("d1").innerText = response;
                          }
                      }
                  }
              </script>
          </head>
          <body>
              <input type="button" value="发送异步请求" onclick="fun();">
              <div id="d1"></div>
          </body>
      </html>
      
    2. jQuery实现方式

      1. $.ajax()
        • 语法:$.ajax({键值对});
      2. $.get()
        • 语法:$.get(url, [data, [callback],[type]);
        • 参数:
          • url:请求路径
          • data:请求参数
          • callback:回调函数
          • type:响应结果的类型
      3. $.post()
    • $.ajax()演示
    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>jQuery实现ajax</title>
            <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
            <script>
                // 定义方法
                function fun() {
           
           
                    // 使用$.ajax()发送异步请求
                    $.ajax({
           
           
                        url:"ajaxServlet",                  // 请求路径
                        type:"post",                        // 请求方式,默认get
                        // data:"name=zimo&a=1",            // 方式一
                        data: {
           
           "name":"zimo", "age":123},   // 推荐使用
                        dataType: "json",                   // 设置数据格式
                        success:function (data) {
           
           
                            // 响应成功后回调
                            alert(data);
                        },
                        error:function () {
           
           
                            // 出错响应
                            alert("出错了...")
                        }
                    })
                }
            </script>
        </head>
        <body>
            <input type="button" value="发送异步请求" onclick="fun();">
            <div id="d1"></div>
        </body>
    </html>
    
    • $.get()演示
    // 定义方法
    function fun() {
          
          
        // 使用$.get()发送异步请求
        $.get("ajaxServlet",{
          
          name:"zimo"},function (data) {
          
          
            alert(data);
        },"text");
    }
    
    • $.post()演示
    // 定义方法
    function fun() {
          
          
        // 使用$.post()发送异步请求
        $.post("ajaxServlet",{
          
          name:"zimo"},function (data) {
          
          
            alert(data);
        },"text");
    }
    

JSON

概念

  • JavaScript Object Notation JavaScript对象表示法
  • json是存储和交换文本信息的语法,类似XML
  • json比XML更小、更快、更易解析

语法

  1. 基本规则:

    • 键值对构成的:键由引号引起来,也可以不使用
    • 数据由逗号分割:多个键值对由逗号分割
    • 花括号保存对象:使用{}定义json格式
    • 方括号保存数组:[]

    值的取值类型:

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

      1. 字符串(在双引号中)
      2. 逻辑值(true 或 false)
      3. 数组(在方括号中)
      4. 对象(在花括号中)
      5. null
  2. 获取数据

    1. json对象.键名
    2. json对象["键名"]
    3. 数组对象[索引]
# 基本格式
var person = {
    
    "name":"张三", age:18, 'gender':true};
## 获取值
var name = person.name;		// 张三
var age = person["age"];	// 18
# 嵌套格式{
    
    } -->> []
var persons = {
    
    
    "persons":[
        {
    
    "name":"张三","age":18, "gender":true},
        {
    
    "name":"李四","age":20, "gender":false},
        {
    
    "name":"王五","age":23, "gender":true}
    ]
};
## 获取值
var name1 = persons.persons[2].name;	// 王五
# 嵌套格式[]  -->> {
    
    }
var ps = [
    {
    
    "name":"张三","age":18, "gender":true},
    {
    
    "name":"李四","age":20, "gender":false},
    {
    
    "name":"王五","age":23, "gender":true}
]
## 获取值
var name2 = ps[1].name;	// 李四

### json的遍历
for(var key in person){
    
    
    console.log(key + ":" + person[key]);
}
for(var i = 0; i < ps.length; i++){
    
    
    var p = ps[i];
    for(var k in p){
    
    
        console.log(key + ":" + p[key]);
    }
}

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

  • JSON解析器:
    • 常见的解析器:Jsonlib,Gson,fastjson,jackson
  1. json转为Java对象

    1. 使用步骤:
      1. 导入jackson的jar包
      2. 创建jackson核心对象ObjectMapper
      3. 调用ObjectMapper的相关方法进行转换(readValue(json,class)
  2. Java对象转成json

    1. 使用步骤:
      1. 导入jackson的jar包
      2. 创建jackson核心对象ObjectMapper
      3. 调用ObjectMapper的相关方法进行转换(writeValue()
    2. 注解:在对应类字段名上添加
      1. @JsonIgnore:排除属性。
      2. @JsonFormat:属性值的格式化
    3. 复杂类型转换
      • List转换成json数组
      • Map转换成json对象
    // 1.创建person对象
    Person person = new Person();
    person.setName("张三");
    person.setAge(23);
    person.setGender("男");
    
    // 2.创建jackson的核心对象
    ObjectMapper objectMapper = new ObjectMapper();
    // 3.调用方法转换
    // 3.1 writeValue(参数1, obj) 参数1:file对象  write对象  OutputStream对象
    // 3.2 writeValueAsString(obj):将对象转为json字符串
    String s = objectMapper.writeValueAsString(person);
    System.out.println(s);  // {"name":"张三","age":23,"gender":"男"}
    objectMapper.writeValue(new File("D://a.txt"), person);
    objectMapper.writeValue(new FileWriter("D://b.txt"), person);
    
  • 案例:校验用户名是否存在
    • 服务器响应的数据,在客户端使用时,要想当作json数据格式使用
      1. $.get(type):将最后一个参数type指定为"json"格式
      2. 在服务器端设置MIME类型
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>register</title>
        <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
        <script>
            $(function () {
     
     
               $("#username").blur(function () {
     
     
                   var username = $(this).val();
                   $.get("findUserServlet",{
     
     username:username},function (data) {
     
     
                       var span = $("#msg");
                       if (data.userExsit){
     
     
                           span.css("color","red");
                           span.html(data.msg);
                       }else {
     
     
                           span.css("color","green");
                           span.html(data.msg);
                       }
                   },"json");
               });
            });
        </script>
    </head>
    <body>
        <form>
            <input type="text" id="username" name="username" placeholder="请输入用户名">
            <span id="msg"></span><br>
            <input type="password" name="password" placeholder="请输入密码"><br>
            <input type="submit" value="注册">
        </form>
    </body>
</html>
package com.zimo.web;

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/findUserServlet")
public class FindUserServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        // 1.获取用户名
        String username = request.getParameter("username");
        // 设置响应的数据格式为json
        response.setContentType("application/json;charset=utf-8");
        Map<String, Object> map = new HashMap<>();
        // 2.判断用户名是否存在
        if ("admin".equals(username)){
    
    
            map.put("userExsit", true);
            map.put("msg", "此用户名太受欢迎,请更换一个。。");
        }else {
    
    
            map.put("userExsit", false);
            map.put("msg", "此用户可以使用");
        }
        // 3.将map转成json,传递给客户端
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(response.getWriter(), map);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doPost(request, response);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38205875/article/details/109100369