第18周 第2章JSON入门

二级联动菜单实现总结

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. 拓展应用

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

ffsetup220格式工厂是一款功能强大且免费的多媒体文件转换和处理工具。它支持几乎所有常见的多媒体文件格式,包括视频、音频和图片。使用格式工厂,您可以将一个格式的文件转换为另一个格式,以适应不同的播放设备或编辑需求。 格式工厂具有简便的操作界面和直观的导航,使用户可以轻松地完成文件转换。您只需选择要转换的文件,选择目标格式和输出文件夹,然后点击转换按钮,即可完成转换过程。这使得即使是对于不太熟悉电脑操作的用户来说,也能够快速上手和使用。 除了文件转换,格式工厂还提供了其他多媒体文件处理功能。它可以裁剪、合并、分割和提取音频或视频片段,让用户可以根据自己的需求对文件进行编辑和剪辑。此外,格式工厂还可以添加字幕、水印和特效,以及调整视频的分辨率、帧率和比特率等参数,让用户可以自由地进行个性化定制。 ffsetup220格式工厂还具有批量处理功能,可以同时转换或处理多个文件。这对于需要一次处理多个文件的用户来说非常便利,能够节省大量时间和精力。 总之,ffsetup220格式工厂是一款实用的多媒体文件转换和处理工具,它的功能强大且操作简便,可以满足用户在多媒体文件处理方面的各种需求。无论是想要将文件转换为不同的格式,还是需要进行剪辑和编辑,格式工厂都能够帮助用户轻松地完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值