`

三、在JSP页面对LIST对象级联显示

 
阅读更多

        在项目中

        有需求对后台传过来的List 对象,在jsp进行级联操作,写了几种实现的方式,

现保存实现步骤如下,以便日后使用。

=================================================

         //    省list    省里有cities    city里有areas

        省 (id,name,cities) 市 (id,name,areas) 区(id,name) 

========

一 、 异步获取:

=========================

JSP:

<div class="item">
	<span><em>*</em>所在地区:</span>
		<span class="error-msg" id="areaNote"></span>
		<div class="fl">
			<input type="hidden" id="provinceSet" value="${provinceList }">
			<select id="provinceList" onchange="loadCity(this)" class="sele">
			<option>请选择</option>
			<c:forEach var="province" items="${provinceList }">
				<option value=${province.id }>${province.name }</option>
			</c:forEach>
			</select>
			<select id="cityList" onchange="loadArea()" class="sele"><option value="">请选择</option></select>
			<select id="areaList" name="deliveryaddress.area.id" class="sele"><option value="">请选择</option></select>
		</div>
</div>
 
js:
<script type="text/javascript">
/**
 * 获取二级列表
 */
function loadCity() 
	{
		var provinceId = $("#provinceList").find("option:selected").val();
		jQuery.ajax( {
		type : "post",
		dataType : "json",
		url : "delivery_loadCity.action",
		data : "provinceId="+provinceId,
		cache : false,
		success : function(dataResult) 
			{
			// 没有登录跳登录
			 if (isUserNotLogin(dataResult)) {
				goToLogin();
				return;
			} 
			var cityHtml = "<option value='0'>请选择</option>";
			if(dataResult)
			{
				$.each(dataResult, function()
					{
						cityHtml += "<option value='" + this.id + "'>" + this.name + "</option>" ;
					}
				);
			}
			$("#cityList").html(cityHtml);
			$("#areaList").html("<option value='0'>请选择</option>");
			},
			error : function(XMLHttpResponse)
			{
				return false;
			}
		});
	}


	/**
	 * 获取三级列表
	 */
	function loadArea() 
	{
		var cityId = $("#cityList").find("option:selected").val();
		jQuery.ajax( {
		type : "post",
		dataType : "json",
		url : "delivery_loadArea.action",
		data : "cityId="+cityId,
		cache : false,
		success : function(dataResult) 
		{
			// 没有登录跳登录
			 if (isUserNotLogin(dataResult)) {
				goToLogin();
				return;
			} 
			var areaHtml = "<option value='0'>请选择</option>";
			if(dataResult)
			{
				$.each(dataResult, function() 
					{
						areaHtml += "<option value='" + this.id + "'>" + this.name + "</option>" ;
					}
				);
			}
			$("#areaList").html(areaHtml);
			},
			error : function(XMLHttpResponse) 
			{
				return false;
		}
	});
}
</script>
 
action:
public String loadCity() throws Exception
	{
		HttpServletRequest request = ServletActionContext.getRequest();
		String provinceId = request.getParameter("provinceId");
		Province province = provinceService.getById(Integer.valueOf(provinceId));
		Set<City> citySet = province.getCities();
		//把citySet集合转成Json传给页面
		//只取得City的id和name属性
		SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
		Set<String> set = filter.getIncludes();
		set.add("id");
		set.add("name");
		writeHtml(JSONArray.toJSONString(citySet,filter));
		return null;
	}
	
	public String loadArea() throws Exception
	{
		HttpServletRequest request = ServletActionContext.getRequest();
		String cityId = request.getParameter("cityId");
		City city = cityService.getById(Integer.valueOf(cityId));
		Set<Area> areaSet = city.getAreas();
		//把areaSet集合传给页面
		//只选取Area的name和id和code属性
		SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
		Set<String> set = filter.getIncludes();
		set.add("id");
		set.add("name");
		writeHtml(JSONArray.toJSONString(areaSet,filter));
		return null;
	}
	
	//返回strData结果给页面
	protected void writeHtml(String strData) throws Exception
	{
		HttpServletResponse response = ServletActionContext.getResponse(); 
		response.setContentType("application/json;charset=UTF-8");  
		response.setHeader("Cache-Control", "no-cache");  
		PrintWriter out = response.getWriter();  
		out.write(strData); 
		out.flush();    
		out.close();
	}
 

========

二 、 遍历Action的属性provinceList 获取:

=========================

 jsp:在隐藏域保存遍历list
<div class="fl">
	<select id="provinceList" class="sele">
		<option>请选择</option>
		<s:iterator value="provinceList" var="province">  
			<option value="<s:property value='id'/>"><s:property value="name"/></option>  
		</s:iterator>  
	</select>
	<select id="cityList" onchange="loadArea()" class="sele"><option value="">请选择</option></select>
	<select id="areaList" name="deliveryaddress.area.id" class="sele"><option value="">请选择</option></select>
</div>
<s:iterator value="provinceList" var="province">
	<s:iterator value="cities" var="city">
		<input type="hidden" name ="province_<s:property value='#province.id'/>" value="<s:property value='#city.name'/>_<s:property value='#city.id'/>"/> 
		<s:iterator value="#city.areas" var="area">  
			<input type="hidden" name ="city_<s:property value='#city.id'/>" value="<s:property value='#area.name'/>_<s:property value='#area.id'/>"/>
		</s:iterator>
	</s:iterator>
</s:iterator>
 js:
$(function(){
	$("#provinceList").change(function (){
		var value = $(this).val();  
        $("#cityList").html("<option value='0'>请选择</option>");  
        $("input[name^='province_"+value+"']").each(function(){  
            var val = $(this).val();  
            $("#cityList").append("<option value='"+val.split("_")[1]+"'>"+val.split("_")[0]+"</option>");  
        });
        $("#areaList").html("<option value='0'>请选择</option>"); 
	});
	$("#cityList").change(function (){
		var value = $(this).val();  
		$("#areaList").html("<option value='0'>请选择</option>");   
        $("input[name^='city_"+value+"']").each(function(){  
            var val = $(this).val();  
            $("#areaList").append("<option value='"+val.split("_")[1]+"'>"+val.split("_")[0]+"</option>");  
        });
	});
});
 
 

========

三 、 Action中将provinceList 转成JSON字符串传给页面保存:

=========================

 jsp:
<div>
	<select id="provinceList" class="sele"><option>请选择</option></select>
	<select id="cityList" class="sele"><option value="">请选择</option></select>
	<select id="areaList" name="deliveryaddress.area.id" class="sele"><option value="">请选择</option></select>
</div>
<%-- 直接在js里保存后台传来JSON的字符串
    页面无需保存
    <s:hidden id="provinceJSONString" value="%{provinceJSONString}"></s:hidden> --%>
 js:将后台传来的字符串保存到js对象中
$(function(){
	var provinceJSONString = $("#provinceJSONString").val();//将java的String对象转成js字符对象
	var provinceJSON = eval('('+provinceJSONString+')');//转换为json对象 
	/**
	 * 首次加载页面,填充province列表
	 * 加载一级列表
	 */
	loadOptions(provinceJSON,$("#provinceList"));
	
	function loadOptions(data,item){
		$.each(data, function(index,value){
				item.append($("<option />").val(index).text(value.name));
			});
	}
	/**
	 * 加载二级列表
	 */
	$("#provinceList").change(function (){
		var value = $(this).val();  
        $("#cityList").html("<option value='0'>请选择</option>");  
        loadOptions(provinceJSON[value].cities,$("#cityList"));
        $("#areaList").html("<option value='0'>请选择</option>"); 
	});
 
action:将provinceList转成JSON格式的字符串
/**
 * provinceList转成JSON字符串
 * @param _provinceList
 * @return
 * @throws Exception
 */
public static String toProvinceJSONString(List<Province> _provinceList) throws Exception
{
	if (_provinceList == null)
		return null;
	Iterator<Province>	itrProvince = _provinceList.iterator();
	StringBuffer strBuffer = new StringBuffer("[");
	while(itrProvince.hasNext())
	{
		Province _province = itrProvince.next();
		strBuffer.append("{\"id\":\""+_province.getId()+"\",\"name\":\""+_province.getName()+"\",\"cities\":[");
		Set<City> Cities = _province.getCities();
		Iterator<City>	itrCity = Cities.iterator();
		while(itrCity.hasNext())
		{
			City _city = itrCity.next();
			strBuffer.append("{\"id\":"+_city.getId()+",\"name\":\""+_city.getName()+"\",\"areas\":[");
			Set<Area> Areas = _city.getAreas();
			Iterator<Area>	itrArea	= Areas.iterator();
			while(itrArea.hasNext())
			{
				Area _area = itrArea.next();
				strBuffer.append("{\"id\":\""+_area.getId()+"\",\"name\":\""+_area.getName()+"\"}");
				if (itrArea.hasNext())
				{
					strBuffer.append(",");
				}
			}
			strBuffer.append("]}");
			if (itrCity.hasNext())
			{
				strBuffer.append(",");
			}
		}
		strBuffer.append("]}");
		if (itrProvince.hasNext())
		{
			strBuffer.append(",");
		}
	}
	strBuffer.append("]");
	
	return strBuffer.toString();
}
 
 
分享到:
评论

相关推荐

    jsp实现局部刷新页面、异步加载页面的方法

    1.在jsp页面需要刷新的地方增加一个控件 &lt;div id=courseList&gt; 2.新建一个jsp页面:aaa.jsp(用来放置需要刷新的内容) 3.将id为courseList的dom标签重新赋值为需要的页面,就能达到局部刷新的目的 $('#courseList'...

    java面试宝典

    151、在servlets和JSP之间能共享session对象吗? 37 152、如何设置cookie在某一时间后过期? 37 153、如何获得当前的sessions数? 37 154、能设置一些代码在我所有的JSP文件之上运行?如果可以,能共享吗? 37 155、...

    千方百计笔试题大全

    151、在servlets和JSP之间能共享session对象吗? 37 152、如何设置cookie在某一时间后过期? 37 153、如何获得当前的sessions数? 37 154、能设置一些代码在我所有的JSP文件之上运行?如果可以,能共享吗? 37 155、...

    jsp从数据库获取数据填充下拉框实现二级联动菜单的方法

    本文实例讲述了jsp从数据库获取数据填充下拉框实现二级联动菜单的方法。分享给大家供大家参考,具体如下: 项目告一段落,现在将遇到的比较实用的东西记录下来,写了多遍了,谨记于此,以备查看! 1、首先在数据库中...

    Json-RPC for java中文手册

    当返回的是java对象List的时候,在javascript中体现为ArrayList?,如果是Map,着体现为js中的 Object,其他的和java中的调用基本相同。 特殊的地方是,通过JS调用java对象方法的时候只能传入简单类型的参数,比 如...

    Java面试宝典2020修订版V1.0.1.doc

    20、页面传递对象的方法? 38 21、Cookied和session区别? 38 22、Filter的生命周期与执行过程 38 23、Tomcat系统内存怎么配置 39 24、JSTL标签库包含哪些? 39 五、数据库部分 40 1、触发器的作用? 40 2、什么是...

    低清版 大型门户网站是这样炼成的.pdf

    5.1.11 持久化对象间的级联操作 277 5.2 hibernate的检索策略 291 5.2.1 立即检索 291 5.2.2 延迟检索 296 5.2.3 迫切左外连接检索 300 5.3 hql查询方式 303 5.3.1 基本查询 303 5.3.2 条件查询 305 5.3.3 ...

    Java学习笔记-个人整理的

    {1.10.5}扩充数组对象长度}{36}{subsection.1.10.5} {1.10.6}Problems}{37}{subsection.1.10.6} {1.11}简单算法}{38}{section.1.11} {1.11.1}打乱算法}{38}{subsection.1.11.1} {1.11.2}排序算法}{38}{...

Global site tag (gtag.js) - Google Analytics