JavaDB+JSP+AJAX实现的级联下拉菜单

最近做的项目中涉及到5,6级的级联菜单,用以前那种纯JavaScript做起来实在是太低效了,页面响应慢得跟286一样。。。于是上网找AJAX实现的级联菜单,找来找去找不到用DB+JSP+AJAX实现的。索性把人家的代码拿来改了改,自己做了一个。
我之所以采用这个代码作为修改的蓝本,是因为这个代码的服务端处理程序返回的是标准的XML序列,客户端的JavaScript通过
var res = XMLHttpReq.responseXML.getElementsByTagName(String)
的方式来解析这个XML序列,再通过类似于
res[i].firstChild.data
的方式遍历这个XML序列,从而找到所要的数据。这样可以实现比较大的数据的AJAX操作,比那些只返回简单String的例子要好得多了!反正我最讨厌手动解析字符串了!
menu.jsp(文件的编码也是UTF-8,我用EmEditor写的,右下角那里可以更改文档的编码格式)

<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="UTF-8"%>
<%
    request.setCharacterEncoding(
"UTF-8");
    response.setContentType(
"text/html;charset=UTF-8");
%>
<html>
<head>
<META http-equiv=Content-Type content="text/html; charset=UTF-8">
<!--LINK href="images/css.css" type=text/css rel=stylesheet-->
</head>
<%
    
String driver = "org.apache.derby.jdbc.EmbeddedDriver";
    
String dbName="/derby/demo/databases/toursdb";
    
String connectionURL = "jdbc:derby:" + dbName; 
    Connection conn 
= null;
    Statement st 
= null;
    ResultSet rs 
= null;
    List cities 
= new ArrayList();

    try{
        Class.forName(driver); 
    } catch(java.lang.ClassNotFoundException e) {
        e.printStackTrace();
    }

    try {
        conn 
= DriverManager.getConnection(connectionURL); 
        st
=conn.createStatement();
        rs
=st.executeQuery("SELECT distinct COUNTRY FROM cities order by COUNTRY");
        
while (rs.next())
        {
            cities.add(rs.getString(
1));
        }
        rs.close();
        st.close();
        conn.close();
    }  catch (Exception e)  {   
        e.printStackTrace();
    }
%>
<body>
<script language="javascript">
var XMLHttpReq;
    
var currentSort;
     
//创建XMLHttpRequest对象       
    function createXMLHttpRequest() {
        
if(window.XMLHttpRequest) { //Mozilla 浏览器
            XMLHttpReq = new XMLHttpRequest();
        }
        
else if (window.ActiveXObject) { // IE浏览器
            try {
                XMLHttpReq 
= new ActiveXObject("Msxml2.XMLHTTP");
            } 
catch (e) {
                
try {
                    XMLHttpReq 
= new ActiveXObject("Microsoft.XMLHTTP");
                } 
catch (e) {}
            }
        }
    }
    
//发送请求函数
    function sendRequest(url) {
        createXMLHttpRequest();
        XMLHttpReq.open(
"GET", url, true);
        XMLHttpReq.onreadystatechange 
= processResponse;//指定响应函数
        XMLHttpReq.send(null);  // 发送请求
    }
    
// 处理返回信息函数
    function processResponse() {
        
if (XMLHttpReq.readyState == 4) { // 判断对象状态
            if (XMLHttpReq.status == 200) { // 信息已经成功返回,开始处理信息
                updateMenu();
            } 
else { //页面不正常
                  alert("您所请求的页面有异常。");
            }
        }
    }
    
//更新菜单函数
    function updateMenu() {
        
var res=XMLHttpReq.responseXML.getElementsByTagName("res")
        
/**下面是用innerHTML输出控件内容的一般用法**/
        
//var subMenu = "";
        //for(var i = 0; i < res.length; i++) {
        //    subMenu = subMenu + "  " + res[i].firstChild.data + "";
        //}
        //currentSort.innerHTML = subMenu;
        
        
var list = document.all.list;
        list.options.length
=0;
        list.add(
new Option("---请选择---",""));
        
for(var i=0;i<res.length;i++){
            list.add(
new Option(res[i].firstChild.data,res[i].firstChild.data));
        }
    }
    
// 创建级联菜单函数
    function showSubMenu(obj) {
        
//currentSort =document.getElementById(obj); 
        //currentSort.parentNode.style.display = "";
        sendRequest("menujsp.jsp?sort=" + obj);
        
/**下面这一句的作用是:每次选择后回到第一个选项**/
        
//document.all.mli.options[0].selected=true;
    }

</script>
<select onchange="showSubMenu(this.options[this.options.selectedIndex].value)" name="mli"  style="width:150px">
<option value=''>---请选择---</option>
<%
    
for(int i=0;i<cities.size();i++)
    {
        out.println(
"<option value='"+cities.get(i)+"'>"+cities.get(i)+"</option>");
    }
%>
</select>
<select name="list" onchange="if(this.selectedIndex)alert(this.options[this.options.selectedIndex].value)" style="width:100px">
<option name="">---请选择---</option>
</select>
</body>
</html>
menujsp.jsp(文档编码格式也是UTF-8)
<%@ page contentType="text/html; charset=UTF-8" import="java.util.*,java.sql.*" %>
<%
    
String sort=request.getParameter("sort");
    
String driver = "org.apache.derby.jdbc.EmbeddedDriver";
    
String dbName="/derby/demo/databases/toursdb";
    
String connectionURL = "jdbc:derby:" + dbName; 
    Connection conn 
= null;
    Statement st 
= null;
    ResultSet rs 
= null;
    List cities 
= new ArrayList();

    
try{
        
Class.forName(driver); 
    } 
catch(java.lang.ClassNotFoundException e) {
        e.printStackTrace();
    }

    
try {
        conn 
= DriverManager.getConnection(connectionURL); 
        st
=conn.createStatement();
        rs
=st.executeQuery("SELECT CITY_NAME FROM cities where COUNTRY='"+sort+"'");
        
while (rs.next())
        {
            cities.add(rs.getString(
1));
        }
        rs.close();
        st.close();
        conn.close();
    }  
catch (Exception e)  {   
        e.printStackTrace();
    }
    response.setContentType(
"text/xml; charset=UTF-8");
    response.setHeader(
"Cache-Control""no-cache");
    out.println(
"<response>");
    
for(int i=0;i<cities.size();i++)
    {
        out.println(
"<res>" + cities.get(i).toString() + "</res>");
    }
    out.println(
"</response>");
    out.close();
%
>

数据库版本是:db-derby-10.3.1.4,可以去www.apache.org下载。
把db-derby-10.3.1.4-bin.zip解压到c:\derby下,用的示例数据库是c:/derby/demo/databases/toursdb,注意路径。
然后把derby下的derby.jar解压到用于启动Tomcat的那个JRE的ext目录下,重启TOMCAT,打开浏览器,访问menu.jsp即可看到效果。
AJAX菜单效果图
 
三级联动的效果:

下载本例的JSP代码:ajax_db_jsp_demo.rar
三级联动下拉菜单:three_ajax_select_with_db.zip

posted on 2007-08-21 23:00 灵魂守护者 阅读(12548) 评论(48)  编辑  收藏 所属分类: AJAX

评论

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2007-11-25 16:57 haohao

不错,顶~  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2007-11-30 10:41 shaomin

谢谢分享
收下了
  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2007-12-29 15:57 JITATA

谢谢,好东西,收藏中。。。  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2008-01-22 14:50 游客

照改了一下 很好!~~非常感谢 正在扩展中  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2008-03-15 16:17 jiangfeng

太感谢了啊!  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2008-03-26 09:48 sunshine

很好的东东!!!收藏ing  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2008-07-16 15:55 游客

厉害啊  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2008-07-25 17:05 游客

老板能说一下数据库的结构吗?  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2008-07-28 17:00 chaoskz

正是我所需要的,顶,谢谢楼主分享!  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2008-08-03 00:41 斯蒂芬

谢谢 LZ   回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2008-08-06 15:45 大帅

res 获取到的 length 是0
但是获取到的 response的length 却是 1

大哥帮忙呀。我这边就是获取不到 res
我的email liufangmeng@163.com
qq 76634102  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2008-08-08 09:11 hooo

.getElementsByTagName("res")这句干么的呢,没看到有res这个name啊,

不懂赐教:tyc_boy@126.com  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2008-09-16 15:49 jokylin

res 获取到的 length 是0 ,怎么回事?有能运行的吗?  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2008-09-23 22:19 啊啊

谢谢分享  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2008-10-10 09:23 小妮

非常谢谢!这个项目正需要这个  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2008-10-23 14:50 java初学者

谢谢了  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2008-10-30 16:27 冰冰

赐教!  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2008-11-03 14:03 xzy

太感谢了  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2008-11-11 14:37 彩笔

太 感谢 了 我 哟个问题想问下你 就是如果 我第二的下拉列表 也是键值对,怎么改写 你的第二的列表是显示内容和value一样的 。  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2008-12-17 16:53 Tony

为什么我全部照搬,结果却是在改变contury后得到了出错信息:“您所请求的页面有异常...”

HELP~~~  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2008-12-23 00:45 spirit_fly

楼主,你很强大啊,感谢!  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2009-01-05 15:14 boy

试过 很好~大概知道以后要怎样弄下拉菜单了~多谢分享  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2009-03-01 15:45 1

三级连动怎么会出现错误啊   回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2009-04-28 11:38 fabius

list.add(new Option("---请选择---",""));
list.add(new Option(res[i].firstChild.data,res[i].firstChild.data));
这两条语句在firefox下运行会有问题,而在IE中运行则不会有问题。
改成list.add(new Option("---请选择---",""),null);之后运行正常
  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2009-06-16 17:14 Evan

谢谢!非常感谢!  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2009-09-05 09:16 chengninger

非常感谢  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2009-09-24 13:02 亲切

中文菜单如何实现?  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2010-01-18 17:59 bingyu

我的也出现了这样的情况,是什么原因呀
  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2010-01-18 18:00 wxx

为什么我的照搬,结果却是在改变contury后得到了出错信息:“您所请求的页面有异常...”
  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2010-01-19 16:23 小夏

我 这里获取不到res   回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2010-01-19 16:24 小雨

我这里获取不到res希望得到帮助
xiashujv@163.com  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2010-04-02 11:23 呵呵

有问题哦  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2010-04-02 11:34 呵呵

有这样一个问题 怎解决哦

无法显示 XML 页。
使用 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。
--------------------------------------------------------------------------------
文档的顶层无效。处理资源 'http://localhost:8080/guest_book/menujsp.jsp' 时出错。


  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2010-04-02 11:36 游客

有这样一个问题怎么解决 能把解决后大的发到我的邮箱就好了jiangxian.ck98@163.com
无法显示 XML 页。
使用 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。


--------------------------------------------------------------------------------

文档的顶层无效。处理资源 'http://localhost:8080/guest_book/menujsp.jsp' 时出错。


  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2010-04-06 11:49 游客

我照搬你的 就是用MYSQL数据库 其他的与数据库有关的地方都改了 运行时没错,但是就是出不来二级菜单那里,楼主帮解决下。  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2010-04-16 19:02 jiajia

谢谢,刚好用到,真好用,谢谢  回复  更多评论   

# 使用JavaDB+JSP+AJAX实现的级联下拉菜单异常,请求帮助 2010-08-19 17:54 liusufang

为什么我的照搬,结果却是在改变contury后得到了出错信息:“您所请求的页面有异常...” ?有知道原因的请发到我邮箱:white_fangzi@126.com,谢谢!
  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2010-09-03 22:16 461228344@qq.com

@fabius
照改了还是不行呀,还有老是乱码,转换了编码也不行IE里没问题
461228344@qq.com  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2011-07-13 11:14 123

能说一下数据库的结构,急,急...  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2011-08-19 12:27 xinyuan.zhuang

非常好!res是menujsp.jsp页面的
  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2011-08-19 12:29 xinyuan.zhuang

var list = document.all.list;

list:是<select name="list"   回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2011-08-23 15:59 作者

经测试,该示例在Chrome 15 Dev,IE8,Maxthon3下工作正常。  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2011-08-23 16:05 作者

提示数据库路径错误的朋友,不妨改一改两个jsp头部的这两行吧。

    String dbName="/derby/demo/databases/toursdb";
    String connectionURL = "jdbc:derby:" + dbName; 
改成
String dbName="/demo/databases/toursdb";
String connectionURL = "jdbc:derby:C:/SandBox/db-derby-10.8.1.2-bin" + dbName;   回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2011-08-23 16:07 作者

示例用到的数据库是Derby的Demo数据库之一,下载Derby之后就有了,下载地址是http://db.apache.org/derby/releases/release-10.8.1.2.cgi  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2011-08-23 16:08 ducktsmt

这个示例还是有很多需要完善的地方,谢谢大家的批评指正  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2012-01-04 09:14 William

非常感谢分享这么好的东东  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单 2012-02-17 16:34 Gamehu

bu错  回复  更多评论   

# re: JavaDB+JSP+AJAX实现的级联下拉菜单[未登录] 2012-03-28 17:53 s

为什么照抄会出现空指针问题呢?  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

导航

统计

留言簿(1)

文章分类(2)

文章档案(4)

收藏夹(9)

搜索

最新评论