0

我在这方面遇到了一些麻烦...

我有这样的代码:

Market market = new market();
List<Market > list = marketService.getMarketItemList(market);
model.addAttribute("list", list);

我有一张这样的桌子:

type      |  item_name

fruit     |  Banana

fruit     |  Apple

vegetable |  Onion

我在我的 JSP 中为每个都编写了一个这样的代码:

<c:forEach var="cmenu" items="${list}">
    <li><a href="${url_itemmarket}/${cmenu.itemName}">${cmenu.description}/a>/li>
</c:forEach>

在 JSP 中,我希望它看起来像这样:

type      |  Item Name

Fruit     |  Banana

          |  Apple

Vegetable |  Onion

我不想在 jsp 视图中重复价值水果

任何人都可以帮我获得一个例子或一些参考资料吗?

谢谢!

4

3 回答 3

1

1.

您的 HTML 中有一些错误:

<li><a href="${url_itemmarket}/${cmenu.itemName}">${cmenu.description}/a>/li>
                                                                      ^  ^
                                                                      |  |
    two errors here (mising < characters) --------------------------------

    replace with this -----------------------------------------------------
                                                                      |   |
                                                                      v   v
<li><a href="${url_itemmarket}/${cmenu.itemName}">${cmenu.description}</a></li>

2.

您应该使用Map

地图的键应该是不同的类型

这些值应该是Food 对象列表

然后您可以在您的 JSP 中遍历映射的键。

您需要一个嵌套循环来遍历每个列表中的食物。

我认为您的 JSP/JSTL 看起来像这样,但未经测试:

<table>
  <tr><th>type</th><th>Item Name</th></tr>
  <!-- iterate over each key in the map -->
  <c:forEach var="foodMapEntry" items="${foodMap}">
    <tr>
      <td>${foodMapEntry.key}</td>
      <td>
        <!-- iterate over each item in the list of foods -->
        <c:forEach var="food" items="${foodMapEntry.value}">         
          | ${food.name}<br/>         
        </c:forEach>
      </td>
    </tr>   
  </c:forEach>
</table>

下面是一些代码,展示了如何构建上面使用的地图:

/* create a list of food */
List<Food> foodList = new ArrayList<Food>();

/* add some fruits to the list */
foodList.add(new Food("Banana", "fruit"));
foodList.add(new Food("Apple", "fruit"));

/* add some veggies to the list */
foodList.add(new Food("Onion", "vegetable"));
foodList.add(new Food("Mushroom", "vegetable"));

/* add some candy to the list */
foodList.add(new Food("Chocolate", "candy"));
foodList.add(new Food("Gummy Bears", "candy"));

/* create a Map that maps food types to lists of Food objects */
Map<String, List<Food>> foodMap = new HashMap<String, List<Food>>();

/* populate the map */
for (Food f : foodList) {
    String foodType = f.getType();
    if (foodMap.containsKey(foodType)) {
        foodMap.get(foodType).add(f);
    }
    else {
       List<Food> tempList = new ArrayList<Food>();
       tempList.add(f);
       foodMap.put(foodType, tempList);
    }
}

还有一个简单的 Food 类:

class Food {
   private String name;
   private String type;

   public Food(String n, String t) {
       name = n;
       type = t;
   }

   public String getName() { return name; }
   public String getType() { return type; }
}

这是关于将地图与 JSP 和 JSTL 一起使用的问题/答案。

于 2013-08-29T01:20:26.713 回答
1

如果您无法创建地图,因此如果您需要使用列表,您可以检查以前的值。

您可以创建一个包含先前值的变量并检查它:

<c:set var="types" value="${['fruit','fruit','vegetable']}"/>
<c:forEach items="${types}" var="type">
  ${type eq previousType ? '-same-' : type}<br/>
  <c:set var="previousType" value="${type}"/>
</c:forEach>

或者,您可以使用以下varStatus属性使用索引:

<c:set var="types" value="${['fruit','fruit','vegetable']}"/>
<c:forEach items="${types}" var="type" varStatus="status">
  ${status.index gt 0 and types[status.index - 1] eq types[status.index] ? '-same-' : type}<br/>
</c:forEach>

在这里你也可以使用not status.first代替status.index gt 0.

两者都会输出:

fruit
-same-
vegetable
于 2020-01-31T08:28:53.540 回答
0

像这样存储您的数据:

Map<String, List<String>> data = new HashMap<String, List<String>>();
于 2013-08-29T01:41:55.760 回答