使用ajax实现菜单联动

通常情况下,GET请求用于从服务器上获取数据,POST请求用于向服务器发送数据。

 

需求:选择第一个下拉框的值,根据第一个下拉框的值显示第二个下拉框的值

 

  1. 首先使用GET方式。

 

客户端HTML页面显示第一个下拉选择框,给当前下拉选择框选择某个选项后,通过XMLHttpRequest向服务器发送请求,请求动态显示第二个下拉选择框。下面是对应的HTML页面的代码。

程序清单:Ajax02request/get/first.html

1 <!DOCTYPE html>
  2 
  3 <html>
  4 
  5 <head>
  6 
  7 <meta name="author" content="silvan" />
  8 
  9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 10 
 11 <title>发送GET请求</title>
 12 
 13 <!-- 给select标签添加样式 -->
 14 
 15 <style type="text/css">
 16 
 17 select {
 18 
 19     width: 160px;
 20 
 21     font-size: 11pt;
 22 
 23 }
 24 
 25 </style>
 26 
 27 </head>
 28 
 29 <body>
 30 
 31     <select name="first" id="first" onchange="change(this.value);">
 32 
 33        <option value="0">---请选择---</option>
 34 
 35        <option value="1" >中国</option>
 36 
 37        <option value="2">美国</option>
 38 
 39        <option value="3">日本</option>
 40 
 41     </select>
 42 
 43     <select name="second" id="second"></select>
 44 
 45     <script type="text/javascript">
 46 
 47     // 定义了XMLHttpRequest对象
 48 
 49     var xmlrequest;
 50 
 51     // 完成XMLHttpRequest对象的初始化
 52 
 53     function createXMLHttpRequest(){
 54 
 55        if(window.XMLHttpRequest){
 56 
 57            // DOM 2浏览器
 58 
 59            xmlrequest = new XMLHttpRequest();
 60 
 61        }else if (window.ActiveXObject){
 62 
 63            // IE浏览器
 64 
 65            try{
 66 
 67               xmlrequest = new ActiveXObject("Msxml2.XMLHTTP");
 68 
 69            }catch (e){
 70 
 71               try{
 72 
 73                   xmlrequest = new ActiveXObject("Microsoft.XMLHTTP");
 74 
 75               }catch (e){
 76 
 77               }
 78 
 79            }
 80 
 81        }
 82 
 83     }
 84 
 85     // 事件处理函数,当下拉列表选择改变时,触发该事件
 86 
 87     function change(id){
 88 
 89        // 初始化XMLHttpRequest对象
 90 
 91        createXMLHttpRequest();
 92 
 93        // 设置请求响应的URL
 94 
 95        var uri = "second.jsp?id=" + id;
 96 
 97        // 设置处理响应的回调函数
 98 
 99        xmlrequest.onreadystatechange = processResponse;
100 
101        // 打开与服务器响应地址的连接
102 
103        xmlrequest.open("GET", uri, true);
104 
105        // 发送请求
106 
107        xmlrequest.send(null);
108 
109     }
110 
111     // 定义处理响应的回调函数
112 
113     function processResponse(){
114 
115        //响应完成且响应正常
116 
117        if (xmlrequest.readyState == 4){
118 
119            if (xmlrequest.status == 200){
120 
121               // 将服务器响应以$符号分隔成字符串数组
122 
123               var cityList = xmlrequest.responseText.split("$");
124 
125               // 获取用于显示菜单的下拉列表
126 
127               var displaySelect = document.getElementById("second");
128 
129               // 将目标下拉列表清空
130 
131               displaySelect.innerHTML = null;
132 
133               // 以字符串数组的每个元素创建option,
134 
135               // 并将这些选项添加到下拉列表中
136 
137               for (var i = 0 ; i < cityList.length ; i++){
138 
139                   // 创建一个<option.../>元素
140 
141                   var op = document.createElement("option");
142 
143                   op.innerHTML = cityList[i];
144 
145                   // 将新的选项添加到列表框的最后
146 
147                   displaySelect.appendChild(op);
148 
149               }
150 
151            }else{
152 
153               //页面不正常
154 
155               window.alert("您所请求的页面有异常。");
156 
157            }
158 
159        }
160 
161     }
162 
163 // 指定页面加载完成后指定change(id)函数
164 
165 document.body.onload = change(document.getElementById("first").value);
166 
167 </script>
168 
169 </body>
170 
171 </html>

采用GET请求将父菜单的ID作为参数发送,根据ID显示第二个下拉框的值。服务器响应页面的代码如下。 

程序清单:Ajax02request/get/second.jsp

<%@ page contentType="text/html; charset=UTF-8" language="java"%>

<%

    String idStr = (String)request.getParameter("id");

    int id = idStr == null ? 1 : Integer.parseInt(idStr);

    switch(id){

       case 1:

           out.println("上海$广州$北京");

           break;

       case 2:

           out.println("华盛顿$纽约$加州");

           break;

       case 3:

           out.println("东京$大板$福冈");

           break;

    }

%>

 上面jsp页面作为服务器响应非常简单:先读取请求参数,当请求id为1时,返回三个中国城市;当请求id为2时,返回三个美国城市;当请求id为3时,返回三个日本城市。

在浏览器中浏览该页面,并改变左边下拉列表的选中项,将看到下图效果:

 

  2. 使用POST方式

 

POST请求的适应性更广,可使用更大的请求参数。而且POST请求的请求参数在页面跳转时,不能在链接地址中直接看到,保密性更好。因此在使用Ajax发送请求时,尽量采用POST方式而不是GET方式发送请求。发送POST请求通常需要如下三个步骤:

  • 使用open方法打开连接时,指定使用POST方式发送请求。
  • 设置正确的请求头,POST请求通常应设置Content-Type请求头。
  • 发送请求,把请求参数转为查询字符串,将该字符串作为send()方法的参数。

对于上面的应用,使用POST方式实现,只需要改一个请求的发送方法,如下所示:

// 事件处理函数,当下拉列表选择改变时,触发该事件
    function change(id) {
        // 初始化XMLHttpRequest对象
        createXMLHttpRequest();
        // 设置请求响应的URL
        var uri = "second.jsp";
        // 设置处理响应的回调函数
        xmlrequest.onreadystatechange = processResponse;
        // 设置以POST方式发送请求,并打开连接
        xmlrequest.open("POST", uri, true); 
        // 设置POST请求的请求头,表示数据被编码为名称/值对
        xmlrequest.setRequestHeader("Content-Type"
            , "application/x-www-form-urlencoded");
        // 发送请求
        xmlrequest.send("id="+id);
    }

其余的部分则无须改变,应用的执行效果与采用GET方式发送请求的效果完全一样。事实上,即使采用POST方式发送请求,一样可以将请求参数附加在请求的URL之后。如果send方法没有请求参数,应传入null,因为有些浏览器规定了send方法必须传入参数。代码如下:

// 事件处理函数,当下拉列表选择改变时,触发该事件
    function change(id) {
        // 初始化XMLHttpRequest对象
        createXMLHttpRequest();
        // 设置请求响应的URL
        var uri = "second.jsp?id="+id;
        // 设置处理响应的回调函数
        xmlrequest.onreadystatechange = processResponse;
        // 设置以POST方式发送请求,并打开连接
        xmlrequest.open("POST", uri, true); 
        // 设置POST请求的请求头
        xmlrequest.setRequestHeader("Content-Type"
            , "application/x-www-form-urlencoded");
        // 发送请求
        xmlrequest.send(null);
    }