使用struts2+jquery+ajax生成联动下拉列表框(select)

有一个这样的需求,用户在填写收货地址的时候,如果用户在第一个下拉列表框选择了“广东省”,我们希望在右边弹出一个下拉列表框,里面可以选择广东省的某个市区,如果用户在市区中选择了“广州市”,我们希望在右边又弹出一个下拉列表框,里面可以选择广州市的某个区。

这种技术可以使用ajax完成。

整体思路是:

页面在加载的时候通过ajax向服务器发送同步请求,服务器返回一个json,页面通过分析这个json先把第一个select的数据填满,然后隐藏第二,三个select,如果用户在第一个select选择了具有子节点的选项,再通过ajax想服务器发送同步请求,页面得到数据后把第二个select填充,再把这个select显示,第三个select使用同样的方法。


首先要知道怎么为一个下拉列表框(select)增加一个选项!

从http://www.w3school.com.cn/htmldom/dom_obj_select.asp得知select 对象有一个add()方法

add()方法定义和用法如下:

add() 方法用于向 <select> 添加一个 <option> 元素。
语法:
selectObject.add(option,before)

参数     描述
option     必需。要添加选项元素。必需是 option 或 optgroup 元素。
before     必需。在选项数组的该元素之前增加新的元素。如果该参数是null,元素添加到选项数组的末尾。


Option 对象代表 HTML 表单中下拉列表中的一个选项。

该对象有下面两个主要属性:

text     设置或返回某个选项的纯文本值。     
value     设置或返回被送往服务器的值。

所以我们可以通过下面方法增加一个select 的option

function insertOption()
  {
  var y=document.createElement('option');
  y.text='Kiwi'
  var x=document.getElementById("mySelect");
  x.add(y,null);
  }
或者通过jquery为一个select增加一个选项
 var x = $("#id")[0];//[0]是必须的,原因不明!如果有高手知道,求解!
    option = new Option();
    option.text="abc";
    x.add(option,null);

然后我们要知道怎么用ajax向服务器发送请求,jquery为我们包装好一些方法:

$(document).ready(function() {
		$.ajaxSetup({async:false});
		var datas;
		$("#child_type").hide();
		$.getJSON("getGoodsType.action", function(json) {
			datas = json;
		});
		if (datas == undefined) {
			alert("no datas");
			return;
		}
		//do something next
}

$.ajaxSetup({async:false});这句话是指将默认的异步请求该为同步请求,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。

getJSON方法定义如下:

jQuery.getJSON(url,data,success(data,status,xhr))

参数     描述
url     必需。规定将请求发送的哪个 URL。
data     可选。规定连同请求发送到服务器的数据。
success(data,status,xhr)     可选。规定当请求成功时运行的函数。
                                额外的参数:
                                data - 包含来自请求的结果数据
                                status - 包含请求的状态
                                xhr - 包含 XMLHttpRequest 对象


服务器返回的json被封装在datas变量里面,通过这个变量可以同javascript进行其他操作。


下面介绍如何用strut2的action将json数据返回。

import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletResponseAware;

import util.JdbcUtils;
import util.JsonUtils;

import com.opensymphony.xwork2.ActionSupport;

public class GetGoodsType extends ActionSupport implements ServletResponseAware {

	private HttpServletResponse response;
	private int parentId = 0;

	@Override
	public String execute() throws Exception {
		response.setContentType("application/json;charset=UTF-8");
		response.setHeader("Cache-Control", "no-cache");

		PrintWriter pw = response.getWriter();
		System.out.println("execute方法被执行----------------");

		System.out.println("parentId=" + this.parentId);
		Connection conn = JdbcUtils.getConnection();
		Statement st = conn.createStatement();
		String sql = "select * from goods_type where parent_id = "
				+ this.parentId + ";";
		ResultSet rs = st.executeQuery(sql);
		Map<String, Object> map = new LinkedHashMap<String, Object>();
		int typeId;
		String typeName;
		while (rs.next()) {
			typeId = rs.getInt("type_id");
			typeName = rs.getString("type_name");
			map.put(typeId + "", typeName);
		}
		System.out.println(JsonUtils.toJson(map));
		pw.write(JsonUtils.toJson(map));
		pw.flush();
		pw.close();
		return null;
	}

	public void setParentId(int parentId) {
		System.out.println("setParentId方法被执行------------------");
		this.parentId = parentId;
	}

	public void setServletResponse(HttpServletResponse response) {

		this.response = response;

	}

}

JsonUtils是我自己写的一个工具类,当然现在有很多json插件,有专门为struts而做的插件,使用起来很方便。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值