在JSP EL中生成序数字符

时间:2010-02-22 17:15:40

标签: java jsp

采用以下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进行此计算吗?

3 个答案:

答案 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,您仍然会得到A1A2A3等。从语义上看,您最好的选择可能是使用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实体。