在项目中
有需求对后台传过来的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+ajax实现三级级联 在现代Web开发中,动态加载数据并根据用户的选择进行更新是非常常见的需求。例如,在电商网站上选择省份、城市和区县时,后两个选项会根据前一个选项的选择而变化。这种效果可以通过多种...
### JSP+AJAX三级级联及更多级的实现 #### 概述 在Web开发中,级联选择框是一种常见的交互方式,尤其在需要多级数据关联展示时(如省份-城市-区县的选择)。本文将详细介绍如何利用Java Server Pages (JSP) 和 ...
在这个“jQuery+ajax实现三级级联”的实例中,我们主要探讨如何利用这两种技术来创建一个能够逐级联动的下拉菜单系统,这在数据筛选和表单填写中十分常见,如地区选择、部门分类等场景。 首先,jQuery是一个轻量级...
例如,定义两个List对象,分别代表省份和城市,并在用户做出选择后返回相应的城市列表。 ```java public class CascadeSelectAction extends ActionSupport { private List<String> provinces; private List...
2. **JSP页面**:在JSP页面中,你需要创建两个下拉菜单,一个用于显示省份,另一个用于显示根据所选省份动态加载的城市。省份下拉菜单的选择事件触发一个AJAX请求,这个请求通过JSON获取对应省份的所有城市数据。 3...
7. **前端显示**:在JSP页面中,将接收到的级联数据动态渲染成HTML,使用户可以在界面上看到级联效果。 以上就是使用Struts2实现级联菜单的基本流程。在实际开发中,你可能还需要考虑错误处理、缓存优化、国际化...
### 使用jQuery、Ajax、JSP与Servlet实现二级级联菜单 #### 一、项目背景与技术栈概述 本文档将详细介绍如何使用jQuery、Ajax、JSP与Servlet来实现一个简单的二级级联菜单功能。该功能常见于许多Web应用程序中,如...
在提供的压缩包文件"Struts级联doubleselect"中,应该包含了实现上述功能的Action类、JSP页面、配置文件以及可能的模型对象。你可以直接导入到你的项目中,进行测试和学习。通过这个实例,你可以深入了解Struts2的...
在Action中,你可以模拟数据库查询,创建并填充这些对象,然后返回到JSP页面供`doubleselect`使用。 总的来说,Struts2的`doubleselect`标签提供了便捷的方式来处理级联选择,使得用户可以在两个相互关联的列表中...
在描述的博文中,作者分享了如何在JSP页面上创建这样的树形列表。首先,你需要一个数据模型,这个模型应包含节点的ID、父节点ID、节点文本以及是否被选中的状态等属性。此外,还需要一个递归方法来构建树结构,这样...
在`courseList`方法中返回的JSP路径("/xxx/xxx/aaa"),是服务器端生成HTML内容的页面,它的内容将被插入到客户端的`#courseList`元素中。 6. **数据渲染**: 在`success`回调中,`$('#courseList').html(msg);`这...
在Java Web开发中,二级级联下拉菜单是一种常见的用户界面元素,用于提供层次结构的选择。这个场景中,我们利用数据库存储数据,并通过后端处理逻辑动态生成这些下拉菜单。下面将详细介绍如何使用MySQL数据库来实现...
在Java编程中,实现两个表的级联查询是数据库操作中的常见需求,特别是在处理关联数据时。级联查询涉及到从一个表中获取数据,并根据这些数据进一步查询另一个表,以获得更完整的信息。这里我们将深入探讨如何在Java...
Ajax(Asynchronous JavaScript and XML)技术因其能够实现页面局部刷新而受到广泛青睐,尤其在构建动态菜单系统时优势明显。本文将详细介绍如何使用Ajax技术实现一个动态级联菜单功能,并通过具体的代码示例来展示...
在JSP中,我们通常使用JSTL(JavaServer Pages Standard Tag Library)或EL(Expression Language)来简化页面逻辑,但此示例中更可能使用jQuery,因为标签中提到了它。 Ajax是Asynchronous JavaScript and XML的...
这里的`MenuAction`是Action类的名称,`/menu.jsp`是显示菜单的JSP页面。 在Action类中,我们需要定义方法来处理请求,如`loadMenus()`,这个方法可以调用DAO获取数据库中的菜单数据。假设我们有三个级别的菜单,...
在Struts2中集成JSON,可以实现前后端的数据高效交互,特别是在需要动态更新页面内容或者无刷新交互的场景下,如本案例中的省市区级联显示。 在"struts2+json省市区级联显示"这个项目中,我们看到主要功能是通过...
151、在servlets和JSP之间能共享session对象吗? 37 152、如何设置cookie在某一时间后过期? 37 153、如何获得当前的sessions数? 37 154、能设置一些代码在我所有的JSP文件之上运行?如果可以,能共享吗? 37 155、...
用户在选择省份后,系统会动态加载并显示该省份下的所有城市。这种联动效果提供了良好的用户体验,因为它允许用户逐步缩小选择范围,而不是一次性面对所有选项。 在Java中实现省市级联,可以采用多种方法。一种常见...
在上述示例的JSP代码中,`<s:doubleselect>`标签的`list`属性绑定到了`categoryList`,这应该是`Action`返回的`List<Dept>`,其中每个`Dept`对象包含部门ID(`id`)和部门名称(`deptName`)。`doubleList`则绑定到`...