Java 如何将velocity表达式转换为JSP?

Java 如何将velocity表达式转换为JSP?,java,jsp,velocity,Java,Jsp,Velocity,我有一个页面,我正在从Velocity转换为JSP。我有一些复杂的表达式,我不知道如何转换成JSTLEL语言 #set ($col = 0) #foreach ($hour in $form.bean.grid.hours) $hour.cells.get($col).hourOfDay #set ($col = $col + 1) #end 小时是一个对象,它包含一个单元格,该单元格包含一个列表。我需要通过数字索引获取每个元素 有什么想法吗?比如: <c:set var="c

我有一个页面,我正在从Velocity转换为JSP。我有一些复杂的表达式,我不知道如何转换成JSTLEL语言

#set ($col = 0)

#foreach ($hour in $form.bean.grid.hours)
  $hour.cells.get($col).hourOfDay
  #set ($col = $col + 1)
#end
小时是一个对象,它包含一个单元格,该单元格包含一个列表。我需要通过数字索引获取每个元素

有什么想法吗?

比如:

<c:set var="col" value="0"/>

<c:forEach items="${form.bean.grid.hours}" var="hour">
   ${hour.cells[col].hourOfDay}
   <c:set var="col" value="${col + 1}"/>
</c:forEach>

${hour.cells[col].houroday}
只有当
hour.cells
是一个
Map
时,这才有效,因此原始的
cells.get($col)
表达式正在调用该
Map
上的
get()
。如果它是一个任意方法调用,那么它将不起作用,因为JSPEL只能处理bean属性或集合


正如@EliteGeterman所指出的,您可以使用
forEach
循环上的
varStatus
来消除对单独循环计数器的需要,您应该这样做。我的片段是更直译的。

基本上,你展示了一天中的几个小时。使用JSTL

<c:forEach items="${form.bean.grid.hours}" var="hour" varStatus="index">
   ${hour.cells[index.count - 1].hourOfDay}
</c:forEach>

${hour.cells[index.count-1].hourOfDay}

index.count中的
计数
从1开始计数到N(因此用1取反)。

啊,灯泡亮了。谢谢我现在明白了EL的工作原理与velocity的不同,而是使用
LoopTagStatus#getIndex()
,即在给定示例中使用
index.index
。它是基于0的,不需要用1减去它。Javadoc here:为了避免混淆,我将
varStatus
声明为
loop
。即
${foo[loop.index]}
。更多的自我解释。谢谢BalusC,很明显你有时间为每个java问题提供建议-D