2

这是我正在使用的 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"/>
...

我已经验证了我的“DisplayName”属性是作为一个简单的字符串从后端传递到的,就像 FirstName 和 LastName 一样,唯一的区别是它恰好包含一个逗号。这是principle.attributes地图在返回到 JSP 之前的屏幕截图: 在此处输入图像描述

如何区分 JSP 中的字符串和字符串集合,或者防止forEach调用以逗号分隔字符串?

4

1 回答 1

1

您可以在迭代每个属性之前添加一个测试,以检查属性的类型是否为字符串Object.getClass(),然后使用Class.getSimpleName()。如果 type 是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>
于 2013-01-22T22:11:59.553 回答