JSon和Ajax

2023-10-31

JSON

什么是 JSON ?

   JSON(JavaScript Object Notation) 是轻量级的文本数据交换格式,主要用来web服务前后端传输数据.

   JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。

   JSON 具有自我描述性,更易理解

JSON语法

   数据在 名称:值 对中  "username":"张三丰"

   数据由逗号分隔     "username":"张三丰","age":"128"

   大括号保存JSON对象     {"username":"张三丰","age":"128"}

   中括号保存数组     {"class":[{"JAVA":"102"},{"BigData":"104"},{"HTML":"107"}]}

       Json对象中存储的数据格式

              数字

                     {"age":18}

              布尔

                     {"result":true}

              字符串

                     {"name":"张三"}

              null

                     {"name":null}

演示

        // ======= json数据的格式 ======
        var jsopObj1 = {"username":"admin"}; // json对象,包含一个数据
        var jsopObj2 = {"username":"admin","password":"123456"};// json对象,包含多个数据,逗号隔开
        // key 双引号,value值如果是字符串-双引号
        var jsopObj3 = {"age":18, // 数字
                        "sex":true,// 布尔
                        "score":[98,99,100],// 数组,数组的元素是数字
                        // 数组,数组的元素是json对象
                        "jsonArr":[{"keyA":"valA"},{"keyB":"valB"},{"keyC":"valC"}]// 数组,数组的元素是
                    };
        
        // ======= json数据取值 ======
        // var value = json对象.key
        var v1 = jsopObj1.username; // admin
        var v2 = jsopObj3.age; // 18
        var v3 = jsopObj3.sex; // true
        var v4 = jsopObj3.score; // Array
        var v5 = jsopObj3.jsonArr; // Array
        var v6 = jsopObj3.jsonArr[1].keyB; // Array
        console.log(v1);
        console.log(v2);
        console.log(v3);
        console.log(v4);
        console.log(v5);
        console.log(v6);

        // ======= json数据赋值 ======
        jsopObj3.jsonArr[1].keyB = 1111;
        console.log(jsopObj3.jsonArr[1].keyB);

JSON对象和JSON字符串之间的转换

 

AJAX

Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。

       Ajax = 异步 JavaScript 和 XML 或者是 HTML(标准通用标记语言的子集)。

       Ajax 是一种用于创建快速动态网页的技术。

       Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

       通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

       传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。

       --> 异步请求,浏览器地址栏不改变,进行局部刷新。

原生javascript操作ajax的步骤麻烦,JQuery将ajax操作封装后,更方便使用.

$.get

$.get(url, [data], [callback], [type]) 发送get请求

url : 请求路径,必填

data: 数据,可选,格式是json格式

callback: 成功回调函数.可选

type: 返回的数据类型,可选,一般不设置

后台就是普通的servlet

 

$.post

与get请求一样,只是请求方式不同,自行演示…

$.ajax

$.ajax(url,[settings])

url: 请求路径,但是一般不使用,因为settings中也有url设置

settings: 对ajax请求的设置,里面30+选项,都是可选

[我们只对其中几个常用的选项做出解释]

url: 请求路径,String

type: 请求方式,String,默认是”GET”/”get”,可选post,put,delete等

data: 请求参数,发送到后端的数据.

     格式可以是表单数据,json数据

       dataType: 预期的服务器返回的数据类型,(一般不设置)

contentType: 发送至服务器的内容编码类型

默认:”application/x-www-from-urlencoded” (发送表单数据时就是这种内容类型),如果向后台发送json数据时,一般会指定为”application/json”

       success:function(data) {} :成功的回调函数,data就是后台返回的数据

       error:function(){}        失败的回调函数

  <body>
  <button id="btn">发送ajax请求</button>
  <script src="/js/jquery-2.1.0.min.js"></script>
  <script type="text/javascript">
    var btn = $("#btn");
    btn.click(function () {
        $.ajax({
            url:"/ajax",
            type:"post",
            data:"id=1&name=admin",
            success:function (data) {
                console.log(data);
            },
            error:function () {
                alert("服务器正忙,请稍后再试...")
            }
        })
    });
  </script>
  </body>
@WebServlet("/ajax")
public class AJAXServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("==================get==================" );

        resp.setContentType("text/html;charset=utf-8");
        System.out.println("id = "+req.getParameter("id"));
        System.out.println("name = "+req.getParameter("name"));

        System.out.println(1/0 );

        PrintWriter out = resp.getWriter( );
        out.write("{\"code\":200,\"msg\":\"请求成功\"}");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("==================post==================" );
        resp.setContentType("text/html;charset=utf-8");
        System.out.println("id = "+req.getParameter("id"));
        System.out.println("name = "+req.getParameter("name"));

        PrintWriter out = resp.getWriter( );
        out.write("{\"code\":200,\"msg\":\"请求成功\"}");
    }
}

练习:

需求: 注册,输入用户名,使用ajax异步交互对名字进行校验

     数据库中有该名字,则禁止注册,无该名字,就可以注册

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <style>
        input{
            width: 350px;
            height: 50px;
            font-size: 43px;
        }
    </style>
</head>
<body>
    用户名<input id="username" type="text"><span id="tip"></span>
    <script src="/js/jquery-2.1.0.min.js"></script>
    <script type="text/javascript">
        var username = $("#username");
        var tip = $("#tip");
        username.blur(function () {
            // 获得输入框的值
            var val = username.val();
            $.ajax({
                url:"/regist",
                data:"name="+val,
                type:"get",
                success:function (data) {
                    var ret = JSON.parse(data);
                    if (ret.code == 200) {
                        tip.text(ret.msg);
                        tip.css({color:"green",fontSize:"43px"})
                    }else{
                        tip.text(ret.msg);
                        tip.css({color:"red",fontSize:"43px"})
                    }
                }
            })
        })
    </script>
</body>
</html>
@WebServlet("/regist")
public class RegistServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");

        String name = req.getParameter("name");
        /**
         * 无数据库,假设,admin,root禁止注册,其他均可
         * ---------------------------------
         * code : 200,可以注册|500 ,不可以注册
         */
        String json ="";
        if ("admin".equals(name) || "root".equals(name)){
            json ="{\"code\":500,\"msg\":\"用户名已存在\"}";
        } else {
            json ="{\"code\":200,\"msg\":\"可以注册\"}";
        }

        resp.getWriter().write(json);
    }
}

ajax提交整个表单数据-form形式数据

问题: 单独获得每一个输入框对象,然后获得其值.后再拼接成数据格式

var v1 = $(“#id1”);

var v2 = $(“#id1”);

“id1=”+v1+”&id2=”+v2 è id1=v1&id2=v2

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

以上方式,太繁琐,JQuery提供了一个方法serialize(),可以将整个表单的数据直接序列化成如下格式

“k1=v1&k2=v2&k3=v3…”

编写前端页面: 

<form >

    用户名<input type="text" name="username"><br>
    密码<input type="password" name="password"><br>
    性别<input type="radio" name="sex" value="1">男
        <input type="radio" name="sex" value="2">女<br>
    学科<input type="checkbox" name="subject" value="java">java
        <input type="checkbox" name="subject" value="html">html
        <input type="checkbox" name="subject" value="python">python<br>
    籍贯<select name="province">
            <option value="hn">河南</option>
            <option value="hb">河北</option>
            <option value="bj">北京</option>
        </select><br>
    <input id="btn" type="button" value="注册">
</form>
    <script src="/js/jquery-2.1.0.min.js"></script>
    <script type="text/javascript">
        $("#btn").click(function () {
           var data = $("form").serialize();
            $.ajax({
                url:"/regist2",
                data:data,
                type:"post",
                success:function (data) {
                    var ret = JSON.parse(data);
                    if (ret.code == 200) {
                        alert(ret.msg);
                    }else{
                        alert(ret.msg);
                    }
                }
            })
        });
    </script>
</body>

创建Servlet,配置路径:

  @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");

        System.out.println(req.getParameter("username"));
        System.out.println(req.getParameter("password"));
        System.out.println(req.getParameter("sex"));
        System.out.println(req.getParameter("subject"));
        System.out.println(req.getParameter("province"));
        String json = "{\"code\":200,\"msg\":\"OK\"}";

        resp.getWriter().write(json);
    }

ajax提交整个表单数据-json形式数据

同理,JQuery也提供了一个方法serializeArray(),将整个表单的数据转换为json数据形式

                                                   同时contentType也要设置为:"application/json"

 如果前端发送的数据内容格式为:contentType:"application/json",
          即发送到后台的是json数据
          req.getParameter()这种方式接收不到数据
         原生的servlet,json是以输入流的形式在请求中.
         所以,获取json数据,就是从输入流读数据
        BufferedReader reader = req.getReader( );

表单和 上述表单一致,此处只列出不同之处 

        $("#btn").click(function () {
           var data = $("form").serializeArray();
           console.log(data);
            $.ajax({
                url:"/regist2",
                data:data,
                type:"post",
                contentType:"application/json",
                success:function (data) {
                    var ret = JSON.parse(data);
                    if (ret.code == 200) {
                        alert(ret.msg);
                    }else{
                        alert(ret.msg);
                    }
                }
            })
        });
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");

        /**
         * req.getParameter() 这会获得内容类型会表单的数据
         * 即contentType:"application/x-www-form-urlencoded",
         */
       // System.out.println(req.getParameter("username"));
       // System.out.println(req.getParameter("password"));
       // System.out.println(req.getParameter("sex"));
        //System.out.println(req.getParameter("subject"));
       // System.out.println(req.getParameter("province"));

        /**
         * 如果前端发送的数据内容格式为:contentType:"application/json",
         * 即发送到后台的是json数据
         * req.getParameter()这种方式接收不到数据
         * ---------------------------------------------------
         * 原生的servlet,json是以输入流的形式在请求中.
         * 所以,获取json数据,就是从输入流读数据
         */

        // 缓冲字符输入流
        BufferedReader reader = req.getReader( );
        String line = null;
        while((line =reader.readLine()) != null) {
            System.out.println(line ); // 读到的是form字符串
        }

        String json = "{\"code\":200,\"msg\":\"OK\"}";
        resp.getWriter().write(json);
    }

总结

前端的内容类型为 contentType=”application/json” , 后端就需要使用处理json的形式接收数据

前端的内容类型为contentType=”application/x-www-form-urlencoded”,后端就以正常的表单形式接收数据(没有指定contentType时默认为”application/x-www-form-urlencoded”)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSon和Ajax 的相关文章

  • 在闪亮的数据表中为每个单元格显示工具提示或弹出窗口?

    有没有什么方法可以为 r闪亮数据表中的每个单元格获取工具提示 有很多方法可以获取悬停行或列 但我找不到一种方法来获取行和列索引并为每个单元格显示不同的悬停工具提示 任何人都可以修改以下代码吗 library shiny library DT
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • Javascript - 将值从下拉框传递到 Google Maps API

    我正在使用 Google 地图 API 为一家出租车公司创建报价表 目前 用户在 2 个文本框中输入出发点和接载点 API 会计算两点之间的距离以及行程费用 我正在尝试添加两个具有设定位置的下拉框 以便用户可以选择这些位置之一或使用文本框输
  • 未捕获的错误:找不到模块“jquery”

    我在用Electron https github com atom electron制作桌面应用程序 在我的应用程序中 我正在加载一个外部站点 Atom 应用程序之外 可以说http mydummysite index html http
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • 单击关闭按钮后不显示 Google 一键登录 UI

    我正在尝试按照本指南使新的谷歌一键登录工作 https developers google com identity one tap web https developers google com identity one tap web
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • 类型“typeof import("/home/kartik/Desktop/Ecommerce/ecommerce/node_modules/firebase/index")”上不存在属性“auth”。 TS(2339)

    我是 FireBase 的初学者 我正在尝试使用 Angular 通过 FireBase 实现 Google 登录 我在 auth 时收到上述错误 我特此附上login component ts和package json package l
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • JavaScript onresize 事件多次触发

    我在尝试仅在触发 onresize 事件时运行一次函数时遇到一些麻烦 我已经看过这个问题DOM onresize 事件 https stackoverflow com questions 1500312 javascript onresiz
  • 数据表日期范围过滤器

    如何添加日期范围过滤器 like From To 我开始进行常规搜索和分页等工作 但我不知道如何制作日期范围过滤器 我正在使用数据表 1 10 11 版本 My code var oTable function callFilesTable
  • 如何在 Google 地图 V3 中创建编号地图标记?

    我正在制作一张上面有多个标记的地图 这些标记使用自定义图标 但我还想在顶部添加数字 我已经了解了如何使用旧版本的 API 来实现这一点 我怎样才能在V3中做到这一点 注意 当您将鼠标悬停在标记上时 标题 属性会创建一个工具提示 但我希望即使
  • 如何在 javascript 正则表达式中匹配平衡分隔符?

    我原以为这个问题是不可能的 据我所知 Javascript 的正则表达式既没有递归插值 也没有漂亮的 NET 平衡组功能 但问题就在那里 如问题 12 所示正则表达式 alf nu http regex alf nu 匹配平衡对 lt an

随机推荐

  • osgEarth的Rex引擎原理分析(一一四)rex与mp引擎的关系

    目标 一一三 中的问题201 rex与mp都是osgEarth加载地理高程和影像的引擎 rex比mp新 功能更强大 rex引擎支持随机瓦片加载 地图颜色渐变 更快的添加删除 待继续分析列表 9 earth文件中都有哪些options 九 中
  • wangeditor富文本引用、表格使用问题

    wangeditor富文本组件问题 问题介绍 具体情况 解决方案 css修改 说明 问题介绍 本文记录了wangeditor开发中遇到的一个问题 之前在使用wangeditor的时候因为时间紧张没有过多研究 后续项目测试 测出来发现编辑器中
  • SAP系统权限配置一

    1 系统权限的重要性 2 SAP系统环境 在测试环境做客户化权限的配置测试 开发系统中做对应的开发 不允许直接正式系统环境中做客户化配置以及开发 只能通过传输的形式 3 SAP权限的基本概念 这边后续都是ABAP开发顾问来分配和定义的 4
  • 在项目中,关于前端实现数据可视化的技术选择

    前言 在项目中 数据可视化以图表 报表类型为主 需求背景 技术框架是Vue2 x版本 组件库是Ant Design of Vue 能够支撑足够多的图表类型开发 图表大小 位置能够随意变动 图表样式需要支持丰富多样的用户配置 强大 开放的图表
  • 计算机专业数学建模结课论文,数学建模论文范文2篇

    利用数学知识解决现实生活的具体问题了成为当今数学界普遍关注的内容 利用建立数学模型解决实际问题的数学建模活动也应运而生了 下面是秋天网小编为大家整理的数学建模论文 供大家参考 数学建模论文范文一 初中数学建模教学研究 数学 源于人们对生产与
  • Snapd出错记录

    突然断电导致无法访问所有应用商店安装的应用 即snapd出问题 访问systemctl status snapd service无法访问 如图 查阅了很多资料 有用的只有重新安装 重新安装snapd sudo apt autoremove
  • 常用限流算法的应用场景和实现原理

    在高并发业务场景下 保护系统时 常用的 三板斧 有 熔断 降级和限流 今天和大家谈谈常用的限流算法的几种实现方式 这里所说的限流并非是网关层面的限流 而是业务代码中的逻辑限流 限流算法常用的几种实现方式有如下四种 计数器 滑动窗口 漏桶 令
  • 关于torch.jit.trace在yolov8中出现的问题

    关于torch jit trace在yolov8中出现的问题 疑问 1 为什么yolov8不能直接torch jit trace 需要经过图像检测后才能 且检测后self net发生变化 而2中的第一版yolov5可以直接torch jit
  • Qt翻金币小游戏详细教程(内涵所有源码、图片资源)

    一 项目简介 翻金币项目是一款经典的益智类游戏 我们需要将金币都翻成同色 才视为胜利 首先 开始界面如下 点击start按钮 进入下层界面 选择关卡 在这里我们设立了20个关卡供玩家选择 假设我们点击了第1关 界面如下 如果想要赢取胜利 我
  • django项目2022

    django项目 pip install i https pypi tuna tsinghua edu cn simple django 2 2 3 pip install i https pypi tuna tsinghua edu cn
  • RNA-seq——上游分析练习2(数据下载+trim-galore+hisat2+samtools+featureCounts)

    目录 软件安装 新建文件夹 一 下载数据 二 质控过滤 1 数据质量检测 2 数据质量控制 3 对处理后的数据再次QC 三 序列比对 1 hisat2比对 2 flagstat检查一下结果 四 featureCounts定量 写在前面 本文
  • YOLOv3手部检测

    YOLOv3手部检测 开源项目地址 https codechina csdn net EricLee yolo v3 该项目包含 YOLOv3和YOLOv3 tiny的手部检测 脸部检测 人检测 安全帽检测 交通工具检测 本文测试了手部检测
  • python之重复值(duplicated)

    Duplicated函数功能 查找并显示数据表中的重复值 这里需要注意的是 当两条记录中所有的数据都相等时duplicated函数才会判断为重复值 duplicated支持从前向后 first 和从后向前 last 两种重复值查找模式 默认
  • 磁控可变电感制作

    主电感的制作 绕制电感 主电感的绕组直接绕在骨架上 一共19匝 根据流过的电流大小选择所用利兹线的股数 仿真结果显示最大电流为3A左右 利兹线若需要耐压高可以买这种包了膜的 但是厚一点 不利于绕制 直接用普通不包膜的即可 然后将两个线接到接
  • C语言-蓝桥杯-基础练习 分解质因数

    问题描述 求出区间 a b 中所有整数的质因数分解 输入格式 输入两个整数a b 输出格式 每行输出一个数的分解 形如k a1a2a3 a1 lt a2 lt a3 k也是从小到大的 具体可看样例 样例输入 3 10 样例输出 3 3 4
  • Python Pandas数据统计函数以及数据排序

    有如下一张表s3 1 汇总类统计 生成各项数字列的汇总数据 s3 describe s3 aqi max s3 aqi mi
  • Android优化总结

    目录介绍 1 OOM和崩溃优化 1 1 OOM优化 1 2 ANR优化 1 3 Crash优化 2 内存泄漏优化 2 0 动画资源未释放 2 1 错误使用单利 2 2 错误使用静态变量 2 3 handler内存泄漏 2 4 线程造成内存泄
  • Windows配置万德(Wind)量化接口

    原理 wind会在python的第三方库中安装一个属于wind的库 文章目录 步骤1 确定python的路径 步骤2 配置wind的接口 步骤3 检查配置 步骤4 使用python提取任意的wind数据 步骤1 确定python的路径 如果
  • css新特性 - contain

    属性介绍 隔离样式 布局和渲染 开发人员可以使用这个 contain 属性来限制指定的DOM元素和它的子元素同页面上其它内容的联系 我们可以把它看做一个iframe 跟iframe很相似 它能建立起一个边界 产生一个新的根布局 保证了它和它
  • JSon和Ajax

    JSON 什么是 JSON JSON JavaScript Object Notation 是轻量级的文本数据交换格式 主要用来web服务前后端传输数据 JSON 独立于语言 JSON 使用 Javascript语法来描述数据对象 但是 J