zoukankan      html  css  js  c++  java
  • Java EE入门(十八)——Ajax&JSON基础

    Java EE入门(十八)——Ajax&JSON基础
      iwehdio的博客园:https://www.cnblogs.com/iwehdio/

    1、Ajax

    Asynchronous JavaScript And XML,异步的JavaScript和XML。在无需加载整个页面的情况下,能够更新部分网页。

    • 异步和同步:

      • 客户端和服务器端相互通信的基础上。
      • 同步指,客户端必须等待服务器端的响应,这期间客户端不能做任何操作。
      • 异步指,客户端不必等待服务器端的响应,这期间客户端可以做其他操作。
    • 原生 JS 实现方式:

      1. 绑定事件函数。

        <script>
            function func(){
                /* 内容 */
            }
        </script>
        
      2. 创建核心对象。

        var xmlhttp;
        if (window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        }
        else
        {// code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        
      3. 建立连接。xmlhttp.open("GET", "text1,txt", true)。三个参数分别为,请求类型、请求 URL 和同步(false)或异步(true)。

      4. 发送请求。xmlhttp.send()。对于 get 方式,请求参数在 URL 后拼接,send 方法中为空参;对于post 请求,请求参数在 send 方法中。

      5. 接收来自服务器的响应。就绪状态码为 4 时表示请求完成且响应就绪,响应状态码为 200 表示响应成功。

        xmlhttp.onreadystatechange=function()
        {
            if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                var responseText = xmlhttp.responseText;
            }
        }
        
    • JQuery 实现方式:

      • $.ajax(url, [settings])$.ajax({键值对}):发送异步请求。如果写成键值对形式,键包括 url(请求路径参数)、type(请求方式)、data(请求参数)、success(响应成功后的回调函数)、error(出错后的回调函数)、dataType(接收到的响应数据格式)等。
      • $.get(url, [data], [callback], [type]):发送 get 请求。参数分别为请求路径、请求参数、回调函数和响应数据类型。
      • $.post(url, [data], [callback], [type]):发送 post 请求。

    2、JSON

    JavaScript Object Notation,JavaScript对象表示法。是存储或交换文本信息的语法。

    • 基本语法:

      • 数据在名称 / 值对中:JSON 数据是由键值对构成的。每对键值对用逗号分隔。键可以用不用引号都可以,但要一致。
      • 嵌套格式:大括号定义保存对象,中括号定义保存数组。
        • 保存对象:var v = {"key":{"key1":value1, "key2":value2}}
        • 保存数组:var v = {"key":[{"key1":value1}, {"key2":value2}]}
      • 值的取值类型可以为数组、字符串、逻辑值、数组、对象或 null 。
    • 获取数据:

      • json对象.键名

      • json对象["键名"]:单引号双引号都可以。

      • json数组对象[索引]

      • 遍历:

        for(var key in json_object){
            //在这里key是字符串形式,不能直接 person.key 获取
            alert(key + ":" + person[key]);
        }
        
    • JSON 数据与 Java 对象的转换:jackson解析器。

      • 使用步骤:
        1. 导入依赖 jar 包。
        2. 创建 Jackson 核心对象 ObjectMapper 。
        3. 进行转换。
      • JSON 转 Java 对象:
        • mapper.readValue(JSON字符串数组, class类型):class类型是所要转换成的类对象。
      • Java 对象转 JSON:
        • mapper.writeValueAsString(obj):将Java对象转为JSON字符串。
        • mapper.writeValue(参数,obj):将Java对象转为JSON字符串,并存入文件(参数为 File 对象)、字符输出流(参数为 Writer 对象)、字节输出流(参数为 OutputStream 对象)。
        • 注解:
          • @JsonIgnore:忽略该属性,转JSON时不会出现此属性。加在该成员变量上。
          • @JsonFormat(格式):属性值的格式化。加在该成员变量上。如对于 Date,格式可为 pattern = "yyyy-MM-dd"
        • 复杂的 Java 对象:
          • List 数组:转换为 JSON 数组。
          • Map 集合:转换为一个 JSON 对象。

    3、案例

    • 校验用户名是否存在:

      • 通过浏览器传给服务器用户名,服务器经过判断后,响应 JSON 数据给浏览器实现。

      • login.html:

        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>JSON</title>
            <script src="js/jquery-3.3.1.min.js"></script>
            <script>
                $(function () {
                    $("#username").blur(function () {
                        var username = $(this).val();
                        $.get("findUsernameServlet", {username:username}, function (data) {
                            var span = $("#tips");
                            if(data.userExist){
                                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" name="username" id="username" placeholder="请输入用户名"><br>
                <span id="tips"></span>
            </form>
        </body>
        </html>
        
      • FindUsernameServlet:

        @WebServlet("/findUsernameServlet")
        public class FindUsernameServlet extends HttpServlet {
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                request.setCharacterEncoding("utf-8");
                response.setContentType("text/html;charset=utf-8");
                String username = request.getParameter("username");
                Map<String, Object> map = new HashMap<String, Object>();
        		//此处应使用数据库查询
                if("otto".equals(username)){
                    map.put("userExist", true);
                    map.put("msg", "用户名已被占用");
                } else {
                    map.put("userExist", false);
                    map.put("msg", "用户名可以使用");
                }
                ObjectMapper mapper = new ObjectMapper();
                mapper.writeValue(response.getWriter(), map);
            }
        
            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                this.doPost(request, response);
            }
        }
        
      • 如何让浏览器获知响应的是 JSON 类型的数据,防止乱码:

        • $.get()方法的最后一个 type 参数指定为 "json"。
        • response.setContentType("application/json;charset=utf-8"),指定 MIME 类型为 json。

    iwehdio的博客园:[https://www.cnblogs.com/iwehdio/](https://www.cnblogs.com/iwehdio/)
  • 相关阅读:
    java encoding
    [转]shell 变量的作用域
    [转] shell :解析json的命令-jq
    [转] Linux user-space Atomic Operations && GCC Atomic builtins
    [转]reference counting
    [转]memory order,memory barrier,原子操作
    [转]c语言volatile 关键字
    OCF介绍
    [转]计算机存储 cache介绍
    [转] linux IO
  • 原文地址:https://www.cnblogs.com/iwehdio/p/12551256.html
Copyright © 2011-2022 走看看