功能实现的思路:我们经常碰见网上购物时候填写收件地址会用到这个查找省市县的三级联动查找功能,我们可以利用Ajax和JSON技术模拟这个功能,说白了同样是使用Ajax的局部数据更新功能这个特性。因为省市都会有很多个,所以还需要使用JSONArray对象。当我们选择某一个省的时候,会自动触发一个局部更新功能,这个功能的作用就是把我们选择的关于这个省的所有市名全部在指定的位置显示出来,当换成另外一个省的时候,还能自动把前边的选择的别的省所包含的市名全部删除换成当前选择省包含的市名。

实现步骤:

1、设计前端界面(毫无艺术感的前端界面):

 <body>
省:
<select id="sheng" onchange="loadInfo()">
<option value="1">河南省</option>
<option value="2">四川省</option>
<option value="3">浙江省</option>
<option value="4">山东省</option>
</select>
&nbsp;
&nbsp;
市:
<select id="shi">
</select>
</body>

2、利用XMLHttpRequset对象放松请求并且接收从服务器端传来的处理结果:

(这里需要注意的是添加重置操作是必要的,因为添加进JSONArray数组的数据如果不清除的话,下一次输出结果的时候还会输出出来,这样会相当于把不属于这个省的市名也给输出出来了,这显然不符合设计要求)

 <script type="text/javascript">
function loadInfo(){
var shengID = document.getElementById("sheng").value;
//这里要添加一个重置操作,确保每一次查询之前JsonArray数组是空的。
document.getElementById("shi").options.length=0;
//获取XMLHttpRequest对象(有些浏览器没有XMLHttpRequest这个对象,所以获取之前需要先判断一下)
var xmlHttp;
if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
} else {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
//alert(xmlHttp.responseText);
var dataObj = eval("(" + xmlHttp.responseText + ")");
for(var i=0;i<dataObj.rows.length;i++){
var o=dataObj.rows[i];
//利用Selectobject对象的options方法动态的添加option选项
document.getElementById("shi").options.add(new Option(o.text,o.id));
} }
}
xmlHttp.open("get", "getAjaxName2?shengID="+shengID, true);
xmlHttp.send();
}
</script>

3、编写处理该请求的后台servlet代码:(这里依然没有使用数据库查询功能,而是手动添加了每个 省份包含的市名作为例子使用。)

 package com.java1234.web;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONArray;
import net.sf.json.JSONObject; public class GetAjaxNameServlet2 extends HttpServlet { /**
*
*/
private static final long serialVersionUID = 1L; @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
} @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//取出从前端页面传入的待查询省份的shengID
String shengID = request.getParameter("shengID");
JSONObject resultJson = new JSONObject();
/**
* JSONArray对象的作用:每个省份都会有好多个市,当确认是那个省之后,
* 就会把每个省的所有市 的名称包含ID全部添加进JSONArray对象中,最后再把这个包含
* 待查询市的JSONArray对象当成一个对象添加进名为resultJson的JSONObject对象中。
*/
JSONArray jsonArray = new JSONArray();
JSONObject temp = null;
//这里只是模拟一下数据库查询操作
switch (Integer.parseInt(shengID)) {
case 1: {
temp = new JSONObject();temp.put("id", 1);temp.put("text", "郑州市");
jsonArray.add(temp);
temp = new JSONObject();temp.put("id", 2);temp.put("text", "南阳市");
jsonArray.add(temp);
temp = new JSONObject();temp.put("id", 3);temp.put("text", "周口市");
jsonArray.add(temp);
temp = new JSONObject();temp.put("id", 4);temp.put("text", "商丘市");
jsonArray.add(temp);
break;
}
case 2: {
temp = new JSONObject();temp.put("id", 5);temp.put("text", "成都市");
jsonArray.add(temp);
temp = new JSONObject();temp.put("id", 6);temp.put("text", "绵阳市");
jsonArray.add(temp);
temp = new JSONObject();temp.put("id", 7);temp.put("text", "乐山市");
jsonArray.add(temp);
temp = new JSONObject();temp.put("id", 8);temp.put("text", "达州市");
jsonArray.add(temp);
break;
}
case 3: {
temp = new JSONObject();temp.put("id", 9);temp.put("text", "杭州市");
jsonArray.add(temp);
temp = new JSONObject();temp.put("id", 10); temp.put("text", "温州市");
jsonArray.add(temp);
temp = new JSONObject();temp.put("id", 11);temp.put("text", "南通市");
jsonArray.add(temp);
temp = new JSONObject();temp.put("id", 12); temp.put("text", "宁波市");
jsonArray.add(temp);
break;
}
case 4: {
temp = new JSONObject();temp.put("id", 13);temp.put("text", "济南市");
jsonArray.add(temp);
temp = new JSONObject();temp.put("id", 14); temp.put("text", "青岛市");
jsonArray.add(temp);
temp = new JSONObject();temp.put("id", 15);temp.put("text", "泰安市");
jsonArray.add(temp);
temp = new JSONObject();temp.put("id", 16); temp.put("text", "聊城市");
jsonArray.add(temp);
break;
}
}
resultJson.put("rows", jsonArray);
out.println(resultJson);
out.flush();
out.close();
} }

4、配置web.xml文件然后运行就能实现这个功能。(运行结果是一个截图不再贴出来了,结果不重要,过程实现好了结果自然而然的不会差!)

  总结:这是一个省市查询问题的二级联动,相对三级联动还算简单一点,但这简单的例子也是能帮助自己理解这一类问题的。这里我按自己的理解说明一下三级联动的实现思路:就是当我们选择到某一个市的时候,还要再触发一个 事件,这个事件就是要动态查找数据库然后把关于这个市所包含的所有县级城市名称全部输出到指定的位置,当然了,这个触发事件的实现函数还是要像查找市级城市名称方法一样获取选择的市级城市然后作为参数传入后台进行查询并把结果全部封装到一个JSONObject对象中,然后在前端进行数据处理并进行展示。

利用Ajax和JSON实现关于查找省市名称的二级联动功能的更多相关文章

  1. SSM框架,在Html界面利用ajax,json,jQuery实现省市区下拉框联动

    1.先生成省市区表格 2.建立实体类 3.在html画出下拉框 <select id="province"> <option value="" ...

  2. Struts2.5 利用Ajax将json数据传值到JSP

    AJAX +JSON=>JSP AJAX AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着 ...

  3. 使用Ajax和JSON实现注册时候验证用户名是否存在的功能

    功能实现的思路:当通常一个网站需要注册用户信息的时候,往往会让用户起一个名字,但一般要求这个用户名称是不能重复的,为了判断新注册的用户填写的用户名是否已经存在,需要对填写的用户名称进行判断,实际项目开 ...

  4. 利用ajax的方式来提交数据到后台数据库及交互功能

    怎么样用ajax来提交数据到后台数据库,并完成交互呢????? 一.当我们在验证表单的时候,为了阻止把错误的也发送到服务器,我们通常这样设置:     $(function(){       var ...

  5. PHP AJAX 返回JSON 数据

    例子:利用AJAX返回JSON数据,间接访问数据库,查出Nation 表,并用下拉列表显示 造一个外部下拉列表框 </select> JQurey代码 $(document).ready( ...

  6. 利用Ajax把前端的数据封装成JSON格式发送到服务器端并写成XML格式在服务器的硬盘上

    1.首先要在前端把要发送的东西(这里是一个实例化的car对象)都准备好,利用Ajax发送到服务器端,代码如下: <html xmlns="http://www.w3.org/1999/ ...

  7. python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)

    昨日内容回顾 基于对象的跨表查询 正向查询:关联属性在A表中,所以A对象找关联B表数据,正向查询 反向查询:关联属性在A表中,所以B对象找A对象,反向查询 一对多: 按字段:xx book ----- ...

  8. Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件

    一.Django与Ajax AJAX准备知识:JSON 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻 ...

  9. javaScript(拼写树形)+ajax请求,去后台查找数据

    第一步:页面加载完成时,利用jquery中的一函数,调用js方法,js方法,发送ajax请求,去后台查找父类权限集合,响应回来json格式的数据,对数据进行操作,往页面上添加内容 //页面初始化加载菜 ...

随机推荐

  1. MyBatis - 4.动态SQL

    动态 SQL是MyBatis强大特性之一.极大的简化我们拼装SQL的操作. 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似. MyBatis 采用功能强大的基于 OGNL ...

  2. 宿主进程 [*.vshost.exe] & [*.vshost.exe.config]

    宿主进程 [*.vshost.exe] & [*.vshost.exe.config] pdb文件: 英文全称:Program Database File 中文全称:程序数据库 文件 Debu ...

  3. Task任务的屏障机制

    Barrier 是 .Net 提供的一直并发的机制,它允许多个任务同步他们不同阶段的并发工作. 这里的关键点是[多个任务]和[不同阶段]. 假设有4个相同的任务(Task),每个任务都有4个阶段(Ph ...

  4. oracle创建用户和密码以及授权登录问题

    创建有户名和密码CREATE USER 用户名 IDENTIFIED BY 密码;分配权限GRANT connect,dba to 用户名; 1:使用oracle的命令行登录oracle的方式(安装好 ...

  5. Java基础知识➣发送Emai和访问MySQL数据库(七)

    概述 Java程序发送 E-mail 十分简单,但是首先你应该在你的机器上安装 JavaMail API 和Java Activation Framework (JAF) .Java访问数据则需要 使 ...

  6. bzoj2870

    题解: 边分治入门题 当然并查集+维护直径更加简单 就是两棵树二合一直径是两颗树上的4个直径两两组合的最大值 查询路径长度你搞个差分查个lca就好了 点分治并不能做这题 分成多个联通块就gg了(点分治 ...

  7. 在vs.net 2010,2015 等版本,给JS函数添加代码提示\注释

    经常编写JS的朋友常常会因为函数写多了,隔一段时间就会忘记了函数的用途,或者函数里带的参数作用情况,这个时候会联想到VS工具里的强大提示功能,多希望也能在JS上实现呀,告诉你,这个想法并不是多难,VS ...

  8. Python_configparser模块

    configparser : 用于处理ini结构相似的文件,格式类似于: [DEFAULT] # 相当于一个分组 # option # 注释,说明性文字 ,默认以# 或‘:’开头的行 option1 ...

  9. Python_list部分功能介绍

    x.append():在列表尾部添加一个元素 x.clear():把列表清空 x.count():判断某个元素出现的次数 x.extend():合并两个列表,或者一个元组 x.index():获取元素 ...

  10. 028 IDEA中下载与上传程序

    在学习的时候,更多的时候在使用eclipse,但是在使用过程中,IDEA有时候使用起来更加方便轻松. 关于,在使用过程中的一些常识,这里谢谢写写文档. 一:拉代码 1.说明 在第一次开始项目的时候,需 ...