AJAX实现的二级级联菜单
由于项目需求,需要做一个级联下拉列表,上网找了很多的东东,都不好,而且有时候跟项目中的js产生了冲突,所以,只好自己动手写了一个,ajax可以返回两种类型,一个是字符串,一个是xml文档型,以前实现ajax都是采用的串行,今天,做的这个ajax是返回的一个xml对象类型........
看实例:
index.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<html>
??? <head>
??????? <title>二级菜单联动演示</title>
??????? <script type="text/javascript">
??? var req;
??? window.onload=function()
??? {//页面加载时的函数
??? }
???
??? function Change_Select(){//当第一个下拉框的选项发生改变时调用该函数
????? var province = document.getElementById('province').value;
????? var url = "select?id="+ escape(province);
????? if(window.XMLHttpRequest){
??????? req = new XMLHttpRequest();
????? }else if(window.ActiveXObject){
??????? req = new ActiveXObject("Microsoft.XMLHTTP");
????? }
????? if(req){
??????? req.open("GET",url,true);
???????? //指定回调函数为callback
??????? req.onreadystatechange = callback;
??????? req.send(null);
????? }
??? }
??? //回调函数
??? function callback(){
????? if(req.readyState ==4){
??????? if(req.status ==200){
????????? parseMessage();//解析XML文档
??????? }else{
????????? alert("不能得到描述信息:" + req.statusText);
??????? }
????? }
??? }
??? //解析返回xml的方法
??? function parseMessage(){
????? var xmlDoc = req.responseXML.documentElement;//获得返回的XML文档
????? var xSel = xmlDoc.getElementsByTagName('select');
????? //获得XML文档中的所有<select>标记
????? var select_root = document.getElementById('city');
????? //获得网页中的第二个下拉框
????? select_root.options.length=0;
????? //每次获得新的数据的时候先把每二个下拉框架的长度清0
?????
????? for(var i=0;i<xSel.length;i++){
????? //<select><value>1</value><text>昌平</text></select>
??????? var xValue = xSel[i].childNodes[0].firstChild.nodeValue;
??????? //获得每个<select>标记中的第一个标记的值,也就是<value>标记的值
??????? var xText = xSel[i].childNodes[1].firstChild.nodeValue;
??????? //获得每个<select>标记中的第二个标记的值,也就是<text>标记的值
???????
??????? var option = new Option(xText, xValue);
??????? //根据每组value和text标记的值创建一个option对象
???????
??????? try{
????????? select_root.add(option);//将option对象添加到第二个下拉框中
??????? }catch(e){
??????? }
????? }
??? }???????
? </script>
??? </head>
??? <body>
??????? <div align="center">
??????????? <form name="form1" method="post" action="">
??????????????? <table width="70%" border="0" cellspacing="0" cellpadding="0">
??????????????????? <tr>
??????????????????????? <td align="center">
??????????????????????????? 二级联动示例
??????????????????????? </td>
??????????????????? </tr>
??????????????????? <tr>
??????????????????????? <td>
??????????????????????????? <select name="province" id="province" onChange="Change_Select()">
??????????????????????????????? <!–第一个下拉菜单–>
??????????????????????????????? <option value="0">
??????????????????????????????????? 请选择
??????????????????????????????? </option>
??????????????????????????????? <option value="1">
??????????????????????????????????? 北京
??????????????????????????????? </option>
??????????????????????????????? <option value="2">
??????????????????????????????????? 天津
??????????????????????????????? </option>
??????????????????????????????? <option value="3">
??????????????????????????????????? 山东
??????????????????????????????? </option>
??????????????????????????? </select>
??????????????????????????? <select name="city" id="city">
??????????????????????????????? <!–第二个下拉菜单–>
??????????????????????????????? <option value="0">
??????????????????????????????????? 请选择
??????????????????????????????? </option>
??????????????????????????? </select>
??????????????????????? </td>
??????????????????? </tr>
??????????????????? <tr>
??????????????????????? <td>
??????????????????????? </td>
??????????????????? <tr>
??????????????? </table>
??????????? </form>
??????? </div>
??? </body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee?? http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
? <servlet>
??? <servlet-name>action</servlet-name>
??? <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
??? <init-param>
????? <param-name>config</param-name>
????? <param-value>/WEB-INF/struts-config.xml</param-value>
??? </init-param>
??? <init-param>
????? <param-name>debug</param-name>
????? <param-value>3</param-value>
??? </init-param>
??? <init-param>
????? <param-name>detail</param-name>
????? <param-value>3</param-value>
??? </init-param>
??? <load-on-startup>0</load-on-startup>
? </servlet>
? <servlet>
??? <servlet-name>SelectServlet</servlet-name>
??? <servlet-class>com.util.SelectServlet</servlet-class>
? </servlet>
? <servlet>
??? <servlet-name>ChangeServlet</servlet-name>
??? <servlet-class>com.util.ChangeServlet</servlet-class>
? </servlet>
?
? <servlet-mapping>
??? <servlet-name>action</servlet-name>
??? <url-pattern>*.do</url-pattern>
? </servlet-mapping>
? <servlet-mapping>
??? <servlet-name>SelectServlet</servlet-name>
??? <url-pattern>/select</url-pattern>
? </servlet-mapping>
? <servlet-mapping>
??? <servlet-name>ChangeServlet</servlet-name>
??? <url-pattern>/change</url-pattern>
? </servlet-mapping>
? <welcome-file-list>
??? <welcome-file>index.jsp</welcome-file>
? </welcome-file-list>
</web-app>
SelectServlet.java
package com.util;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/***
?*
?* @author zdw
?*
?*/
public class SelectServlet extends HttpServlet
{
??? private static final long serialVersionUID = 1L;
??? public SelectServlet()
??? {
??????? super();
??? }
??? public void destroy()
??? {
??????? super.destroy();
??? }
??? public void doGet(HttpServletRequest request, HttpServletResponse response)
??????????? throws ServletException, IOException
??? {
//??????? response.setCharacterEncoding("GBK");
??????? response.setContentType("text/xml");
??????? response.setHeader("Cache-Control", "no-cache");
??????? request.setCharacterEncoding("GBK");
??????? response.setCharacterEncoding("UTF-8");
??????? String targetId = request.getParameter("id").toString();
??????? System.out.println(targetId);
??????? // 获得请求中参数为id的值
??????? String xml_start = "<selects>";
??????? String xml_end = "</selects>";
??????? String xml = "";
?
//这里采用模拟数据,并不是调用的数据库中的数据。
??????? if (targetId.equalsIgnoreCase("0"))
??????? {
??????????? xml = "<select><value>0</value><text>请选择</text></select>";
??????? } else if (targetId.equalsIgnoreCase("1"))
??????? {
??????????? xml = "<select><value>1</value><text>昌平</text></select>";
??????????? xml += "<select><value>2</value><text>丰台</text></select>";
??????????? xml += "<select><value>3</value><text>海淀</text></select>";
??????????? xml += "<select><value>4</value><text>朝阳</text></select>";
??????? } else if (targetId.equalsIgnoreCase("2"))
??????? {
??????????? xml = "<select><value>1</value><text>塘沽区</text></select>";
??????????? xml += "<select><value>2</value><text>汉沽区</text></select>";
??????????? xml += "<select><value>3</value><text>大港区</text></select>";
??????????? xml += "<select><value>4</value><text>东丽区</text></select>";
??????? } else
??????? {// 如果是3,则返回下面的字符
??????????? xml = "<select><value>1</value><text>济南</text></select>";
??????????? xml += "<select><value>2</value><text>青岛</text></select>";
??????????? xml += "<select><value>3</value><text>淄博</text></select>";
??????????? xml += "<select><value>4</value><text>枣庄</text></select>";
??????? }
??????? String last_xml = xml_start + xml + xml_end;
??????? response.getWriter().write(last_xml);
??? }
??? public void doPost(HttpServletRequest request, HttpServletResponse response)
??????????? throws ServletException, IOException
??? {
??????? doGet(request, response);
??? }
??? public void init() throws ServletException
??? {
??? }
}
这样就可以实现二级的级联菜单了,由这个例子,我想到了,项目中需要做局部刷新的功能,就是将表格中的内容,调用数据库中 的数据替换掉,当然了,这种方法可以用传统的方法实现,但是,给客户的感觉不好,所以,基本上不用,现在都用ajax,来实现。