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>

...

各属性は、文字列または文字列のコレクションのいずれかです。このコードはほとんどの場合問題なく動作しますが、文字列値の 1 つにカンマが含まれていると、2 つの属性に分割されます。

私が期待しているのは、次のような出力です。

...
<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 に答える