【问题标题】:How to use the index variable of a JSTL forEach loop to access a map entry?如何使用 JSTL forEach 循环的索引变量来访问映射条目?
【发布时间】:2012-08-06 18:12:35
【问题描述】:

使用 forEach 循环,我想创建表格单元格(用于一行),而每个单元格都包含一个表单的输入字段。表格单元格的数量始终是固定的 (12)。这实际上是没有问题的。然而,挑战来了:forEach 还应该在必须从 Map(Long, Double) 获取的输入字段中输入可变数量的默认值。

这是我的(简化的)尝试:

<c:forEach var="number" begin="1" end="12" >
  <td>
      <input type="text" value="${requestScope.aMapWithData[number]}" /> 
  </td> 
</c:forEach>

但这并没有在输入字段中显示地图中的任何值。我猜问题是“数字”的类型是字符串而不是长。所以我想知道这个问题是否可以在不使用scriptlet的情况下解决。

【问题讨论】:

  • this thread。尤其是接受的答案,以及this one
  • 谢谢提示!隐式类型转换的技巧非常有效: value="${requestScope.aMapWithData[number+0]}"

标签: java jsp foreach jstl


【解决方案1】:

你想显示什么号码?它是每个地图条目的索引号吗?

<c:forEach items="${aMapWithData}" var="item" varStatus="status"> 
    <td> 
        <c:out value="${status.count}."/>  
        <input type="text" name="${item.key}" value="${item.value}" />  
    </td> 
</c:forEach> 

【讨论】:

  • 不,我想显示每个地图条目的实际值。单元格的数量也应该是固定的(12)。在您的解决方案中,单元格的数量取决于地图条目的数量。
  • 只需在forEach标签中添加beginend属性即可。 &lt;c:forEach items="${aMapWithData}" var="item" begin="1" end="12" varStatus="status"&gt; 你会得到想要的行为。
  • 不幸的是,添加“begin”和“end”并没有帮助,因为它们与“items”属性一起没有指定(固定)迭代次数,而是限制地图的哪些元素是包含在迭代中。
  • 你遇到麻烦的原因是别的。启动我的代码。它应该可以正常工作。或者显示您尝试执行的代码。
  • 你确定吗?实际上,我只是从您的答案中复制了您的解决方案,并将第一行替换为您的第一条评论中的第一行。你不觉得我关于 begin/end/items 属性组合的说法是正确的吗?
【解决方案2】:

试试这个

<c:forEach items="${aMapWithData}" var="mapEntry">
   <c:set var="mapKey" value="${mapEntry.key}"></c:set>
   <c:set var="mapValue" value="${mapEntry.value}"></c:set>
</c:forEach>

【讨论】:

  • 您需要指定地图中可能的键。
  • 可能的映射键是 1 到 12 之间的数字(Long)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 2014-08-25
  • 2014-07-21
  • 2012-11-11
  • 1970-01-01
  • 2013-09-20
相关资源
最近更新 更多