ajax动态更新下拉列表

- 日理万妓 2022-08-05 14:28 262阅读 0赞
  1. 前面做了[一个ajax的小demo][ajax_demo],今天看一个动态更新下拉列表,或者也叫级联更新下拉列表,这个也是利用ajax的异步调用去后台实现数据请求,然后回到前台完成下拉列表数据的更新,以增强web应用的交互性。

后台servlet

  1. package com.ajax;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. /**
  10. * Servlet implementation class CreateXML
  11. */
  12. @WebServlet("/CreateXML")
  13. public class CreateXML extends HttpServlet {
  14. private static final long serialVersionUID = 1L;
  15. /**
  16. * @see HttpServlet#HttpServlet()
  17. */
  18. public CreateXML() {
  19. super();
  20. // TODO Auto-generated constructor stub
  21. }
  22. /**
  23. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  24. */
  25. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  26. doPost(request, response);
  27. }
  28. /**
  29. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  30. */
  31. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  32. response.setContentType("text/xml");
  33. response.setCharacterEncoding("UTF-8");
  34. String selected = request.getParameter("selected");
  35. PrintWriter out = response.getWriter();
  36. out.println("<response>");
  37. //下面分别为两个省份创建地市
  38. if (selected.equals("1")){//如果选择的是“湖南省”
  39. out.println("<city>");
  40. out.println("<cityname>长沙</cityname>");
  41. out.println("<cityvalue>1</cityvalue>");
  42. out.println("</city>");
  43. out.println("<city>");
  44. out.println("<cityname>娄底</cityname>");
  45. out.println("<cityvalue>2</cityvalue>");
  46. out.println("</city>");
  47. out.println("<city>");
  48. out.println("<cityname>常德</cityname>");
  49. out.println("<cityvalue>3</cityvalue>");
  50. out.println("</city>");
  51. }else{//如果选择的是“广东省”
  52. out.println("<city>");
  53. out.println("<cityname>广州</cityname>");
  54. out.println("<cityvalue>1</cityvalue>");
  55. out.println("</city>");
  56. out.println("<city>");
  57. out.println("<cityname>深圳</cityname>");
  58. out.println("<cityvalue>2</cityvalue>");
  59. out.println("</city>");
  60. out.println("<city>");
  61. out.println("<cityname>佛山</cityname>");
  62. out.println("<cityvalue>3</cityvalue>");
  63. out.println("</city>");
  64. }
  65. out.println("</response>");
  66. out.flush();
  67. out.close();
  68. }
  69. }
  70. 我们推送到前台的数据为<response><city><cityname>长沙</cityname><cityvalue>1</cityvalue></city></response> xml格式。

前台页面

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  4. "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>AjaxDemo</title>
  9. </head>
  10. <script language="javascript">
  11. // 定义一个变量用于存放XMLHttpRequest对象
  12. var xmlHttp;
  13. // 该函数用于创建一个XMLHttpRequest对象
  14. function createXMLHttpRequest() {
  15. if (window.ActiveXObject) {
  16. xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  17. }
  18. else if (window.XMLHttpRequest) {
  19. xmlHttp = new XMLHttpRequest();
  20. }
  21. }
  22. // 这是响应省份列表的onChange事件的处理方法
  23. function updateSelect(){
  24. var selected = document.getElementById("slt1").value;//得到省份列表的当前选值
  25. // document.getElementById("slt1").selectedIndex 获得选中项索引值(数字)
  26. // document.getElementById("slt1").value 获得选中项的value值
  27. // 创建一个XMLHttpRequest对象
  28. createXMLHttpRequest();
  29. // 将状态触发器绑定到一个函数
  30. xmlHttp.onreadystatechange = processor;
  31. // 通过GET方法向指定的URL建立服务器的调用
  32. xmlHttp.open("GET", "CreateXML?selected="+selected);
  33. // 发送请求
  34. xmlHttp.send(null);
  35. }
  36. // 处理从服务器返回的XML文档并更新地市下拉列表
  37. function processor() {
  38. // 定义一个变量用于存放从服务器返回的响应结果
  39. var result;
  40. // 如果响应完成 并且 返回成功
  41. if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {//
  42. // 取出服务器返回的XML文档的所有city标签的子节点
  43. result = xmlHttp.responseXML.getElementsByTagName("city");
  44. // 先清除地市列表的现有内容
  45. while (document.getElementById("slt2").options.length>0){
  46. document.getElementById("slt2").removeChild(document.getElementById("slt2").childNodes[0]);
  47. }
  48. // 解析XML中的数据并更新地市列表
  49. for(var i=0;i<result.length;i++){
  50. var option = document.createElement("OPTION");
  51. option.text = result[i].getElementsByTagName("cityname")[0].innerHTML;//这就是取出<cityname>中的值
  52. option.value = result[i].getElementsByTagName("cityvalue")[0].innerHTM;//这就是取出<cityvalue>中的值
  53. document.getElementById("slt2").options.add(option);//为地市列表中添加选项
  54. }
  55. }
  56. }
  57. </script>
  58. <body>
  59. <br><br>
  60. <center>
  61. <form name="form1" action="#" method="POST">
  62. 请选择省份:
  63. <select id="slt1" onChange="updateSelect()">
  64. <option value="1">湖南省</option>
  65. <option value="2">广东省</option>
  66. </select>
  67. 地市:
  68. <select id="slt2">
  69. <option value="">请选择地市</option>
  70. </select>
  71. </form>
  72. </center>
  73. </body>
  74. </html>
  75. 上面的程序,初始化页面效果为 ![SouthEast][]
  76. 这让初始化的省份无法看到自己的地市,不够完美,怎么处理一下呢?
  77. 在页面加载完成后,让程序先去后台请求一下当前的省份的地市。页面加载完成,load事件,给body绑定load方法即可。
  78. 我们的处理方法为
  79. <body οnlοad="updateSelect()">
  80. 这样,页面加载完成时,便可以看到页面上面的广东省的地市。 ![SouthEast 1][]

发表评论

表情:
评论列表 (有 0 条评论,262人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Ajax动态列表

     许多页面上都涉及有下拉框,即select标签。对于简单的下拉框,被选择的数据是不需要改变的,我们可以用写死。这样下拉框的数据永远都是那几条。   示例: 1 <s