前面咱们已经使用过了XML做为数据载体在AJAX中与服务器进行交互。当时候咱们的案例是二级联动,使用Servlet进行控制javascript
此次咱们使用JSON做为数据载体在AJAX与服务器交互,使用三级联动,使用Action进行控制….html
与上次是同样的,只不过此次换了用JSON,使用Action控制罢了…前端
监听下拉框的变更,使用异步对象与服务器进行交互。java
<%-- Created by IntelliJ IDEA. User: ozc Date: 2017/5/18 Time: 13:36 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>使用JSON数据载体与服务器进行交互</title> <script type="text/javascript" src="js/ajax.js"></script> </head> <body> <%--############前台页面##############################--%> <select name="province" id="provinceId"> <option>请选择省份</option> <option>广东</option> <option>北京</option> </select> <select name="city" id="cityId"> <option>请选择城市</option> </select> <select name="area" id="areaId"> <option>请选择区域</option> </select> <%--############监听省份##############################--%> <script type="text/javascript"> document.getElementById("provinceId").onchange= function () { // 获得选中的下拉框的值 var provinceValue = this.options[this.selectedIndex].innerHTML; /***************ajax代码*************************/ if("请选择省份" != provinceValue) { //每次访问的时候,都要清空select的值 var citySelect = document.getElementById("cityId"); citySelect.options.length = 1; var ajax = createAJAX(); var method = "post"; var url = "${pageContext.request.contextPath}/province_findCityByProvince?time=" + new Date().getTime(); ajax.open(method, url); ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded"); //顾及到发送的key、value值有不少,因而咱们使用对象吧。 ajax.send("bean.name=" + provinceValue); /***************等待服务器的响应,获得服务器返回的数据************************/ ajax.onreadystatechange = function () { if(ajax.readyState==4) { if(ajax.status==200) { var jsonJava = ajax.responseText; //解析成是JS类型的JSON var json = eval("(" + jsonJava + ")"); //获得每一个城市的值 for(var i=0;i<json.city.length;i++) { var city = json.city[i]; //动态建立option控件 var option = document.createElement("option"); option.innerHTML = city; citySelect.appendChild(option); } } } }; } }; </script> </body> </html>
要想Struts2可以把Action的数据封装成JSON,就须要导入Struts2的开发包ajax
在Action中对应的成员属性须要给getter方法编程
import com.opensymphony.xwork2.ActionSupport; import java.util.ArrayList; import java.util.List; /** * Created by ozc on 2017/5/18. */ public class ProvinceAction extends ActionSupport{ //自动封装数据 private Bean bean; public Bean getBean() { return bean; } public void setBean(Bean bean) { this.bean = bean; } //封装城市的集合 private List<String> city = new ArrayList<>(); public List<String> getCity() { return city; } public String findCityByProvince() throws Exception { if ("广东".equals(bean.getName())) { city.add("广州"); city.add("珠海"); city.add("从化"); } else if ("北京".equals(bean.getName())) { city.add("一环"); city.add("二环"); city.add("三环"); city.add("四环"); } else { System.out.println("没有你选择的地区"); } return "ok"; } }
返回给前端的时候,数据是这样子的:json
<%--############监听城市##############################--%> <script type="text/javascript"> document.getElementById("cityId").onchange = function () { //清空值 var areaSelect = document.getElementById("areaId"); areaSelect.options.length = 1; //获得选择选中的下拉框的值 var cityValue = this.options[this.selectedIndex].innerHTML; if(cityValue!="请选择城市"){ var ajax = createAJAX(); var method = "post"; var url = "${pageContext.request.contextPath}/province_findAreaByCity?time=" + new Date().getTime(); ajax.open(method, url); ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded"); //顾及到发送的key、value值有不少,因而咱们使用对象吧。 ajax.send("bean.name=" + cityValue); /***************等待服务器的响应,获得服务器返回的数据************************/ ajax.onreadystatechange = function () { if(ajax.readyState==4) { if(ajax.status==200) { var jsonJava = ajax.responseText; var json = eval("(" + jsonJava + ")"); //获得每一个地区的值 for(var i=0;i<json.area.length;i++) { var area = json.area[i]; //动态建立option控件 var option = document.createElement("option"); option.innerHTML = area; areaSelect.appendChild(option); } } } } }; }; </script>
public String findAreaByCity() throws Exception { if ("广州".equals(bean.getName())) { area.add("白云区"); area.add("黄浦区"); area.add("萝岗区"); } else if ("珠海".equals(bean.getName())) { area.add("香江"); area.add("拱北"); area.add("EE"); area.add("xx"); } else { System.out.println("没有你选择的地区"); } return "ok"; }
此次使用的是JSON做为数据载体与服务器进行交互,和XML本质上是没有区别的。浏览器
只不过JSON是更加轻量级文本数据,在JavaScript可以方便地获取返回的数据服务器