现在的假设为省市区三级.数据库中有相应的三个表
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的数据(全国省市区)测试通过.