Ajax和JSON的基本用法

news2024/9/29 19:17:10

局部请求页面不会变化,返回的响应我们要动态获取,获取后选择数据更新区域。

<body>
<input id="btnLoad" type="button" value="加载">
<div id="divContent"></div>
<script>
    //获取点击按钮
    document.getElementById("btnLoad").onclick=function (){
     var xmlhttp;
     //根据不同的浏览器,创建xmlhttp的对象
     if(window.XMLHttpRequest){
         xmlhttp = new XMLHttpRequest();
     }else{
         xmlhttp=new ActiveXObject("eage.xmlhttp")
     }
        console.log("xmlhttpRequest", xmlhttp);
        //创建一个请求
        xmlhttp.open("GET", "/content");
        //发送一个请求
        xmlhttp.send();
        //监听ajax的执行过程
        xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                //获取响应的文本
               var t=xmlhttp.responseText;
                console.log(t);
                console.log(document.getElementById("divContent").innerHTML);
                document.getElementById("divContent").innerHTML=document.getElementById("divContent").innerHTML+"<br/>"+t;
            }
        };
    }
</script>

全局请求会更新整个页面例子如下。

<body>
    <form action="/request" method="post">
      <input name="username"/>
      <input name="password" type="password"/>
      <input type="submit">
    </form>
</body>
@WebServlet("/request")
public class RequestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse respose) throws ServletException, IOException {
        respose.getWriter().println("get");直接更新了整个页面
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse respose) throws ServletException, IOException {
        respose.getWriter().println("post");
    }
}

respose.getWriter().println("get");会将原来的页面销毁掉,重新生成另一张页面,但是在原来的页面中有不需要刷新的页面,我们想要的效果只是小部分区域进行显示刷新出来的内容,这时就要用到Ajax。

[
    {
        "empno": "7369",数字可以加双引号也可以不加
        "ename": "李宁",
        "job": "软件工程师",
        "hiredate": "2015-02-2",
        "salary": 1300,
        "dname": "研发部"
    },
    {
        "empno": "73691",
        "ename": "李上",
        "job": "软件工程师",
        "hiredate": "2015-02-2",
        "salary": 1300,
        "dname": "研发部"
    }
]

JS如何展示json数据利用json数据如下

<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <script type="text/javascript">
    var employeeList=
    [
      {
        "empno": "7369",
        "ename": "李宁",
        "job": "软件工程师",
        "hiredate": "2015-02-2",
        "salary": 1300,
        "dname": "研发部"
      },
      {
        "empno": "73691",
        "ename": "李上",
        "job": "软件工程师",
        "hiredate": "2015-02-2",
        "salary": 1300,
        "dname": "研发部"
      }
    ]
    for(var i=0;i<employeeList.length;i++){
      var employee=employeeList[i];
      console.log(employee);
      document.write("<h1>");
      document.write(employee.ename);
      document.write(employee.empno);
      document.write(employee.job);
      document.write("</h1>");
    }
  </script>
</head>

注意:ajax请求返回的不再与展现相关,而是纯纯的数据,浏览器接受后要考虑如何展示。

两个数据转换核心问题:

  1. 数据对象序列化为JSON字符串----JacKson解决序列化问题

  1. JSON字符串如何转换成数据对象--

@WebServlet("/news")
public class NewServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<News> list = new ArrayList<>();
        list.add(new News("TIOBE:2018编程语言排行趋势","2018","TIBOT","...."));
        list.add(new News("TIOBE:2017编程语言排行趋势","2017","TIBOT","...."));
        list.add(new News("TIOBE:2016编程语言排行趋势","2016","TIBOT","...."));
        //序列化过程,可能报错
        ObjectMapper objectMapper=new ObjectMapper();
        String json = objectMapper.writeValueAsString(list);
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().println(json);
    }
}

Tomcat配置问题:Warning:The selected directory is not a TomEE home

解决:tomcat选择的时候选错了

错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099; nested exception is:

java.net.BindException: Address already in use: JVM_Bind

解决:端口占用了

解决:中途导入的jar包和依赖没有被out出来,最后允许的目录在Out,如果jar添加了,out没有,那么此时需要手动添加

反序列化过程:

<body>
    <div id="container"></div>
    <script>
       //开始纯手工处理ajax
      var xmlhttp;
      if(window.XMLHttpRequest){
        xmlhttp=new XMLHttpRequest();
      }else {
        xmlhttp=new ActiveXObject("XMLHTTP");
      }
      xmlhttp.open("GET","/news");
      xmlhttp.send();
      xmlhttp.onreadystatechange = function () {
        if(xmlhttp.readyState==4&&xmlhttp.status==200){
          var str=xmlhttp.responseText;
            //JSON.parse()方法,把字符串编程json的对象
          console.log(JSON.parse(str));
          //渲染页面(二次加工数据)
            for (var i = 0; i < json.length; i++) {
                var news=json[i];
                var container = document.getElementById("container");
                container.innerHTML = container.innerHTML + "<h2>" + news.title + "</h2>";
            }
        }
      };
    </script>
</body>

原生的ajax要创建对象,接受并且判断响应,很麻烦,有封装好的。

get方式发送请求:

<body>
<div id="container"></div>
    <script>
      // 第一个参数是对应的url是什么,,第二个向服务器传递的参数
      //axios.get('/news?t=pypl').then。。的传参方式也可
        axios.get('/news',{params:{"t":"pypl"}}).then(function (response) {
          console.log(response);
          var json=response.data;
            for (var i = 0; i < json.length; i++) {
                var news=json[i];
                var container = document.getElementById("container");
                container.innerHTML = container.innerHTML + "<h2>" + news.title + "</h2>";
            }
        }).catch(function (error) {
          console.log(error);
        });
    </script>
</body>

post方式发送请求:

    <script>
      //写法一
      //"t=pypl&1=abc连续的参数用&隔开
      //{headers:{"content-type":"application/x-www-form-urlencoded"}}手动定义请求头固定写法
      // axios.post("/news1","t=pypl&1=abc",
      //     {headers:{"content-type":"application/x-www-form-urlencoded"}})
      //写法二
      const params = new URLSearchParams();
      params.append("t","pypl");
      params.append("l","abc");
      axios.post("/news",params)
          .then(function (response) {
              console.log(response);
              var json = response.data;
              for (var i = 0; i < json.length; i++) {
                  var news = json[i];
                  var container = document.getElementById("container");
                  container.innerHTML = container.innerHTML + "<h2>" + news.title + "</h2>";
              }
          }).catch(function (error) {
              console.log(error);
          });
    </script>

异步执行代码实例:

<body>
    <div id="container"></div>
    <script>
      var xmlhttp;
      if(window.XMLHttpRequest){
        xmlhttp=new XMLHttpRequest();
      }else {
        xmlhttp=new ActiveXObject("XMLHTTP");
      }
      xmlhttp.open("GET","/news?t=pypl");
      xmlhttp.send();
      console.log("请求已经发送");
      xmlhttp.onreadystatechange = function () {
        if(xmlhttp.readyState==4&&xmlhttp.status==200){
          var str=xmlhttp.responseText;
            //JSON.parse()方法,把字符串编程json的对象
          console.log(JSON.parse(str));
          //渲染页面(二次加工数据)
            for (var i = 0; i < json.length; i++) {
                var news=json[i];
                var container = document.getElementById("container");
                container.innerHTML = container.innerHTML + "<h2>" + news.title + "</h2>";
            }
        }
      };
    </script>

结果:send没有收到响应,就执行console.log("请求已经发送");这句话,然后随着状态变化事件得到执行。

<body>
    <div id="container"></div>
    <script>
      var xmlhttp;
      if(window.XMLHttpRequest){
        xmlhttp=new XMLHttpRequest();
      }else {
        xmlhttp=new ActiveXObject("XMLHTTP");
      }
      xmlhttp.open("GET","/news?t=pypl",false);
      xmlhttp.send();
      console.log("请求已经发送");
      if(xmlhttp.readyState==4&&xmlhttp.status==200){
          var str=xmlhttp.responseText;
          //JSON.parse()方法,把字符串编程json的对象
          console.log(JSON.parse(str));
          //渲染页面(二次加工数据)
          for (var i = 0; i < json.length; i++) {
              var news=json[i];
              var container = document.getElementById("container");
              container.innerHTML = container.innerHTML + "<h2>" + news.title + "</h2>";
          }
      }
      
      xmlhttp.onreadystatechange = function () {

      };
    </script>
</body>

结果:当send执行没有结束,没有收到响应,不会执行console.log("请求已经发送");,导致事件状态变化监听失败,所以if必须提前,那么就可以执行相应的语句;

效果

准备数据

@WebServlet("/channel")
public class ChannerServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //levels为一级目录大类,parent为一级大类的code,这两个都是用户选择的参数
        //用户根据需要选择一级大类,然后根据用户的选择获取大类的code,再用parent和用户选择的比较,得到二级大类
        String level=request.getParameter("level");
        String parent = request.getParameter("parent");
        List<Channel> chlist = new ArrayList<>();
        if (level==null){
            level = "0";
        } else if (parent==null) {
            parent = "0";
        }
        if (level.equals("1")) {
            chlist.add(new Channel("ai","人工智能"));
            chlist.add(new Channel("web","前端开发"));
        }else if(level.equals("2")){
            if (parent.equals("ai")) {
                chlist.add(new Channel("dl","深度学习"));
                chlist.add(new Channel("cv","计算机视觉"));
                chlist.add(new Channel("nlp","自然语言处理"));
            } else if (parent.equals("web")) {
                chlist.add(new Channel("html","前端html"));
                chlist.add(new Channel("css","前端css"));
                chlist.add(new Channel("js","前端js"));
            }
        }
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(chlist);
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().println(json);
    }
}

实体类:

public class Channel {
    private String code;
    private String name;

    public Channel(String code, String name) {
        this.code = code;
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

前端界面发送请求:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script>
</head>
<body>
<select id="lv1" style="width: 200px;height: 30px">
  <option value="-1" selected="selected">请选择</option>
</select>

<!--//不写option标签,直接往里边添加会直接显示-->
<select id="lv2" style="width: 200px;height: 30px">
</select>
<script>
    //获取lv1标签,为了往lv1的option中放数据
    var lv1 = document.getElementById("lv1");
    axios.get("/channel",{params:{"level":1}})
        .then(function (response) {
            var json = response.data;
            console.log(json);
            for (var i=0;i<json.length;i++){
                var channel = json[i];
                //新创建的option对象,第一个参数是text,第二个是value
                // new(text?: string, value?: string,...)
                //如果有选择,那么select的value就是option的value
                lv1.options.add(new Option(channel.name, channel.code));
            }
        });
    var lv2 = document.getElementById("lv2");
    lv1.onchange=function () {
        axios.get("/channel",{params:{"level":2,"parent":lv1.value}})
            .then(function (response) {
                var json = response.data;
                //直接把之前的数据清除的办法,length=0就行了
                lv2.length=0;
                console.log(json);
                for (var i=0;i<json.length;i++){
                    var channel = json[i];
                    lv2.options.add(new Option(channel.name, channel.code));
                }
            });
    }
</script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/398700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三天吃透Kafka面试八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

前端开发者必备的Nginx知识

nginx在应用程序中的作用 解决跨域请求过滤配置gzip负载均衡静态资源服务器…nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个通用的TCP/UDP代理服务器&#xff0c;最初由俄罗斯人Igor Sysoev编写。 nginx现在几乎是众多大型网站的必用技术&#xff0c;大多数情…

好用的电脑录屏工具有哪些?电脑好用的录屏工具

现如今很多人都渐渐对录屏有了需求&#xff0c;尤其是网课老师和网络主播的从业者&#xff0c;录屏工具可以帮助他们减轻很多工作量。好用的电脑录屏工具有哪些&#xff1f; 平时在工作学习中&#xff0c;我们往往会有录制视频的需求&#xff0c;比如录制游戏视频、录制网课视频…

设计UI - Adobe xd画板及参考线

画板新建画板a. 使用预设画板大小或创建自定义画板。操作步骤&#xff1a;打开xd软件&#xff0c;点击需要建立的画板模版&#xff0c;没有则选择自定义大小。b. 使用画板工具创建其它画板。操作步骤&#xff1a;选中画板工具&#xff0c;选择需要建立的画板模版&#xff0c;没…

STM32启动模式讲解与ICP下载电路

一、官方提供的启动模式说明硬件BOOT引脚接法表格从表格可以看出有三种启动模式&#xff0c;然后对应这不同的存储器启动&#xff0c;那我们现在疑问为啥有三种不能只有一种就好&#xff0c;还有存储器启动区域怎么区分&#xff0c;有些乱&#xff0c;带着这些疑问&#xff0c;…

npm install报错unable to resolve dependency tree

一、问题背景npm install安装项目依赖时报错PS D:\test> npm install npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: vue-admin-template4.2.1 npm ERR! Found: webpack5.74.0 npm ERR! node_modules/we…

【WebSocket】在SSM项目中配置websocket

在SSM项目中配置websocket 最近在ssm项目中配置了websocket&#xff0c;踩了很多坑&#xff0c;来分享一下 本文暂不提供发送消息等内容的代码逻辑&#xff08;后续也许会补充&#xff09;&#xff0c;如果你直接复制这类可能会对配置造成更大的麻烦&#xff08;博主就是复制…

单元测试、反射、注解、动态代理

&#x1f3e1;个人主页 &#xff1a; 守夜人st &#x1f680;系列专栏&#xff1a;Java …持续更新中敬请关注… &#x1f649;博主简介&#xff1a;软件工程专业&#xff0c;在校学生&#xff0c;写博客是为了总结回顾一些所学知识点 目录单元测试、反射、注解、动态代理单元测…

一篇文综合分析Fuse!

FUSE需求 究竟什么样的需求才能用到用户文件系统&#xff1f;来看一个小例子&#xff1a; 需求是这样的。在deepin的安装器中&#xff0c;安装器就会给多分出一个分区&#xff1a;数据盘。 数据盘的主要作用是让用户存放数据文件&#xff0c;也就是以前用Windows的时候D盘或者…

YoloV7

总体来说&#xff0c;YoLoV7主要可分为主干特征提取网络&#xff08;backbone&#xff09;&#xff0c;加强特征提取网络以及SPPCSPC三个部分&#xff0c;然后再加上RepConv和YoLoHead部分。输入图片640*640*3的RGB图片&#xff0c;然后卷积、标准化&#xff08;BN&#xff09;…

QT学习笔记-QT多项目系统中如何指定各项目的编译顺序

QT学习笔记-QT多项目系统中如何指定各项目的编译顺序背景环境解决思路具体操作背景 为了更好的复用程序功能以及更优雅的管理程序&#xff0c;有经验的程序员通常要对程序进行分层和模块化设计。在QT/C这个工具中同样可以通过创建子项目的方式对程序进行模块化&#xff0c;在这…

浅谈Linux下的shell--BASH

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;shell的概念与作用我们已经学习并知道了操作系统实际上就是一款软件&#xff0c;一款用来管理计算机软硬件资源&#xff0c;为用户提供良好的执行环境的…

擎创喜报 | 名单公布!恭喜入选!

前言&#xff1a;企业数字化转型作为一种经营策略&#xff0c;指的是利用数字技术和数字化流程来改变企业的运营、管理、销售和服务方式&#xff0c;以适应数字化时代的发展趋势。一般来说&#xff0c;企业进行数字化出于以下几点考虑。提高效率&#xff1a;数字化改进了业务流…

人口老龄化背景下家政服务网络平台【附源码】

1 毕业论文&#xff08;设计&#xff09;版权使用授权书 本毕业论文&#xff08;设计&#xff09;作者同意学校保留并向国家有关部门或机构送交论文&#xff08;设计&#xff09;的复印件和电子版&#xff0c;允许论文&#xff08;设计&#xff09;被查阅和借阅。本人授权广西…

JAVA中比较对象是否相等的方式是什么?为什么重写equals就一定要重写hashcode?百天百题(3/100)

目录 JAVA中比较对象是否相等的方式是什么&#xff1f; 为什么重写equals就一定要重写hashcode&#xff1f; JAVA中比较对象是否相等的方式是什么&#xff1f; 在了解这个问题之前需要先知道&#xff1a; 1.如果对象相同&#xff0c;那么hashcode是一定相同的。 2.对象不同的…

哈希表

文章目录什么是哈希问题引入哈希函数直接定址法除留余数法 &#xff08;常用、重点&#xff09;哈希冲突哈希冲突的解决方法闭散列开散列unordered_map && unordered_set 封装实现哈希的应用位图布隆过滤器哈希经典面试题哈希切分位图应用布隆过滤器什么是哈希 在上一…

阿里巴巴商品详情爬虫数据字段解析 源代码分享 调用示例

返回数据代码段1"item": {"num_iid": "60840463360","title": "Slip-on Daily Urban Walking Shoes","desc_short": "","price": "$47.70","nick": "cn1522808546p…

TypeScript深度剖析:TypeScript 中类的理解?应用场景?

一、是什么 类&#xff08;Class&#xff09;是面向对象程序设计&#xff08;OOP&#xff0c;Object-Oriented Programming&#xff09;实现信息封装的基础 类是一种用户定义的引用数据类型&#xff0c;也称类类型 传统的面向对象语言基本都是基于类的&#xff0c;JavaScript …

好友管理系统--课后程序(Python程序开发案例教程-黑马程序员编著-第4章-课后作业)

实例3&#xff1a;好友管理系统 如今的社交软件层出不穷&#xff0c;虽然功能千变万化&#xff0c;但都具有好友管理系统的基本功能&#xff0c;包括添加好友、删除好友、备注好友、展示好友等。下面是一个简单的好友管理系统的功能菜单&#xff0c;如图1所示。 图1 好友管理系…

api接口详解大全

api接口详解大全?优秀的设计是产品变得卓越的原因设计API意味着提供有效的接口&#xff0c;可以帮助API使用者更好地了解、使用和集成&#xff0c;同时帮助人们有效地维护它每个产品都需要使用手册&#xff0c;API也不例外在API领域&#xff0c;可以将设计视为服务器和客户端之…