自己写了一个用AJAX+JS实现自动创建四级联动(国家,省,城市,区县)菜单的例子,效果如下:

代码如下,希望各位高手点评!

数据库oracle,用了四张表:国家这张表在访问JSP时自动从数据库里面加载:

 

create table country(
co_id number primary key,
co_name varchar2(20)not null
);
insert into country values(1,'中国');
insert into country values(2,'日本');
insert into country values(3,'美国');
insert into country values(4,'澳大利');
insert into country values(5,'哥伦比亚');
create table pronvice(
pr_id number primary key,
pr_name varchar2(20)not null,
co_id number not null
);
insert into pronvice values(1,'安徽省',1);
insert into pronvice values(2,'北京市',1);
insert into pronvice values(3,'重庆市',1);
insert into pronvice values(4,'福建省',1);
insert into pronvice values(5,'甘肃省',1);
insert into pronvice values(6,'广东省',1);
insert into pronvice values(7,'广西壮族自治区',1);
insert into pronvice values(8,'贵州省',1);
insert into pronvice values(9,'海南省',1);
insert into pronvice values(10,'河北省',1);
insert into pronvice values(11,'黑龙江省',1);
insert into pronvice values(12,'河南省',1);
insert into pronvice values(13,'香港特别行政区',1);
insert into pronvice values(14,'湖北省',1);
insert into pronvice values(15,'湖南省',1);
insert into pronvice values(16,'江苏省',1);
insert into pronvice values(17,'江西省',1);
insert into pronvice values(18,'吉林省',1);
insert into pronvice values(19,'辽宁省',1);
insert into pronvice values(20,'澳门特别行政区',1);
insert into pronvice values(21,'内蒙古自治区',1);
insert into pronvice values(22,'宁夏回族自治区',1);
insert into pronvice values(23,'青海省',1);
insert into pronvice values(24,'山东省',1);
insert into pronvice values(25,'上海市',1);
insert into pronvice values(26,'陕西省',1);
insert into pronvice values(27,'山西省',1);
insert into pronvice values(28,'四川省',1);
insert into pronvice values(29,'台湾省',1);
insert into pronvice values(30,'天津市',1);
insert into pronvice values(31,'新疆维吾尔自治区',1);
insert into pronvice values(32,'西藏自治区',1);
insert into pronvice values(33,'云南省',1);
insert into pronvice values(34,'浙江省',1);

insert into pronvice values(35,'长崎',2);
insert into pronvice values(36,'广岛',2);
create table city(
ci_id number primary key,
ci_name varchar2(20)not null,
pr_id number not null
);
insert into city values(1,'南坪',3);
insert into city values(2,'观音桥',3);
insert into city values(3,'成都',28);
insert into city values(4,'绵羊',28);
insert into city values(5,'长崎A',35);
insert into city values(6,'长崎B',35);
insert into city values(7,'广岛A',36);
insert into city values(8,'广岛B',36);

create table area(
ar_id number primary key,
ar_name varchar2(20)not null,
ci_id number not null
);
insert into area values(1,'弹子石',1);
insert into area values(2,'洋人街',1);
insert into area values(3,'5公里',1);
insert into area values(4,'小苑',2);
insert into area values(5,'金源',2);
insert into area values(6,'建新',2);
select * from city;
select * from pronvice;
select * from country;

jsp页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
   
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">   
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <script type="text/javascript" src="js/ajax.js" charset="gb2312"></script>
  </head>
 
  <body οnlοad="country()">
  <center>
    <h1>AJAX实现联动菜单</h1>
    <hr/>
    <table align="center">
     <tr>
       <td id="1">
        <select id="country" οnchange="getPronvice()" style="text-align: center;">
            <option>---请选择---</option>
        </select>
       </td>
       <td id="2"></td>
       <td id="3"></td>
       <td id="4"></td>
     </tr>
    </table>
    </center>
  </body>
</html>
 

 

JS页面:

 

var xmlHttp;
var zcq=0;
//自动加载国家
function country() {
    var text = "sql=SELECT co_name FROM COUNTRY order by nvl(length(trim(co_name)),0) asc,co_name";
    var url = "ajax/ajax!selectName.action";
    createXmlhttp();
    if (xmlHttp) {
        xmlHttp.open("POST", url, true);
        xmlHttp.setRequestHeader("Cache-Control", "no-cache");
        xmlHttp.setRequestHeader("Content-Type",
                "application/x-www-form-urlencoded");
        xmlHttp.onreadystatechange = function() {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                parseMessage('country');
            }
        }
        xmlHttp.send(text);
    }
}

//实现一级联动省份
function getPronvice() {
    var country = document.getElementById("country").value;
    var url = "ajax/ajax!selectName.action";
    var text = "sql=SELECT pr_name FROM pronvice pr,country co WHERE co.co_id=pr.co_id and co.co_name='"
            + country + "' order by nvl(length(trim(pr_name)),0) asc,pr_name";
    createXmlhttp();
    if (xmlHttp) {
        xmlHttp.open("POST", url, true);
        xmlHttp.setRequestHeader("Cache-Control", "no-cache");
        xmlHttp.setRequestHeader("Content-Type",
                "application/x-www-form-urlencoded");
        xmlHttp.onreadystatechange = function() {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                if(zcq==0){
                    createSelect('pronvice', '2', 'getCity()');
                    zcq=1;
                }
               
                parseMessage('pronvice');
            }
        }
        xmlHttp.send(text);
    }
}
//实现二级联动城市
function getCity() {
    var pronvice = document.getElementById("pronvice").value;
    var url = "ajax/ajax!selectName.action";
    var text = "sql=SELECT ci_name FROM city ci,pronvice pr WHERE ci.pr_id = pr.pr_id and pr.pr_name='"
            + pronvice + "' order by nvl(length(trim(ci_name)),0) asc,ci_name";
    createXmlhttp();
    if (xmlHttp) {
        xmlHttp.open("POST", url, true);
        xmlHttp.setRequestHeader("Cache-Control", "no-cache");
        xmlHttp.setRequestHeader("Content-Type",
                "application/x-www-form-urlencoded");
        xmlHttp.onreadystatechange = function() {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                if(zcq==1){
                    createSelect('city', '3', 'getArea()');
                    zcq=2;
                }
               
                parseMessage('city');
            }
        }
        xmlHttp.send(text);
    }
}
//实现三级联动区县
function getArea() {
    var city = document.getElementById("city").value;
    var url = "ajax/ajax!selectName.action";
    var text = "sql=SELECT ar_name FROM city ci,area ar WHERE ci.ci_id=ar.ci_id and ci.ci_name='"
            + city + "' order by nvl(length(trim(ar_name)),0) asc,ar_name";
    createXmlhttp();
    if (xmlHttp) {
        xmlHttp.open("POST", url, true);
        xmlHttp.setRequestHeader("Cache-Control", "no-cache");
        xmlHttp.setRequestHeader("Content-Type",
                "application/x-www-form-urlencoded");
        xmlHttp.onreadystatechange = function() {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                if(zcq==2){
                    createSelect('area', '4', '');
                    zcq=3;
                }
               
                parseMessage('area');
            }
        }
        xmlHttp.send(text);
    }
}
//创建xmlHttp对象
function createXmlhttp() {
    if (window.XMLHttpRequest) {
        xmlHttp = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
}
//自动创建创建下拉菜单方法
function createSelect(iid, id, methodName) {
    var select = document.createElement("select");
    select.style.cssText = "text-align: center";
    select.id = iid;
    document.getElementById(id).appendChild(select);
    var obj = document.getElementById(iid);
    obj.setAttribute("onchange", methodName);
}
//动态解析生成下拉菜单
function parseMessage(id) {
    var xmlDoc = xmlHttp.responseXML.documentElement;
    var xSel = xmlDoc.getElementsByTagName('root');
    var select_root = document.getElementById(id);
    select_root.options.length = 0;
    for ( var i = 0; i < xSel.length; i++) {
        var xValue = xSel[i].childNodes[0].firstChild.nodeValue;
        var xText = xSel[i].childNodes[0].firstChild.nodeValue;
        var option = new Option(xText, xValue);
        select_root.add(option);
    }
}

 

action页面:

package com.zit.ajaxJoin.action;


import java.io.IOException;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
import com.zit.ajaxJoin.dao.AjaxJoinDao;
import com.zit.ajaxJoin.dao.impl.AjaxJoinDaoImpl;

public class AjaxAction extends ActionSupport{
    private static final long serialVersionUID = 1L;
   
    private String sql;

    public String getSql() {
        return sql;
    }
    public void setSql(String sql) {
        this.sql = sql;
    }
    public String selectName() throws IOException{
        HttpServletResponse response= ServletActionContext.getResponse();
        response.setContentType("html/xml;charset=gb2312");
        response.setCharacterEncoding("UTF-8");
        AjaxJoinDao ajax=new AjaxJoinDaoImpl();
        List<String>list=ajax.selectName(sql);
        String strat_xml="<roots>";
        String end_xml="</roots>";
        String xml="<root><name>---请选择---</name></root>";
        for(String string:list){
            xml+="<root><name>"+string+"</name></root>";
        }
        response.getWriter().write(strat_xml+xml+end_xml);
        return null;
    }
}

实现类查询数据库的方法:

package com.zit.ajaxJoin.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.zit.ajaxJoin.dao.AjaxJoinDao;
import com.zit.ajaxJoin.db.Db;

public class AjaxJoinDaoImpl implements AjaxJoinDao {

    private Connection conn;
    private PreparedStatement ps;
    private Statement stmt;
    private ResultSet rs;
    private Db db=null;
    public List<String> selectName(String sql) {
        if(null==db){
            db=new Db();
        }
        //System.out.println(sql);
        List<String>list=new ArrayList<String>();
        try {
            conn=db.getConnection();
            conn.setAutoCommit(false);
            stmt=conn.createStatement();
            rs=stmt.executeQuery(sql);
            conn.commit();
            while(rs.next()){
                list.add(rs.getString(1));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            db.close(conn, ps, stmt, rs);
        }
        return list;
    }
}
 

struts.xml配置信息:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <constant name="struts.devMode" value="true" />
    <package name="ajax" namespace="/ajax" extends="struts-default">
      <action name="ajax" class="com.zit.ajaxJoin.action.AjaxAction">
        <result name="success">
          /success.jsp
        </result>
      </action>
    </package>
</struts>