2010-02-22 44 views
2

序字符采取以下JSP片段:生成在JSP EL

<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來做這個計算嗎?

回答

4

首先創建字母:

<c:set var="alphabet" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/> 

然後你可以使用FN:串訪問字母。

${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> 

你可能需要一些邊緣的情況下檢查,但這應該工作。

+0

我將選擇這一個,因爲它是目前爲止3個答案中最通用的,允許我設置一個JSP變量和結果。另外兩個依靠HTML或者CSS來渲染序列成一個角色,這在很多情況下很吸引人,但不是我目前問題所需要的。 – skaffman 2010-02-23 09:58:30

+0

很高興能幫到你! – BacMan 2010-02-23 15:37:37

1

這對純EL來說是不可能的。它基本上只理解字符串,數字和javabeans。如果它沒有拋出一個NumberFormatException,你仍然會以A1,A2,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函數返回給定索引所需的字符。或者看看Pointy聰明的解決方案,它基本上可以即時生成XML實體。

+0

不幸的是,我需要結果值作爲JSP變量,所以我可以將它傳遞給其他標籤。感謝您的橫向思考,雖然:) – skaffman 2010-02-22 21:26:53

4

試試這個

<c:forEach items="${items}" varStatus="status"> 
    &#${65 + status.index}; 
</c:forEach> 
+0

聰明! (15個字符) – BalusC 2010-02-22 17:36:59

+0

謝謝男人:-)(或女人:-) – Pointy 2010-02-22 17:39:25

+0

非常狡猾! 2個精確定位的巧妙字符。 – skaffman 2010-02-22 21:20:11