现在的假设为省市区三级.数据库中有相应的三个表
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的数据(全国省市区)测试通过.
本文介绍了一种利用Ajax技术实现省市区三级联动下拉框的方法,并提供了完整的JSP页面和数据库交互代码示例。
291

被折叠的 条评论
为什么被折叠?



