前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ajax&JSON 应用开发

Ajax&JSON 应用开发

作者头像
Breeze.
发布2022-07-12 15:01:38
9750
发布2022-07-12 15:01:38
举报

Ajax基础

Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 Ajax可以在不刷新页面的前提下,进行页面局部更新

Ajax使用流程

  1. 创建XmlHttpRequest对象
代码语言:javascript
复制
var xmlhttp;
if (window.XMLHttpRequest) {
    //IE7+、FureFox、Chrome、Opear、Safari 浏览器执行代码
    xmlhttp = new XMLHttpRequest();
} else {
    // IE6、IE5
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
  1. 发送Ajax请求
代码语言:javascript
复制
// 创建请求(参数1<发送方式> , 参数2<完整URL或URI>)
xmlhttp.open("GET","/content");
// 发送到服务器
xmlhttp.send();
  1. 处理服务器响应
代码语言:javascript
复制
xmlhttp.onreadystatechange // 事件用于监听Ajax的执行状态
xmlhtpp.readyState // 说明XMLHttpRequest当前状态
xmlhttp.status // 服务器响应状态码,200:成功,404:未找到...

xmlhttp.onreadystatechange = function () {
    // 响应已被接收且服务器处理成功时才执行
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        // 获取响应体为本
        var t = xmlhttp.responseText;
        // 对服务器结果进行处理
        console.log(t);
    }
}
image-20220707165617493
image-20220707165617493

JSON 入门

JavaScript Object Notation(JavaScript 对象表示法) JSON 是轻量级的文本数据交换格式,JSON 独立于语言,居右自我描述性,更易理解

代码语言:javascript
复制
{
    "sites":[
        {"name":"百度","url":"www.baidu.com"},
        {"name":"京东","url":"www.jd.com"},
        {"name":"淘宝","url":"www.taobao.com"}
    ]
}

JSON语法规则

  • 数据由键(Key)/值(value)描述,由冒号分隔
  • 大括号代表一个完整的对象,拥有多个键/值
  • 中括号保存数组,多个对象之间使用逗号(,)分隔

JavaScript操作JSON

JavaScript天然支持解析JSON语法

Ajax应用

利用Jackson实现JSON序列化输出

image-20220708150703709
image-20220708150703709
Jackson

Jackson是国内外著名的Java开源JSON序列化组件

Maven仓库:com.fasterxml.jackson.core : jackson-databind : 2.13.3 - Maven Central Repository Search

代码语言:javascript
复制
<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.3</version>
    </dependency>
</dependencies>
代码语言:javascript
复制
// ObjectMapper Jackson核心对象
ObjectMapper objectMapper = new ObjectMapper();
// 将对象转化为JSON 序列化
String json = objectMapper.writeValueAsString(list);
response.setContentType("text/json;charset=utf-8");
response.getWriter().println(json);

添加依赖后:进入Project Structure > Artifacts > 选中jar包

image-20220708155719472
image-20220708155719472

选中Put into /WEB_INF/lib:添加到Maven项目中

image-20220708155743353
image-20220708155743353

Ajax处理JSON数据

代码语言:javascript
复制
<script>
    var xmlhttp;
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.open("GET", "/news");
    xmlhttp.send();

    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            var news = xmlhttp.responseText;
            var json = JSON.parse(news);
            for (let i = 0; i < json.length; i++) {
                let news = json[i];
                let container = document.getElementById("container");
                container.innerHTML = container.innerHTML + "<h3>" + news.title + "</h3>" + "<p>" + news.content + "</p>";
            }
        }
    }
</script>
Axios快速入门

axios中文网|axios API 中文文档 | axios (axios-js.com)

代码语言:javascript
复制
<script>
    // 参数1:对应的URI,参数2:服务器传递参数
    // then: 处理成功  catch:处理失败
    axios.get("/news", {params: {"t": "tiktok"}}).then(function (response) {
        console.log(response);
        let json = response.data;
        for (let i = 0; i < json.length; i++) {
            let news = json[i];
            let container = document.getElementById("container");
            container.innerHTML = container.innerHTML + "<h3>" + news.title + "</h3>" + "<p>" + news.content + "</p>";
        }
    }).catch(function (error) {
        console.log(error);
    });
</script>
代码语言:javascript
复制
<script>
    // 参数1:URI,参数2:请求参数字符串,请求头参数
    // axios.post("/news1", "t=tiktok&l=abc", {headers: {"content-tpye": "application/x-www-form-urlencoding"}})或axios.post("/news", params)
    const params = new URLSearchParams();
    params.append("t", "tiktok");
    params.append("t", "abc");
    axios.post("/news", params)
        .then(function (response) {
        let json = response.data;
        for (let i = 0; i < json.length; i++) {
            let news = json[i];
            let container = document.getElementById("container");
            container.innerHTML = container.innerHTML + "<h3>" + news.title + "</h3>" + "<p>" + news.content + "</p>";
        }
    })
        .catch(function (error) {
        console.log(error);
    });
</script>

同步与异步的区别

同步是在服务器未返回JSON前,JS程序一直处于阻塞等待的状态 异步是在服务器未返回JSON钱,不阻塞程序,Ajax通过回调获取结果

image-20220708185039431
image-20220708185039431
代码语言:javascript
复制
<script>
    var xmlhttp;
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    // Ajax默认以异步运行,添加参数false执行同步
    xmlhttp.open("GET", "/news?t=tiktok");
    xmlhttp.send();
    console.log("请求数据已发送")
    // 参数为false则不会运行onreadystatechange
    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            var news = xmlhttp.responseText;
            console.log(news);
            var json = JSON.parse(news);
            for (let i = 0; i < json.length; i++) {
                let news = json[i];
                let container = document.getElementById("container");
                container.innerHTML = container.innerHTML + "<h3>" + news.title + "</h3>" + "<p>" + news.content + "</p>";
            }
        }
    }
</script>

实现二级联动菜单

代码语言:javascript
复制
@WebServlet("/channel")
public class ChannelServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 父级菜单
        String level = request.getParameter("level");
        // 子级菜单
        String parent = request.getParameter("parent");
        List<Channel> list = new ArrayList();
        if (level.equals("1")) {
            list.add(new Channel("ai", "人工智能"));
            list.add(new Channel("web", "前端开发"));
        } else if (level.equals("2")) {
            if (parent.equals("ai")) {
                list.add(new Channel("dl", "深度学习"));
                list.add(new Channel("cv", "计算机视觉"));
                list.add(new Channel("nlp", "自然语言处理"));
            } else if(parent.equals("web")) {
                list.add(new Channel("html", "HTML超文本标记语言"));
                list.add(new Channel("css", "CSS3样式表"));
                list.add(new Channel("javascript", "JavaScript脚本"));
            }
        }
        // 实例化ObjectMapper
        ObjectMapper mapper = new ObjectMapper();
        // 调用 writeValueAsString 将 list集合转为JSON
        String json = mapper.writeValueAsString(list);
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().println(json);
    }
}
代码语言:javascript
复制
<script>
    // 加载一级菜单
    const lv1 = document.getElementById("lv1");
    axios.get("/channel", {params: {"level": 1}})
        .then(function (response) {
            let json = response.data;
            console.log(json);
            for (let i = 0; i < json.length; i++) {
                let channel = json[i];
                //每次访问接口,都追加内容到select中
                // Option 参数1:显示的文字,参数2:为value值
                lv1.options.add(new Option(channel.name, channel.code));
            }
        })
        .catch(function (error) {
            console.log(error);
        });
    // 二级菜单
    const lv2 = document.getElementById("lv2");
    // 被选项发生变化的时候执行
    lv1.onchange = function () {
        // 参数2:要查询的二级,一级当前code
        axios.get("/channel", {
            params: {
                "level": 2,
                "parent": lv1.value
            }
        })
            .then(function (response) {
                let json = response.data;
                console.log(json);
                // 将lv2的长度设置为0,就可以防止叠加数据
                lv2.length = 0;
                for (let i = 0; i < json.length; i++) {
                    let channel = json[i];
                    lv2.options.add(new Option(channel.name, channel.code));
                }
            })
            .catch(function (error) {
                console.log(error);
            });
    }
</script>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Ajax基础
    • Ajax使用流程
    • JSON 入门
      • JSON语法规则
      • JavaScript操作JSON
      • Ajax应用
        • 利用Jackson实现JSON序列化输出
          • Jackson
        • Ajax处理JSON数据
          • Axios快速入门
        • 同步与异步的区别
          • 实现二级联动菜单
          相关产品与服务
          NLP 服务
          NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档