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 靈魂守護者 閱讀(12557) 評論(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

          為什么照抄會出現空指針問題呢?  回復  更多評論   


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


          網站導航:
           
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          留言簿(1)

          文章分類(2)

          文章檔案(4)

          收藏夾(9)

          搜索

          最新評論

          主站蜘蛛池模板: 道孚县| 独山县| 宝鸡市| 姜堰市| 磐安县| 隆德县| 孟村| 宝山区| 九江县| 仙居县| 长宁区| 丹阳市| 阿拉尔市| 新民市| 房产| 乐昌市| 濮阳市| 阳东县| 大同市| 九龙坡区| 雅安市| 芦溪县| 资中县| 阿克陶县| 武强县| 普兰店市| 榆中县| 邳州市| 保靖县| 甘孜县| 普格县| 镇安县| 台中市| 扎兰屯市| 双鸭山市| 苏州市| 大城县| 大厂| 永福县| 蒙阴县| 开鲁县|