up:: JQuery对Ajax的支持 二级联动菜单的形式多种多样:

可以使用Ajax来实现二级联动菜单:(自然Jquery脚本提供了Ajax的简化)

实现主要有三个内容:

Channel类:JavaBean:

普通的JavaBean,没什么特别:code选项<option>的value,name选项<option>的显示值

    package com.imooc.ajax;
 
    public class Channel {
    	private String code;
    	private String name;
    	public Channel() {}
    	public Channel(String code, String name) {
    		super();
    		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;
    	}
    }
 

Servlet:ChannelServlet类:

这个Servlet有点一类多用的感觉而已。。。每次执行都会创建一个新的chlist;;;

 
    package com.imooc.ajax;
 
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
 
    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 com.alibaba.fastjson.JSON;
 
    /**
     * Servlet implementation class ChannelServlet
     */
    @WebServlet("/channel")
    public class ChannelServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
 
        /**
         * @see HttpServlet#HttpServlet()
         */
        public ChannelServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
 
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		String level = request.getParameter("level"); // level=1:对应第一级菜单;level=2:对应第二级菜单;
    		String parent = request.getParameter("parent");   // parent:对应第一级菜单的选项<option>的value值
    		List<Channel> chlist = new ArrayList<Channel>();
    		if(level.equals("1")) {
    			chlist.add(new Channel("ai","前沿/区块链"));
    			chlist.add(new Channel("web","前端/JS"));
    		}else if(level.equals("2")) {
    			if(parent.equals("ai")) {
    				chlist.add(new Channel("micro","微服务"));
    				chlist.add(new Channel("blockchain","区块链"));
    				chlist.add(new Channel("other","…"));
    			}else if(parent.equals("web")) {
    				chlist.add(new Channel("html","HTML"));
    				chlist.add(new Channel("css","CSS"));
    				chlist.add(new Channel("other","…"));
    			}
    		}
    		String json = JSON.toJSONString(chlist);
    		response.setContentType("text/html;charset=utf-8");
    		response.getWriter().println(json);
    	}
 
    }

html:首先,第一个初始化函数会初始化第一级菜单;即data的参数是level=1,此时会执行servlet中的if(level.equals(“1”)){ }部分;;;即执行完第一个初始化函数后,会调用一次Servlet,最后的结果就是浏览器上的第一级菜单初始化了;此时,浏览器上的第一级菜单就会“存下”Servlet返回的结果,并在浏览器页面上显示出来;

其次,当第一级菜单发生change的时候,会调用第二个初始化函数;此时的data参数是{“level”:“2”,“parent”:parent};其中parent是第一级菜单的option的value值,这个值是从前端浏览器中获取的,,,然后去调用Servlet,任然会从从头到尾执行,自然Servlet中的chlist会被重新创建。。。

最后,每次Servlet返回的结果都是以json的格式传输的,html把得到的json对应到前端界面上就行了;

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript" src="js/jquery-3.5.1.js"></script>
    <script>
    	$(function(){     // 页面就绪函数完成第一功能:页面初始的时候,加载第一级栏目
    		$.ajax({
    			"url":"/ajax/channel",
    			"type":"get",
    			"data":{"level":"1"},
    			"dataType":"json",
    			"success":function(json){
    				console.log(json);
    				for(var i = 0;i<json.length;i++){
    					var ch = json[i];
    					$("#lv1").append("<option value='"+ch.code+"'>"+ch.name+"</option>")   // append():以前接触过,作用是在组件的内部追加对应的html
    				}
    			}
    		})
    	})
 
    	$(function(){   // jquery允许出现多个页面就绪函数 ,执行是从上到下依次执行;;;;每一个页面就绪函数最好是一个独立的功能,这符合低耦合性的原则
    		$("#lv1").on("change",function(){     // on()方法以前接触过,作用是用来绑定事件
    			var parent = $(this).val();   //$(this) 代表当前触发事件的对象;;;val()以前接触过,作用是用来获取输入项的值,同样可以用在下拉框上
    			console.log(parent);
    			$.ajax({
    				"url":"/ajax/channel",
    				"type":"get",
    				"data":{"level":"2","parent":parent},
    				"dataType":"json",
    				"success":function(json){
    					console.log(json);
    					$("#lv2>option").remove();   // 移除所有lv2下的原始option选项;   >是CSS中的子选择器
    					for(var i=0;i<json.length;i++){
    						var ch = json[i];
    						$("#lv2").append("<option value='"+ch.code+"'>"+ch.name+"</option>");
    					}
    				}
    			})
    		})
    	})
    </script>
    </head>
    <body>
    	<select id="lv1" style="width:200px;height:30px">
    		<option selected="selected">请选择</option>
    	</select>
    	<select id="lv2" style="width:200px;height:30px">
 
    	</select>
 
    </body>
    </html>

效果:


注: (1)整体来看,Ajax的应用场景十分广泛,明白Ajax的作用,实际中很多业务场景适合使用Ajax;

(2)在实现某种业务问题时,具体的实现方式和实现策略,需要多看实际的例子,总结出大家广泛接受的,效果好的、实现方式和实现策略!!!