2013-01-22 33 views
2

下面是從JSP文件的摘錄我的工作:如何循環使用JSTL/JSP中的逗號而不是字符串集合?

<%@ page session="false" %><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 

... 

<c:forEach var="attr" items="${auth.principal.attributes}" > 
    <c:forEach var="attrVal" items="${attr.value}"> 
     <attribute name="${fn:escapeXml(attr.key)}" value="${fn:escapeXml(attrVal)}"/> 
    </c:forEach> 
</c:forEach> 

... 

每個屬性可以是一個字符串或字符串的集合。這段代碼大部分時間都能正常工作,但是如果其中一個字符串值包含逗號,那麼它將被拆分爲兩個屬性。

什麼我期待像輸出如下:

... 
<attribute name="FirstName" value="Adam"/> 
<attribute name="LastName" value="Franco"/> 
<attribute name="DisplayName" value="Franco, Adam S."/> 
<attribute name="Status" value="Staff"/> 
<attribute name="MemberOf" value="CN=All Staff,OU=Groups,DC=example,DC=edu"/> 
<attribute name="MemberOf" value="CN=Admins,OU=Groups,DC=example,DC=edu"/> 
... 

我得到的卻是:

... 
<attribute name="FirstName" value="Adam"/> 
<attribute name="LastName" value="Franco"/> 
<attribute name="DisplayName" value="Franco"/> 
<attribute name="DisplayName" value=" Adam S."/> 
<attribute name="Status" value="Staff"/> 
<attribute name="MemberOf" value="CN=All Staff,OU=Groups,DC=example,DC=edu"/> 
<attribute name="MemberOf" value="CN=Admins,OU=Groups,DC=example,DC=edu"/> 
... 

我覈實,我的「顯示名稱」屬性通過對未來從後端作爲一個簡單的字符串,就像FirstName和LastName一樣,唯一的區別是它恰好包含逗號。下面是該principle.attributes地圖截屏右側,然後纔會慢慢回到了JSP: enter image description here

我怎麼能一個字符串,並在JSP的字符串的集合區分或防止分裂字符串forEach調用APPART逗號?

回答

1

您可以在迭代每個屬性之前添加一個測試,以檢查屬性的類型是否爲字符串,使用Object.getClass()然後Class.getSimpleName()。如果類型爲String,請勿使用其他迴路: -

<c:forEach var="attr" items="${auth.principal.attributes}" > 
    <c:choose> 
     <c:when test="${attr.value.class.simpleName == 'String'}"> 
      <!-- attr.value is comma-separated string --> 
      <!-- Don't iterate further. Just print it attr.value --> 
      <attribute name="${fn:escapeXml(attr.key)}" value="${fn:escapeXml(attr.val)}"/> 
     </c:when> 
     <c:otherwise> 
      <!-- attr.value is a collection --> 
      <!-- Iterate further over attr.value --> 
      <c:forEach var="attrVal" items="${attr.value}"> 
       <attribute name="${fn:escapeXml(attr.key)}" value="${fn:escapeXml(attrVal)}"/> 
      </c:forEach> 
     </c:otherwise> 
    </c:choose> 
</c:forEach> 
+0

感謝您的幫助。不幸的是,'attr.class.simpleName'的值始終是「UnmodifiableEntry」。我試圖做測試作爲',但我總是得到一個JasperException。 –

+0

@AdamFranco。我可以看到堆棧跟蹤嗎?你可以得到什麼類型的'attr.value'? –

+0

在調試器中,forEach循環中的我的'attr'項目被列爲Collections $ UnmodifiableMap $ UnmodifiableEntrySet $ unmodifiableEntry (id = 6807)。 以下是測試'attr.value.class.simpleName'時的堆棧跟蹤:http://community.middlebury.edu/~afranco/notes/attr-value-class-simplename_stacktrace.txt 據我所知這是因爲attr.value是一個字符數組而不是一個字符串... –

相關問題