采用以下JSP片段:
<c:forEach items="${items}" varStatus="status">
${'A' + status.index}
</c:forEach>
意图应该清楚,我正在尝试为循环中的每次迭代生成一个基于'A'的字符索引。在Java中,这很好(例如'A' + 1 == 'B'
),但Tomcat 6 barfs上的JSP EL java.lang.NumberFormatException: For input string: "A"
。它似乎无法将字符作为序数值来处理。
当前的解决方案将其分解为自定义taglib,但这对于一些如此微不足道的事情来说是荒谬的。
任何人都可以看到如何说服EL进行此计算吗?
答案 0 :(得分:4)
试试这个
<c:forEach items="${items}" varStatus="status">
&#${65 + status.index};
</c:forEach>
答案 1 :(得分:4)
首先创建字母:
<c:set var="alphabet" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
然后你可以使用fn:substring来访问字母。
${fn:substring(alphabet, status.index, status.index + 1)}
你的例子将成为:
<c:forEach items="${items}" varStatus="status">
<c:set var="indexOfLetter" value="${fn:indexOf('A', alphabet) + status.index}"/>
${fn:substring(alphabet, indexOfLetter, indexOfLetter + status.index + 1}
</c:forEach>
你可能需要一些边缘案例检查,但这应该有效。
答案 2 :(得分:1)
纯EL无法实现这一点。它基本上只能理解字符串,数字和javabeans。如果它没有抛出NumberFormatException
,您仍然会得到A1
,A2
,A3
等。从语义上看,您最好的选择可能是使用HTML <ol>
元素只需要一点点CSS就可以使它成为一个完整的按字母顺序排列的列表:
<ol style="list-style-type: upper-alpha;">
<c:forEach items="${items}" var="item">
<li>${item}</li>
</c:forEach>
</ol>
这将生成
A. item1 B. item2 C. item3 ...
如果这也不是你想要的,可以考虑一个EL函数,它返回给定索引的所需char。或者看看Pointy的聪明解决方案,它基本上可以动态生成XML实体。