JSP中如何遍历数组并筛选得到唯一的对象列表?
问题解决方案
根因定位
问题核心来自两点:
- 反复在
real_estate列表循环内调用rz.fetch查询estate_features表,该方法会复用框架内部的全局查询上下文/缓存,当第二个房产对应的feature id查询匹配不到残留上下文内容时,会错误返回全量特性数据 - 若你是多房产同时提交的场景,所有房产的表单字段(隐藏域
selected_features、checkbox字段selected_features_box)命名完全重复,提交时会互相覆盖值,导致第二个房产存储的是全量特性id
修复方案
1. 优化列表展示逻辑(解决显示全量特性问题)
提前把所有房产特性加载到内存Map,避免循环内反复查询数据库,同时规避框架上下文冲突问题,代码修改如下:
<% // 在real_estate列表循环外先加载全量特性映射 Map<String, String> featureMap = new HashMap<>(); rz.listinit("estate_features", "seq_no asc", "", "noscript"); while(rz.listnext() && rz.listindex >= 0) { String featureId = rz.fetch("estate_features", "_recordid"); String featureText = rz.fetch("estate_features", "feature_text"); featureMap.put(featureId, featureText); } %> <!-- 原有的real_estate列表循环逻辑修改 --> <rz:list module="real_estate" sort="seq_no asc" output="none" options="noscript" filter="<%="pageid=property-"+rz.pageid%>"><% while(rz.listnext() && rz.listindex >= 0) {%><rz:listbody> <% String features = rz.fetch("real_estate", "selected_features"); String[] feature_arr = StringUtils.split(features, "|"); for (int i=0; i < feature_arr.length; i++ ) { if(!feature_arr[i].equals("") && featureMap.containsKey(feature_arr[i])){ String feature_name = featureMap.get(feature_arr[i]); %> <li> <span><%=feature_name%></span> </li> <% } } %> </rz:listbody> <% } %> </rz:list>
2. 修复表单提交冲突(多房产同时提交场景适用)
给每个房产的表单字段加上唯一标识,避免重名覆盖:
<% // 每个房产取自身唯一recordid拼接字段名 String currentEstateId = rz.fetch("real_estate", "_recordid"); String selected_features = rz.fetch("real_estate", "selected_features"); %> <input name="selected_features_<%=currentEstateId%>" type="hidden" value="<%=selected_features%>"/> <rz:list module="estate_features" sort="seq_no asc" output="none" options="noscript" filter=""> <% while(rz.listnext() && rz.listindex >= 0) { %><rz:listbody> <div class="rz-checkbox"> <% String featureName = rz.fetch("estate_features", "feature_text"); String recordid = rz.fetch("estate_features", "_recordid"); // 字段名拼接房产id String selected = "selected_features_box_"+currentEstateId; %> <rzt:checkbox label="<%=featureName%>" field="<%=selected%>" checkedValue="<%=rz.fetch("estate_features", "_recordid")%>" target="" checked="<%=("|"+selected_features+"|").indexOf("|"+recordid+"|") >= 0 ? "true" : "false"%>" /> <%=("|"+selected_features+"|").indexOf("|"+recordid+"|") >= 0 ? "true" : "false"%> </div><!-- /.rz-checkbox --> </rz:listbody> <% } %> </rz:list>
内容的提问来源于stack exchange,提问作者jeffyd193
相关产品推荐
相关产品推荐

