JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單

          最近做的項目中涉及到5,6級的級聯(lián)菜單,用以前那種純JavaScript做起來實在是太低效了,頁面響應(yīng)慢得跟286一樣。。。于是上網(wǎng)找AJAX實現(xiàn)的級聯(lián)菜單,找來找去找不到用DB+JSP+AJAX實現(xiàn)的。索性把人家的代碼拿來改了改,自己做了一個。
          我之所以采用這個代碼作為修改的藍本,是因為這個代碼的服務(wù)端處理程序返回的是標準的XML序列,客戶端的JavaScript通過
          var res = XMLHttpReq.responseXML.getElementsByTagName(String)
          的方式來解析這個XML序列,再通過類似于
          res[i].firstChild.data
          的方式遍歷這個XML序列,從而找到所要的數(shù)據(jù)。這樣可以實現(xiàn)比較大的數(shù)據(jù)的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;
               
          //創(chuàng)建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) {}
                      }
                  }
              }
              
          //發(fā)送請求函數(shù)
              function sendRequest(url) {
                  createXMLHttpRequest();
                  XMLHttpReq.open(
          "GET", url, true);
                  XMLHttpReq.onreadystatechange 
          = processResponse;//指定響應(yīng)函數(shù)
                  XMLHttpReq.send(null);  // 發(fā)送請求
              }
              
          // 處理返回信息函數(shù)
              function processResponse() {
                  
          if (XMLHttpReq.readyState == 4) { // 判斷對象狀態(tài)
                      if (XMLHttpReq.status == 200) { // 信息已經(jīng)成功返回,開始處理信息
                          updateMenu();
                      } 
          else { //頁面不正常
                            alert("您所請求的頁面有異常。");
                      }
                  }
              }
              
          //更新菜單函數(shù)
              function updateMenu() {
                  
          var res=XMLHttpReq.responseXML.getElementsByTagName("res")
                  
          /**下面是用innerHTML輸出控件內(nèi)容的一般用法**/
                  
          //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));
                  }
              }
              
          // 創(chuàng)建級聯(lián)菜單函數(shù)
              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();
          %
          >

          數(shù)據(jù)庫版本是:db-derby-10.3.1.4,可以去www.apache.org下載。
          把db-derby-10.3.1.4-bin.zip解壓到c:\derby下,用的示例數(shù)據(jù)庫是c:/derby/demo/databases/toursdb,注意路徑。
          然后把derby下的derby.jar解壓到用于啟動Tomcat的那個JRE的ext目錄下,重啟TOMCAT,打開瀏覽器,訪問menu.jsp即可看到效果。
          AJAX菜單效果圖
           
          三級聯(lián)動的效果:

          下載本例的JSP代碼:ajax_db_jsp_demo.rar
          三級聯(lián)動下拉菜單:three_ajax_select_with_db.zip

          posted on 2007-08-21 23:00 靈魂守護者 閱讀(12563) 評論(48)  編輯  收藏 所屬分類: AJAX

          評論

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2007-11-25 16:57 haohao

          不錯,頂~  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2007-11-30 10:41 shaomin

          謝謝分享
          收下了
            回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2007-12-29 15:57 JITATA

          謝謝,好東西,收藏中。。。  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2008-01-22 14:50 游客

          照改了一下 很好!~~非常感謝 正在擴展中  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2008-03-15 16:17 jiangfeng

          太感謝了啊!  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2008-03-26 09:48 sunshine

          很好的東東!!!收藏ing  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2008-07-16 15:55 游客

          厲害啊  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2008-07-25 17:05 游客

          老板能說一下數(shù)據(jù)庫的結(jié)構(gòu)嗎?  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2008-07-28 17:00 chaoskz

          正是我所需要的,頂,謝謝樓主分享!  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2008-08-03 00:41 斯蒂芬

          謝謝 LZ   回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2008-08-06 15:45 大帥

          res 獲取到的 length 是0
          但是獲取到的 response的length 卻是 1

          大哥幫忙呀。我這邊就是獲取不到 res
          我的email liufangmeng@163.com
          qq 76634102  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2008-08-08 09:11 hooo

          .getElementsByTagName("res")這句干么的呢,沒看到有res這個name啊,

          不懂賜教:tyc_boy@126.com  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2008-09-16 15:49 jokylin

          res 獲取到的 length 是0 ,怎么回事?有能運行的嗎?  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2008-09-23 22:19 啊啊

          謝謝分享  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2008-10-10 09:23 小妮

          非常謝謝!這個項目正需要這個  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2008-10-23 14:50 java初學(xué)者

          謝謝了  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2008-10-30 16:27 冰冰

          賜教!  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2008-11-03 14:03 xzy

          太感謝了  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2008-11-11 14:37 彩筆

          太 感謝 了 我 喲個問題想問下你 就是如果 我第二的下拉列表 也是鍵值對,怎么改寫 你的第二的列表是顯示內(nèi)容和value一樣的 。  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2008-12-17 16:53 Tony

          為什么我全部照搬,結(jié)果卻是在改變contury后得到了出錯信息:“您所請求的頁面有異常...”

          HELP~~~  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2008-12-23 00:45 spirit_fly

          樓主,你很強大啊,感謝!  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2009-01-05 15:14 boy

          試過 很好~大概知道以后要怎樣弄下拉菜單了~多謝分享  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2009-03-01 15:45 1

          三級連動怎么會出現(xiàn)錯誤啊   回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 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);之后運行正常
            回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2009-06-16 17:14 Evan

          謝謝!非常感謝!  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2009-09-05 09:16 chengninger

          非常感謝  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2009-09-24 13:02 親切

          中文菜單如何實現(xiàn)?  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2010-01-18 17:59 bingyu

          我的也出現(xiàn)了這樣的情況,是什么原因呀
            回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2010-01-18 18:00 wxx

          為什么我的照搬,結(jié)果卻是在改變contury后得到了出錯信息:“您所請求的頁面有異常...”
            回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2010-01-19 16:23 小夏

          我 這里獲取不到res   回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2010-01-19 16:24 小雨

          我這里獲取不到res希望得到幫助
          xiashujv@163.com  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2010-04-02 11:23 呵呵

          有問題哦  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2010-04-02 11:34 呵呵

          有這樣一個問題 怎解決哦

          無法顯示 XML 頁。
          使用 樣式表無法查看 XML 輸入。請更正錯誤然后單擊 刷新按鈕,或以后重試。
          --------------------------------------------------------------------------------
          文檔的頂層無效。處理資源 'http://localhost:8080/guest_book/menujsp.jsp' 時出錯。


            回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2010-04-02 11:36 游客

          有這樣一個問題怎么解決 能把解決后大的發(fā)到我的郵箱就好了jiangxian.ck98@163.com
          無法顯示 XML 頁。
          使用 樣式表無法查看 XML 輸入。請更正錯誤然后單擊 刷新按鈕,或以后重試。


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

          文檔的頂層無效。處理資源 'http://localhost:8080/guest_book/menujsp.jsp' 時出錯。


            回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2010-04-06 11:49 游客

          我照搬你的 就是用MYSQL數(shù)據(jù)庫 其他的與數(shù)據(jù)庫有關(guān)的地方都改了 運行時沒錯,但是就是出不來二級菜單那里,樓主幫解決下。  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2010-04-16 19:02 jiajia

          謝謝,剛好用到,真好用,謝謝  回復(fù)  更多評論   

          # 使用JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單異常,請求幫助 2010-08-19 17:54 liusufang

          為什么我的照搬,結(jié)果卻是在改變contury后得到了出錯信息:“您所請求的頁面有異常...” ?有知道原因的請發(fā)到我郵箱:white_fangzi@126.com,謝謝!
            回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2010-09-03 22:16 461228344@qq.com

          @fabius
          照改了還是不行呀,還有老是亂碼,轉(zhuǎn)換了編碼也不行IE里沒問題
          461228344@qq.com  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2011-07-13 11:14 123

          能說一下數(shù)據(jù)庫的結(jié)構(gòu),急,急...  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2011-08-19 12:27 xinyuan.zhuang

          非常好!res是menujsp.jsp頁面的
            回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2011-08-19 12:29 xinyuan.zhuang

          var list = document.all.list;

          list:是<select name="list"   回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2011-08-23 15:59 作者

          經(jīng)測試,該示例在Chrome 15 Dev,IE8,Maxthon3下工作正常。  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2011-08-23 16:05 作者

          提示數(shù)據(jù)庫路徑錯誤的朋友,不妨改一改兩個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;   回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2011-08-23 16:07 作者

          示例用到的數(shù)據(jù)庫是Derby的Demo數(shù)據(jù)庫之一,下載Derby之后就有了,下載地址是http://db.apache.org/derby/releases/release-10.8.1.2.cgi  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2011-08-23 16:08 ducktsmt

          這個示例還是有很多需要完善的地方,謝謝大家的批評指正  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2012-01-04 09:14 William

          非常感謝分享這么好的東東  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單 2012-02-17 16:34 Gamehu

          bu錯  回復(fù)  更多評論   

          # re: JavaDB+JSP+AJAX實現(xiàn)的級聯(lián)下拉菜單[未登錄] 2012-03-28 17:53 s

          為什么照抄會出現(xiàn)空指針問題呢?  回復(fù)  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2009年6月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          導(dǎo)航

          統(tǒng)計

          留言簿(1)

          文章分類(2)

          文章檔案(4)

          收藏夾(9)

          搜索

          最新評論

          主站蜘蛛池模板: 宁安市| 平利县| 乐平市| 抚宁县| 鄄城县| 建昌县| 钟山县| 昌江| 永修县| 元阳县| 常山县| 昭觉县| 彭阳县| 柞水县| 拜城县| 萨嘎县| 新宾| 巴楚县| 高陵县| 定日县| 万载县| 湖州市| 昌图县| 专栏| 宣汉县| 高阳县| 大英县| 武宁县| 扶绥县| 光泽县| 永德县| 开鲁县| 辉县市| 大城县| 叶城县| 三河市| 河北省| 太湖县| 淅川县| 阆中市| 长葛市|