3

JSTLループがあり、特定の変数が空であるかどうか、または動的変数名であるかどうかを確認しようとしています。ページスコープでc:setを使用すると、ifステートメントから変数にアクセスできません。ただし、を使用して設定する<% pageCotnext.setAttribute(...); %>と、変数を使用できます。

<%
pageContext.setAttribute("alphaParA", "test");
pageContext.setAttribute("alphaParF", "test");
int i = 0;
%>
<ul class="alphadex_links">
    <c:forEach var="i" begin="0" end="25" step="1" varStatus="status">
        <c:set var="currentLetter" scope="page">&#${i+65}</c:set>
        <c:set var="currentPar" scope="page">alphaPar${currentLetter}</c:set>
        <% pageContext.setAttribute("currentPar", "alphaPar" + (char)('A' + i++)); %>
        <li>
            <c:choose>
                <c:when test="${not empty pageScope[currentPar]}">

pageContext.setAttributeブロックを削除すると、テストは常に失敗しますが、ブロックが入っているときと同じようにAとFで成功します。私は非常に混乱していて、どこにも助けを見つけることができません。

4

1 に答える 1

0

JSTLの実行時にHTMLが実行されないため、失敗します。Java / JSP / JSTLがその役割を果たした後、HTMLがWebブラウザーによって取得および解析されるときに、HTMLエンティティに基づいてそのように表される&#65目的の文字の代わりに、Java文字列を効果的に渡します。HTMLエンティティに最後のセミコロンがないことに注意してください。ただし、これが具体的な問題の原因ではありません。A&#65;

具体的な機能要件については、申し訳ありませんが、ELでは運が悪いです。をサポートしていませんchar。あなたの最善の策は、次のような文字列を処理することです。

<c:forEach items="${fn:split('A,B,C,D,E,F,G,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z', ',')}" var="currentLetter">
    <c:set var="currentPar" value="alphaPar${currentLetter}" />
    ${pageScope[currentPar]}
</c:forEach>

String[]必要に応じて、Java endのように文字を自動生成し、アプリケーション属性として設定します。

于 2013-03-25T17:25:47.727 に答える