Ajax实现三级联动下拉框

本文介绍了一种利用Ajax技术实现省市区三级联动下拉框的方法,并提供了完整的JSP页面和数据库交互代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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、付费专栏及课程。

余额充值