Ajax实现三级联动下拉框

现在的假设为省市区三级.数据库中有相应的三个表

CREATE   TABLE   [ dbo ] . [ area ]  (
 
[ id ]   [ int ]   NOT   NULL  ,
 
[ areaID ]   [ nvarchar ]  ( 50 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
 
[ area ]   [ nvarchar ]  ( 60 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
 
[ father ]   [ nvarchar ]  ( 6 ) COLLATE Chinese_PRC_CI_AS  NULL  
ON   [ PRIMARY ]
GO

CREATE   TABLE   [ dbo ] . [ city ]  (
 
[ id ]   [ int ]   NOT   NULL  ,
 
[ cityID ]   [ nvarchar ]  ( 6 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
 
[ city ]   [ nvarchar ]  ( 50 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
 
[ father ]   [ nvarchar ]  ( 6 ) COLLATE Chinese_PRC_CI_AS  NULL  
ON   [ PRIMARY ]
GO

CREATE   TABLE   [ dbo ] . [ province ]  (
 
[ id ]   [ int ]   NOT   NULL  ,
 
[ provinceID ]   [ nvarchar ]  ( 6 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
 
[ province ]   [ nvarchar ]  ( 40 ) COLLATE Chinese_PRC_CI_AS  NULL  
ON   [ PRIMARY ]
GO

 

显示页面showinof.jsp

 

<% @ page pageEncoding = " GBK " %>
< jsp:directive.page  import = " java.sql.* "   />
<! DOCTYPE HTML PUBLIC  " -//W3C//DTD HTML 4.0 Transitional//EN " >
< HTML >
 
< HEAd >
  
< TITLE > Ajax实现三级联动下拉框 </ TITLE >
  
< script type = " text/javascript " >
            
if  (window.ActiveXObject  &&   ! window.XMLHttpRequest)  {
                window.XMLHttpRequest
=function() {
                    
return new ActiveXObject((navigator.userAgent.toLowerCase().indexOf('msie 6'!= -1? 'Microsoft.XMLHTTP' : 'Msxml2.XMLHTTP');
                }
;
            }
// 取得XMLHttpRequest对象     
            var req;
            var flagSelect;
            function testName(flag,value)
// 使用Ajax访问服务器
             {
             flagSelect 
= flag; //标记一下当前是选择省,还是选择市
             req=new XMLHttpRequest();
             
if (req) 
             
{
                 req.onreadystatechange
=setValue;
             }

                req.open(
'POST',"getinfo.jsp?flag="+flag+"&value="+value);//把参数带到服务器中
                req.setRequestHeader('Content-Type''application/x-www-form-urlencoded');
                req.send(
null);
         }

            function setValue()
            
{
                
if (req.readyState==4 )//访问到服务器
                {           
                    
if(req.status==200)//正确返回
                    {    
                        
if(flagSelect=="1")//如果选择某个省要更新市和区
                        {
                            var v
=req.responseText.split("||");//req.responseText是服务器返回来的字符串
                            paint(document.all("shi"),v[0]);//更新市下拉框
                            paint(document.all("qu"),v[1]);//更新区下拉框
                        }

                        
if(flagSelect=="2")//如果选择某市,只需改变区
                        {
                            var v
=req.responseText;
                            paint(document.all(
"qu"),v);//更新区下拉框
                        }

                    }

                }

            }

            function paint(obj,value)
// 根据一对数据去更新一个下拉框
             {
                var ops 
= obj.options;
                 var v
=value.split(";");//得到一些数据,(修改过了..)
                    while(ops.length>0)//先清空原来的数据
                    {
                      ops.remove(
0);
                    }

                    
for(var i=0;i<v.length-1;i++)//把新得到的数据显示上去
                    {
                        var o 
= document.createElement("OPTION");//创建一个option把它加到下拉框中
                        o.value=v[i].split(",")[0];
                        o.text
=v[i].split(",")[1];
                        ops.add(o);
                    }

            }

            
</ script >
 
< body >
  
<%
  
try   {
  Class.forName(
"com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
  Connection conn 
= DriverManager.getConnection(
    
"jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=hibernate",
    
"sa""");
  ResultSet rs 
= conn.createStatement().executeQuery("select * from province order by provinceID");
  
%>
  
<table>
   
<tr>
    
<td><select name="pro" onchange="testName(1,this.value);">
      
<%
      
while (rs.next()) {
       out.println(
"<option value='" + rs.getString("provinceID")
       
+ "'>" + rs.getString("province"+ "</option>");
      }

      
%>
     
</select>
    
</td>

    
<%
     rs 
= conn.createStatement().executeQuery(
       
"select * from city  t2 where t2.father=(select min(t1.provinceID) from province t1)   order by cityID");
    
%>
    
<td><select name="shi" onchange="testName(2,this.value);">
      
<%
      
while (rs.next()) {
       out.println(
"<option value='" + rs.getString("cityID")
       
+ "'>" + rs.getString("city"+ "</option>");
      }

      
%>
     
</select>
    
</td>

    
<%
    rs 
= conn.createStatement().executeQuery(
        
"select * from area  t3 where t3.father=(select min(t2.cityid) from city t2 where t2.father=(select min(t1.provinceID) from province t1) )   order by areaid");
    
%>

    
<td><select name="qu">
      
<%
      
while (rs.next()) {
       out.println(
"<option value='" + rs.getString("areaid")
       
+ "'>" + rs.getString("area"+ "</option>");
       }

        rs.close();
        conn.close();
       }
  catch  (Exception e)  {
        e.printStackTrace();
       }

      
%>
     
</ select >
    
</ td >
   
</ tr >
  
</ table >
 
</ body >
</ HTML >

取得数据库页面getinfo.jsp

 

<% @ page pageEncoding = " GBK " %>
< jsp:directive.page  import = " java.sql.* "   />
< jsp:directive.page  import = " java.io.IOException "   />
<! DOCTYPE HTML PUBLIC  " -//W3C//DTD HTML 4.0 Transitional//EN " >
< HTML >
    
< body >
        
<%
            response.setContentType(
" text/xml; charset=GBK " );
            out.clear();
            
try   {
                String flag 
= request.getParameter("flag");
                String value 
= request.getParameter("value");
                
if (flag == null{
                    
return;
                }

                StringBuffer values 
= new StringBuffer("");
                Class.forName(
"com.microsoft.jdbc.sqlserver.SQLServerDriver")
                .newInstance();
                Connection conn 
= DriverManager
                .getConnection(
                        
"jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=hibernate",
                        
"sa""");
                Statement stmt 
= conn.createStatement();
                ResultSet rs 
= null;
                
//getconnection;
                
//query
                
//rs 
                if (flag.equals("1")) {
                    rs 
= stmt
                    .executeQuery(
"select  cityid,city from city  where  father='"
                    
+ value + "' order by cityid");
                    
while (rs.next()) {
                values.append(rs.getString(
1+ "," + rs.getString(2)
                        
+ ";");
                    }

                    String ff 
= values.substring(0, values.indexOf(","));//最得敢小的市编号
                    System.out.println(ff);
                    rs 
= stmt
                    .executeQuery(
"select areaid,area from area where father='"
                    
+ ff + "'  order by areaid");
                    values.append(
"||");//区分市和区信息.
                    while (rs.next()) {
                values.append(rs.getString(
1+ "," + rs.getString(2)
                        
+ ";");
                    }

                    System.out.println(values.toString());
                }
 else if (flag.equals("2")) {
                    rs 
= stmt
                    .executeQuery(
"select areaid,area from area  where father='"
                    
+ value + "'  order by  areaid");
                    
while (rs.next()) {
                values.append(rs.getString(
1+ "," + rs.getString(2)
                        
+ ";");
                    }

                }
 else {
                }

                out.println(values.toString());
                out.flush();
                out.close();
            }
  catch  (IOException e)  {
                e.printStackTrace();
            }

        
%>
    
</ body >
</ HTML >



 

以上代码利用SQL 2000和利用

http://www.cnblogs.com/Files/singlepine/area1.rar 中的三个表area,city,province的数据(全国省市区)测试通过.


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值