在jsp中做2个list循环,这个问题该怎样修改?

时间:2022-04-05 23:50:27
在原来的时候我是这样写的:但是如果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的值取不出来,有大拿能给我解惑么?

6 个解决方案

#1


放object[]里取值会靠谱点,
unitArray[1] = extraService.getExtraFunctionByGroupId(group.getGroupId());

话说你这个查询数据库怎么能放循环里面呢,这得循环多少次啊

#2


传了groupId,循环多少次与groupList大小相当

#3


确保list有值后:
jsp任何值也没获取到,检查c:forEach,c:if取值方式,好久没用c标签了
group[1].isPublic觉得jsp应该是不支持objcet.属性的,在java怎么都有个类型转换这事

#4


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

#5


引用 4 楼 u010490219 的回复:
要求是这样的: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}

#6


引用 5 楼 SuperMan1022 的回复:
Quote: 引用 4 楼 u010490219 的回复:

要求是这样的: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

#1


放object[]里取值会靠谱点,
unitArray[1] = extraService.getExtraFunctionByGroupId(group.getGroupId());

话说你这个查询数据库怎么能放循环里面呢,这得循环多少次啊

#2


传了groupId,循环多少次与groupList大小相当

#3


确保list有值后:
jsp任何值也没获取到,检查c:forEach,c:if取值方式,好久没用c标签了
group[1].isPublic觉得jsp应该是不支持objcet.属性的,在java怎么都有个类型转换这事

#4


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

#5


引用 4 楼 u010490219 的回复:
要求是这样的: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}

#6


引用 5 楼 SuperMan1022 的回复:
Quote: 引用 4 楼 u010490219 的回复:

要求是这样的: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