`

Ajax 三级联动菜单

    博客分类:
  • AJAX
 
阅读更多

数据库部分:

drop database if exists mydb;  
create database mydb character set gbk;  
  
--多级联动菜单  
use mydb;  
drop table if exists select_menu;  
create table select_menu(  
    id varchar(255) not null default '',  
    text varchar(255) not null,  
    pid varchar(255) not null,  
    seq int(11) not null default 0,  
    primary key (id)  
)ENGINE=InnoDB DEFAULT CHARSET=gbk;  
  
insert into select_menu values('A1','列表A选项1','INIT',1);  
insert into select_menu values('A2','列表A选项2','INIT',2);  
insert into select_menu values('B11','列表B选项11','A1',1);  
insert into select_menu values('B12','列表B选项12','A1',2);  
insert into select_menu values('B13','列表B选项13','A1',3);  
insert into select_menu values('B21','列表B选项21','A2',1);  
insert into select_menu values('B22','列表B选项22','A2',2);  
insert into select_menu values('C111','列表C选项111','B11',1);  
insert into select_menu values('C112','列表C选项112','B11',2);  
insert into select_menu values('C121','列表C选项121','B12',1);  
insert into select_menu values('C122','列表C选项122','B12',2);  
insert into select_menu values('C131','列表C选项131','B13',1);  
insert into select_menu values('C132','列表C选项132','B13',2);  
insert into select_menu values('C211','列表C选项211','B21',1);  
insert into select_menu values('C212','列表C选项212','B21',2);  
insert into select_menu values('C221','列表C选项221','B22',1);  
insert into select_menu values('C222','列表C选项222','B22',2)

 JDBC的Utils类:

package com.lanp.ajax.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/** 
 * 连接数据库的工具类,被定义成不可继承且是私有访问 
 * @author lanp 
 * @since 2012-2-29 22:27 
 */
public final class DBUtils {
	private static String url = "jdbc:oracle:thin:@127.0.0.1:1521:neusoft";
	private static String user = "scott";
	private static String psw = "tiger";

	private static Connection conn;

	static {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	private DBUtils() {

	}

	/** 
	 * 获取数据库的连接 
	 * @return conn 
	 */
	public static Connection getConnection() {
		try {
			conn = DriverManager.getConnection(url, user, psw);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		return conn;
	}

	/** 
	 * 释放资源 
	 * @param conn 
	 * @param pstmt 
	 * @param rs 
	 */
	public static void closeResources(Connection conn, PreparedStatement pstmt,
			ResultSet rs) {
		if (null != rs) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			} finally {
				if (null != pstmt) {
					try {
						pstmt.close();
					} catch (SQLException e) {
						e.printStackTrace();
						throw new RuntimeException(e);
					} finally {
						if (null != conn) {
							try {
								conn.close();
							} catch (SQLException e) {
								e.printStackTrace();
								throw new RuntimeException(e);
							}
						}
					}
				}
			}
		}
	}
}

 JSP后台:

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ page language="java"%>
<%@ page import="java.sql.*"%>
<%@ page import="com.lanp.ajax.db.DBUtils;"%>
<%!
    //访问数据库取得下级选项信息
    String getOptions(String selectedId) {
        int counter = 0;                            //计数器
        StringBuffer opts = new StringBuffer("{");  //保存选项信息
        String sql = "select * from select_menu where pid = ? order by seq asc";//定义查询数据库的SQL语句
        Connection conn = null;                 //声明Connection对象
        PreparedStatement pstmt = null;         //声明PreparedStatement对象
        ResultSet rs = null;                    //声明ResultSet对象
        try {
            conn = DBUtils.getConnection();     //获取数据库连接
            pstmt = conn.prepareStatement(sql); //根据sql创建PreparedStatement
            pstmt.setString(1, selectedId);     //设置参数
            rs = pstmt.executeQuery();          //执行查询,返回结果集
            while (rs.next()) {                 //遍历结果集
                //如果不是第一项,追加一个“,”用于分隔选项
                if (counter > 0) {
                    opts.append(",");
                }
                opts.append("'");
                opts.append(rs.getString("id"));
                opts.append("':'");
                opts.append(rs.getString("text"));
                opts.append("'");
                counter++;                      //计数器加1
            }
        } catch (SQLException e) {
            System.out.println(e.toString());
        } finally {
            DBUtils.closeResources(conn,pstmt,rs);  
        }
        opts.append("}");
        return opts.toString();
    }
%>
<%
    out.clear();                                            //清空当前的输出内容(空格和换行符)

    String selectedId = request.getParameter("selectedId"); //获取selectedId参数
    String optionsInfo = getOptions(selectedId);            //调用getOptions方法取得下级选项信息

    out.print(optionsInfo);                                 //输出下级选项信息
%>

 Html前台:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>多级联动菜单</title>

<script type="text/javascript">
var xmlHttp;        //用于保存XMLHttpRequest对象的全局变量
var targetSelId;    //用于保存要更新选项的列表id
var selArray;       //用于保存级联菜单id的数组

//用于创建XMLHttpRequest对象
function createXmlHttp() {
    //根据window.XMLHttpRequest对象是否存在使用不同的创建方式
    if (window.XMLHttpRequest) {
       xmlHttp = new XMLHttpRequest();                  //FireFox、Opera等浏览器支持的创建方式
    } else {
       xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//IE浏览器支持的创建方式
    }
}

//获取列表选项的调用函数
function buildSelect(selectedId, targetId) {
    if (selectedId == "") {                             //selectedId为空串表示选中了默认项
        clearSubSel(targetId);                          //清除目标列表及下级列表中的选项
        return;                                         //直接结束函数调用,不必向服务器请求信息
    }
    targetSelId = targetId;                             //将传入的目标列表id赋值给targetSelId变量
    createXmlHttp();                                    //创建XmlHttpRequest对象
    xmlHttp.onreadystatechange = buildSelectCallBack;   //设置回调函数
    xmlHttp.open("GET", "select_menu.jsp?selectedId=" + selectedId, true);
    xmlHttp.send(null);
}

//获取列表选项的回调函数
function buildSelectCallBack() {
    if (xmlHttp.readyState == 4) {
        var optionsInfo = eval("("+xmlHttp.responseText+")");           //将从服务器获得的文本转为对象直接量
        var targetSelNode = document.getElementById(targetSelId);
        clearSubSel(targetSelId);                                    //清除目标列表中的选项
        //遍历对象直接量中的成员
        for (var o in optionsInfo) {
            targetSelNode.appendChild(createOption(o, optionsInfo[o])); //在目标列表追加新的选项
        }
    }
}

//根据传入的value和text创建选项
function createOption(value, text) {
     var opt = document.createElement("option");                        //创建一个option节点
     opt.setAttribute("value", value);                                  //设置value
     opt.appendChild(document.createTextNode(text));                    //给节点加入文本信息
     return opt;
}

//清除传入的列表节点内所有选项
function clearOptions(selNode) {
    selNode.length = 1;                                                 //设置列表长度为1,仅保留默认选项
    selNode.options[0].selected = true;                                 //选中默认选项
}

//初始化列表数组(按等级)
function initSelArray() {
    selArray = arguments;                                               //arguments对象包含了传入的所有参数
}

//清除下级子列表选项
function clearSubSel(targetId) {
    var canClear = false;                                               //设置清除开关,初始值为假
    for (var i=0; i<selArray.length; i++) {                             //遍历列表数组
        if (selArray[i]==targetId) {                                    //当遍历至目标列表时,打开清除开关
            canClear = true;
        }
        if (canClear) {                                                 //从目标列表开始到最下级列表结束,开关始终保持打开
            clearOptions(document.getElementById(selArray[i]));         //清除该级列表选项
        }
    }
}
</script>
</head>

<!-- 页面加载完毕做两件事:1.初始化列表数组 2.为第一个列表赋值 -->
<body onload="initSelArray('selA','selB','selC');buildSelect('INIT', 'selA')">
<h1>多级联动菜单</h1>
<table>
<tr>
    <td>列表A</td>
    <td>
        <select name="selA" id="selA" onchange="buildSelect(this.value, 'selB')">
            <option value="" selected>------请选择------</option>
        </select>
    </td>
</tr>
<tr>
    <td>列表B</td>
    <td>
        <select name="selB" id="selB" onchange="buildSelect(this.value, 'selC')">
            <option value="" selected>------请选择------</option>
        </select>
    </td>
</tr>
<tr>
    <td>列表C</td>
    <td>
        <select name="selC" id="selC">
            <option value="" selected>------请选择------</option>
        </select>
    </td>
</tr>
</table>
</body>
</html>
 
分享到:
评论

相关推荐

    AJAX三级联动菜单

    在"AJAX三级联动菜单"项目中,主要涉及以下几个关键技术点: 1. **HTML结构**:首先,我们需要创建一个HTML结构来展示菜单,这通常包括三个下拉列表,分别对应一级、二级和三级菜单。每个下拉列表的选择事件将触发...

    ajax三级联动菜单

    在本项目中,“ajax三级联动菜单”利用Ajax实现了动态的、多级关联的下拉菜单功能。这种功能常见于网站的地区选择、商品分类等场景,用户在选择某一选项时,下一级菜单会根据前一级的选择自动更新,提供更加精确的...

    Ajax三级联动菜单

    Ajax三级联动菜单是一种常见的前端交互设计,常用于网站的数据筛选或导航,比如在课程选择、商品分类等场景中。在这个项目中,我们看到涉及到“学院”、“专业”和“班级”三张表的关联,这通常意味着用户在选择时,...

    jsp+ajax 三级联动菜单

    【jsp+ajax 三级联动菜单】是一个典型的Web开发技术应用场景,它主要利用JavaServer Pages(JSP)和Asynchronous JavaScript and XML(AJAX)来实现动态网页中的数据交互和页面更新。在这个例子中,我们看到的是一个...

    struts2 jquery json ajax 三级联动菜单

    综上所述,这个项目展示了如何使用Struts2作为后端控制器,jQuery处理前端交互,Ajax实现异步数据传输,以及JSON作为数据交换格式,共同构建一个功能完善的三级联动菜单。开发者需要对这些技术有深入理解,才能有效...

    基于Ajax的三级联动下拉菜单.rar

    基于Ajax的三级联动下拉菜单.rar基于Ajax的三级联动下拉菜单.rar基于Ajax的三级联动下拉菜单.rar基于Ajax的三级联动下拉菜单.rar基于Ajax的三级联动下拉菜单.rar基于Ajax的三级联动下拉菜单.rar

    联动菜单大全(含ajax,无限级联动菜单)

    联动菜单在Web开发中是一种常见的交互设计,它通常用于实现数据层级关系的展现和操作,如省份-城市-区县的三级联动选择。本资源包“联动菜单大全”包含了多种类型的联动菜单实现,包括与数据库交互的、使用AJAX技术...

    ajax三级联动,三级联动,联动,ajax,无刷新三级联动

    总之,实现Ajax三级联动的关键在于利用JavaScript和Ajax技术进行动态数据交互,通过监听用户的选择事件,动态加载并更新下拉菜单选项。这一过程涉及前端与后端的紧密协作,以提供流畅、无刷新的交互体验。

    Ajax实现的三级联动下拉菜单

    struts2+jsp+json+javascript实现的三级下拉菜单,没有service和dao层,数据是虚拟的。需要的欢迎下载。项目直接导入myeclipse就可以使用。访问路径localhost:8080/ajax_day02_hw/proviencecityarea.jsp

    三级联动Ajax菜单(包含省市数据)

    三级联动Ajax菜单(包含省市数据) ; charset=utf-8" /&gt; var xmlHttp; var requestType=""; function createXMLHttpRequest() { if(window.ActiveXObject) { xmlHttp=new ActiveXObject("Microsoft.XMLHTTP...

    Ajax JavaWeb JS 三级联动

    在三级联动中,JavaScript主要负责监听用户的选择事件,当用户在一级、二级菜单中选择项目时,触发Ajax请求,向服务器发送请求数据,并接收服务器返回的数据。然后,JavaScript会动态更新DOM,填充三级菜单的内容。 ...

    ajax四级联动菜单

    【Ajax四级联动菜单】是一种基于Ajax技术实现的动态下拉菜单功能,通常用于网页上的地区选择,例如国家、省份、城市、区县等。在这个示例中,它使用了Oracle数据库存储四级菜单的数据,并结合JSP(JavaServer Pages...

    ajax实现简单城市三级联动菜单

    在城市三级联动菜单中,当用户在下拉框中选择一个城市时,我们会触发一个AJAX请求,发送当前选中的城市ID到服务器。 JSP(JavaServer Pages)作为服务器端脚本语言,用于生成动态网页内容。在本案例中,JSP将负责...

    商品发布三级联动菜单js代码.zip

    "商品发布三级联动菜单js代码" 是一种实现这一功能的技术解决方案,它常见于商城网站,提升用户体验,增强商品搜索的准确性。这种技术主要依赖JavaScript(JS)语言,通过前端代码实现页面元素的动态交互。 一、...

    ajax三级联动

    在网页开发中,"ajax三级联动"是一种常见的交互设计,主要应用于下拉菜单或选择框,如城市选择,其中包含省、市、区三个级别。这种功能能够为用户提供流畅的体验,无需每次选择都刷新整个页面,提高了网页的响应速度...

    淘宝商品发布三级联动菜单.zip

    淘宝商品发布系统中的三级联动菜单是一种常见的交互设计,主要用于商品分类选择。在电子商务平台中,为了精确地将商品归类,通常会采用多级分类的方式,这样用户在发布商品时可以方便地找到最合适的类别。这个"淘宝...

    三级联动菜单

    在网页设计中,三级联动菜单是一种常见的交互设计模式,它主要用于地理位置信息的选择,例如省、市、区的选取。这种菜单结构允许用户通过逐级下拉选择的方式,快速定位到他们想要的位置。在这个案例中,我们关注的是...

    web页面三级联动菜单

    在网页设计中,"三级联动菜单"是一种常见的交互元素,特别是在复杂的网站导航系统中,它能够帮助用户高效地浏览和定位信息。三级联动菜单通常指的是一个包含主菜单、子菜单和孙菜单的多层次下拉菜单结构,用户在选择...

    Ajax三级联动 省市区

    在网页开发中,"Ajax三级联动 省市区" 是一种常见的交互设计,它利用Ajax技术实现省份、城市、区县三个级别的下拉菜单联动效果。这种设计在用户填写地址或者选择区域时提供了便捷的用户体验,用户只需选择一个级别,...

Global site tag (gtag.js) - Google Analytics