前面咱們已經使用過了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可以方便地獲取返回的數據服務器