日期:2014-05-17  浏览次数:20728 次

在jsp中<c:foreach>做2个list循环,这个问题该怎样修改?
在原来的时候我是这样写的:但是如果group下有100组数据,我就要去取1w次...,难以想象要是数据很多的话,那样的性能问题太严重了

ExtraFunction extra = null;
List<ExtraFunction> extraList = new ArrayList<ExtraFunction>();
for(Group group : groupList){
extra = extraService.getExtraFunctionByGroupId(group.getGroupId());
extraList.add(extra);
}
request.setAttribute("extraList", extraList);
...
<c:forEach var="group" items="${groupList}" varStatus="st">
<c:forEach var="extra" items="${extraList}" varStatus="st1">
<c:if test="${st.index==st1.index}"> 
...//只有当两个list的下标都一样的时候,再去循环。
</c:if>
</c:forEach>
</c:forEach>


上面这种做法很大程度上会出问题,所以我又改了思路,既然两个list要同时取值,可不可以这样来做:新建一个List,其中放入数组,数组第一个放group,第二个放extraFunction,代码如下:

ExtraFunction extra = null;
List<Object[]> groupDetails = new ArrayList<Object[]>();
for(Group group : groupList){
Object[] unitArray = new Object[2];
unitArray[0] = group;
unitArray[1] = extraService.getExtraFunctionByGroupId(group.getGroupId());
groupDetails.add(unitArray);
}
request.setAttribute("groupDetails", groupDetails); 
...
<c:forEach var="group" items="${groupDetails}" varStatus="st">
<c:if test="${group[1].isPublic == 1 && group[0].status == 1}"><c:if>
...

这样,基本解决了需求问题,之前我还尝试过用map来解决,但是没整好,extraMap(key,value),其中key放的是group的index,而value放的是extraFunction对象,这样在循环的时候

<c:forEach var="group" items="${groupList}" varStatus="st">
...
<a href="<c:if test="${extraMap[st.index].isPublic == 1 && group.status == 1}">
...

但是isPublic的值取不出来,有大拿能给我解惑么?
el?list?map?数组

------解决方案--------------------
引用:
Quote: 引用:

要求是这样的:group和extraFunction是2张表,其中isPublic属于extraFunction,status属于group,extraFunction有groupId,不能直接通过${group.extraFunction}拿到extraFunction对象,也就是说group类中没有getExtraFunction()这个方法,假如groupId为1011,要拿到该group的status值,还要拿到isPublic,现在数组的方法可以了,想知道Map方式该怎么写?

groupId在group里面是主键,在extraFunction表是外键是吧,
这就简单了啊,
select g.status,e.isPublic from group g,extraFunction e where g.id=e.groupId and g.groupId=1011

查询出来一般会是list<object[]>类型的,当然可以在java中转为list<Map<key,value>>
jsp c标签取list里面的map,,<c:forEach?var="map"?items="${mapList}"?varStatus="st">
${map.status}
${map.key},取你自定义map里的key