代码之家  ›  专栏  ›  技术社区  ›  jeph perro

如何在JSP中重新排列数据

  •  1
  • jeph perro  · 技术社区  · 14 年前

    我有一个servlet(我无法更改)来收集要在网页上显示的信息。我在JSP页面中使用bean来循环信息。

    我试图简化,但我的信息基本上是这样存储在表中的 alt text http://img36.imageshack.us/img36/4295/schemase.jpg

    ---2009
    ------TOYOTA
    ---------BLUE 10
    ---------RED 20
    ------CHEVY
    ---------BLUE 30
    ---------RED 10
    ---2010
    ------TOYOTA
    ---------BLUE 30
    ---------RED 12
    ------CHEVY
    ---------BLUE 12
    ---------RED 20
    

    当我每年、按类别、按颜色显示报告时,这非常有用。我可以很容易地循环这些年,循环分类,然后循环颜色。这是我的报告(简体) alt text http://img841.imageshack.us/img841/3666/reportihave.jpg

    现在我需要把这些信息转到一边。我需要创建一个报告来显示每种颜色,每年的计数。这是我需要的报告:

    alt text http://img33.imageshack.us/img33/461/reportineed.jpg

    谢谢

    3 回复  |  直到 14 年前
        1
  •  2
  •   duffymo    14 年前

    我认为你不应该在JSP中做这样的事情。让servlet处理请求,以正确的形式放置数据,让JSP简单地显示它。在我看来,您似乎要求JSP做一些它不应该做的事情。

    如果这些是对象,您应该能够遍历不同的键(本例中为颜色)并重新显示,而不会有太多麻烦。让servlet以正确的形式发送第二个映射。

    你在用JSTL吗?如果你不是,你应该是。

        2
  •  1
  •   Michael    14 年前

    为了与原来的方法保持一致,可以重新排列嵌套数组,使其看起来如下所示:

    ---BLUE
    ------2009
    ---------TOYOTA 10
    ---------CHEVY 30
    ------2010
    ---------TOYOTA 30
    ---------CHEVY 12
    etc
    

    您的JSP代码在遍历所有数组时看起来一定很糟糕。我的建议如下:创建一个表示表中一行的JavaBean类,并将该JavaBean类的实例列表传递给JSP以供显示:

    爪哇豆

    public class ColorRow{
      private String color;
      private int year;
      //...
      //getters and setters
    }
    

    Servlet/控制器

    List<ColorRow> colorTable = new ArrayList<ColorRow>();
    //populate the list
    request.setAttribute("colorTable", colorTable);
    

    <c:forEach items="${colorTable}" var="row">
      <tr><td>${row.color}</td><td>${row.year}</td><!-- ... --></tr>
    </c:forEach>
    
        3
  •  0
  •   jeph perro    14 年前

    我通过循环遍历bean中的列表来解决这个问题,直到找到颜色列表,然后开始一次又一次地循环,直到找到每种颜色的所有记录。

    <c:forEach var="year1" items="${Info.list}"  varStatus="yearCounter1" >
        <c:if test="${yearCounter1.count == 1}">
            <c:forEach var="clist1" items="${year1.list}" varStatus="catCounter1">   
                <c:if test="${catCounter1.count == 1}">
                     <c:forEach var="colorlist1" items="${colorlist1.list}" varStatus="colorCounter1">
                                     <!-- this gets me to all possible colors -->
                                     <c:forEach var="year2" items="${Info.list}"  varStatus="yearCounter2" >
                        <c:forEach var="clist2" items="${tlist2.list}" varStatus="catCounter2">
                                                 ....
                                                              <c:if test="${colorCounter1.description==colorCounter3.description&& year2.description==year3.description  && clist2.description==clist3.description}" >
    

    效率高吗?不。

    它是JSTL的一个好用法吗?不。