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

它失败是因为 HTML 在 JSTL 运行时没有运行。在 Java/JSP/JSTL 完成其工作后,当 Web 浏览器检索和解析 HTML 时,您实际上是向其传递了一个 Java 字符串&#65,而不是所需的字符,该字符A将基于 HTML 实体表示。&#65;请注意,您的 HTML 实体缺少结束分号,但这不是您的具体问题的原因。

至于具体的功能要求,对不起,你对 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 回答