第18周 第2章JSON入门

news2024/9/30 5:28:02

二级联动菜单实现总结

1. 二级联动菜单的定义

二级联动菜单是一种数据联动的应用场景,在选择一级菜单项时动态加载并展示与之对应的二级菜单项。它通常用于前端通过 AJAX 与后端交互,实现数据的动态展示。

2. 应用场景举例

  • 慕课网首页:在选择“前端开发”、“后端开发”等一级分类时,右侧会动态显示对应的二级知识点列表。
  • 大型工厂:选择某个部门时动态显示该部门前100名员工信息。
  • 电商网站:选择商品一级分类(如“电子产品”)时,显示对应的二级子分类(如“手机”、“电脑”)。

3. 为什么使用 AJAX 实现二级联动菜单

对于数据量小的场景,可以一次性加载所有数据并进行本地展示。但对于数据量大的场景,如大型工厂中的部门和员工数据,加载所有数据会导致页面加载速度慢、带宽和服务器压力大。因此,使用 AJAX 根据一级菜单的选择动态加载对应的二级数据是一种更高效的做法。

4. 实现步骤

Java代码注释

package com.imooc.ajax.servlet;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.imooc.ajax.entity.Channel;

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.ArrayList;
import java.util.List;

@WebServlet("/channel")  // 将当前Servlet映射到 /channel URL路径上
public class ChannelServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取请求参数中的 level 和 parent 参数值
        String level = request.getParameter("level");
        String parent = request.getParameter("parent");
        
        // 创建一个用于存储频道数据的列表
        List<Channel> chlist = new ArrayList<>();
        
        // 判断是否请求一级频道数据
        if(level.equals("1")){
            // 添加一级频道数据:人工智能和前端开发
            chlist.add(new Channel("ai", "人工智能"));
            chlist.add(new Channel("web", "前端开发"));
        }
        // 判断是否请求二级频道数据
        else if(level.equals("2")){
            // 判断 parent 是否为 "ai"(人工智能),返回对应的二级频道数据
            if(parent.equals("ai")){
                chlist.add(new Channel("dl", "深度学习"));
                chlist.add(new Channel("cv", "计算机视觉"));
                chlist.add(new Channel("nlp", "自然语言处理"));
            }
            // 判断 parent 是否为 "web"(前端开发),返回对应的二级频道数据
            else if(parent.equals("web")){
                chlist.add(new Channel("html", "HTML超文本标记语言"));
                chlist.add(new Channel("css", "CSS级联样式表"));
                chlist.add(new Channel("js", "JavaScript脚本"));
            }
        }

        // 将频道列表对象转换为 JSON 格式字符串
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(chlist);

        // 设置响应的内容类型和编码格式
        response.setContentType("application/json;charset=utf-8");
        
        // 将 JSON 数据写入响应输出流
        response.getWriter().println(json);
    }
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>二级联动菜单示例</title>
    <!-- 引入 axios 库用于 AJAX 请求 -->
    <script src="/js/axios.js"></script>
</head>
<body>
    <!-- 一级频道下拉框,默认有一个“请选择”选项 -->
    <select id="lv1" style="width: 200px;height: 30px">
        <option value="-1" selected="selected">请选择</option>
    </select>
    
    <!-- 二级频道下拉框,初始无选项 -->
    <select id="lv2" style="width: 200px;height: 30px"></select>
    
    <script>
        // 获取一级频道下拉框的 DOM 对象
        var lv1 = document.getElementById("lv1");

        // 发送 AJAX 请求获取一级频道数据
        axios.get("/channel" , {params:{"level" : 1}})
            .then(function (response){
                // 获取服务器返回的 JSON 数据
                var json = response.data;
                console.log(json); // 在控制台打印数据,便于调试
                
                // 遍历 JSON 数据,将每个频道添加为下拉框的选项
                for(var i = 0 ; i  < json.length ; i++){
                    var channel = json[i];
                    lv1.options.add(new Option(channel.name, channel.code));
                }
            });
        
        // 获取二级频道下拉框的 DOM 对象
        var lv2 = document.getElementById("lv2");

        // 当一级频道的选择发生变化时触发事件
        lv1.onchange = function(){
            // 发送 AJAX 请求获取对应的二级频道数据
            axios.get("/channel" , {params:{"level":2,"parent" : lv1.value}})
                .then(function(response){
                    // 获取服务器返回的 JSON 数据
                    var json = response.data;
                    console.log(json); // 在控制台打印数据,便于调试
                    
                    // 清空二级频道下拉框的所有选项
                    lv2.length = 0;
                    
                    // 遍历 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>

5. 实现效果

  • 当选择一级频道时,动态加载并展示对应的二级频道数据。
  • 每次切换一级频道,二级频道数据都会被清空并重新加载,避免数据叠加问题。
  • 如果选择无效的一级频道(如默认选项),二级频道不会加载数据。

6. 拓展应用

在二级联动的基础上,可以扩展实现三级联动、四级联动等更复杂的数据联动场景。只需按照相同的逻辑,逐级加载数据即可。

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

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

相关文章

资质申请中常见的错误有哪些?

在申请建筑资质的过程中&#xff0c;企业可能会犯一些常见的错误&#xff0c;以下是一些需要避免的错误&#xff1a; 1. 资料准备不充分&#xff1a; 申请资质需要提交大量的资料&#xff0c;包括企业法人资料、财务报表、业绩证明等。资料不齐全或不准确都可能导致申请失败。…

多线程(一):线程的基本特点线程安全问题ThreadRunnable

目录 1、线程的引入 2、什么是线程 3、线程的基本特点 4、线程安全问题 5、创建线程 5.1 继承Thread类&#xff0c;重写run 5.1.1 创建Thread类对象 5.1.2 重写run方法 5.1.3 start方法创建线程 5.1.4 抢占式执行 5.2 实现Runnable&#xff0c;重写run【解耦合】★…

MySQL-数据库设计

1.范式 数据库的范式是⼀组规则。在设计关系数据库时&#xff0c;遵从不同的规范要求&#xff0c;设计出合理的关系型数 据库&#xff0c;这些不同的规范要求被称为不同的范式。 关系数据库有六种范式&#xff1a;第⼀范式&#xff08;1NF&#xff09;、第⼆范式&#xff08;…

【Mysql】SQL语言基础

1、SQL的概述 SQL全称&#xff1a;Structured Query Language,是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统systemr上实现。 美国国家标准局&#x…

亚信安全发布第34期《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件91起&#xff0c;近三周勒索事件数量较为稳定。从整体上看&#xff0c;Ransomhub是影响最严重的勒索家族&#xff1b;Play和ElDorado恶意家族也是两个活动频繁的恶意家族&#xff0c;需要注意防范。本周&#xff0c;土耳其公司巴克皮…

小红书2024秋招后端开发(Java工程师、C++工程师等)

前几天做了美团&#xff0c;OPPO的秋招笔试题&#xff0c;然后又做了一场小红书&#xff0c;总体难度我觉得都差不多&#xff0c;涉及到的知识点要么是语法模拟&#xff0c;或者就是一些基础算法&#xff0c;所以这样看秋招编程题还是很简单的&#xff0c;对于笔试我们还要把除…

深刻理解Redis集群(下):Redis 哨兵(Sentinel)模式

背景 现在对3个节点的sentinel进行配置。sentinel的配置文件在redis的安装目录中已经存在&#xff0c;只需要复制到指定的位置即可。 sentinel是独立进程&#xff0c;有对应的脚本来执行。 基于之前的redis 一主二从的架构&#xff0c;我们继续启动3个sentinel进程。 哨兵模式的…

使用微服务Spring Cloud集成Kafka实现异步通信

在微服务架构中&#xff0c;使用Spring Cloud集成Apache Kafka来实现异步通信是一种常见且高效的做法。Kafka作为一个分布式流处理平台&#xff0c;能够处理高吞吐量的数据&#xff0c;非常适合用于微服务之间的消息传递。 微服务之间的通信方式包括同步通信和异步通信。 1&a…

GPU参数指标

以英伟达的A800卡为例&#xff0c;简单聊聊GPU卡的核心参数指标&#xff0c;A800的核心指标主要有5个&#xff0c;为算力、显存大小、显存带宽、功耗情况和卡间互联速率。 性能&#xff1a;则可以理解为货车对不同货物类型的马力大小&#xff0c;决定能“拉动”多少重量的货&…

实用工具推荐---- PDF 转换

直接上链接&#xff1a;爱PDF |面向 PDF 爱好者的在线 PDF 工具 (ilovepdf.com) 主要功能如下&#xff1a; 全免费&#xff01;&#xff01;&#xff01;&#xff01;

什么是 Apache Ingress

Apache Ingress 主要用于管理来自外部的 HTTP 和 HTTPS 流量&#xff0c;并将其路由到合适的 Kubernetes 服务。 容器化与 Kubernetes 是现代云原生应用程序的基础。Kubernetes 的主要职责是管理容器集群&#xff0c;确保它们的高可用性和可扩展性&#xff0c;同时还提供自动化…

httpsok-v1.17.0-SSL通配符证书自动续签

&#x1f525;httpsok-v1.17.0-SSL通配符证书自动续签 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具&#xff0c;基于全新的设计理念&#xff0c;专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业&#xff0c;稳定、安全、可靠。 一行命令&#xff0c;一分钟轻…

Java中使用接口实现回调函数的详解与示例

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

【2025】springboot基于微信小程序记账本的设计与实现(源码+文档+调试+答疑)

文章目录 前言一、主要技术&#xff1f;二、项目内容1.整体介绍&#xff08;示范&#xff09;2.运行截图3.系统测试 总结更多项目 前言 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;记账本小…

【游戏分组】

题目来源 from itertools import combinations def get_input(): """获取输入的整数列表。""" return list(map(int, input("请输入10个整数&#xff08;用空格分隔&#xff09;: ").split())) def get_min_difference(arr): &q…

OpenCV C++霍夫圆查找

OpenCV 中的霍夫圆检测基于 霍夫变换 (Hough Transform)&#xff0c;它是一种从边缘图像中识别几何形状的算法。霍夫圆检测是专门用于检测图像中的圆形形状的。它通过将图像中的每个像素映射到可能的圆参数空间&#xff0c;来确定哪些像素符合圆形状。 1. 霍夫变换的原理 霍夫…

【韩顺平Java笔记】第3章:变量

只记录我觉得重点的&#xff0c;自用&#xff0c;如果有漏的请自己看视频 文章目录 33. 内容梳理34. 变量原理34.1 为什么需要变量35. 变量概念35.1 概念35.2 变量使用的基本步骤36. 变量入门36.1 变量使用入门案例 37. 变量细节37.1 变量使用注意事项 38. 加号使用38.1 程序中…

身份证号、定位信息等个人信息敏感性判定解析

关于身份证号号码以及精确定位信息是否是敏感个人信息的疑问一直以来不少合规安全从业者有疑惑&#xff0c;本文来自于《数安标准强基助力计划 》作者为指南和标准的起草者&#xff0c;其观点具有一定的权威性&#xff0c;一下为内容摘要&#xff0c;以供大家学习和解惑&#x…

【sourceTree问题】拉取提交的时候需要频繁输入账号密码

用sourceTree进行代码管理的时候会出现一直让输入账号密码的问题&#xff0c;烦不胜烦&#xff0c;可以点击【设置】 → 【编辑配置文件...】打开配置文件&#xff1a; 在配置文件里找到url&#xff0c;把url里面的网址修改为&#xff1a; http://username:passwordxxxxx/xx…

LeetCode 热题 100 回顾7

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…