【问题标题】:c:set inside scripletc:set 内的 scriptlet
【发布时间】:2012-12-25 09:48:13
【问题描述】:

正在阅读 Cookies 并检查是否找到特定的 Cookie。如果找到特定的Cookie,则将值设置为某个变量并将其用于进一步检查。下面是代码。

<%
        String showPacksCookie = "DisabledPackagesTab";
        Cookie[] cookielistTab = request.getCookies();

        if(cookielistTab != null)
          {
            for(int i = 0; i<cookielistTab.length; i++)
              {
                  Cookie cookie = cookielistTab[i];

                if(cookie.getName().contains(showPacksCookie) && cookie.getValue().equals("true"))
                {
                    <c:set var="showPackstab" value="display" scope="request" /> 
                  //Above is line 122
                    break;
                }
              }
        }
%>

<c:if test="${showPackstab eq 'display'}">
 <b>Tab</b><img src="/tabImage.gif" align="left" />
</c:if>

这段代码抛出异常,

Syntax error, insert "AssignmentOperator Expression" to complete Assignment 第 122 行

发生这种情况是因为我在 Scriplet 中使用了 JSTL 吗?如何摆脱这个问题?

【问题讨论】:

    标签: jsp jstl scriptlet


    【解决方案1】:

    scriptlet 包含 Java 代码。 &lt;c:set&gt; 不是有效的 Java 代码。 &lt;c:set&gt; 所做的是

    request.setAttribute("showPackstab", "display");
    

    所以这是你的 scriptlet 中应该有的代码。

    但更重要的是,您根本不应该使用 scriptlet。坚持使用 EL、JSTL 和其他自定义标签。如果逻辑太复杂而无法使用这些来表达,那么它表明它不属于视图(JSP),而是属于控制器(用 Java 编写的 servlet 或动作,在 JSP 之前调用,它准备JSP 的数据,并在数据准备好后转发给 JSP)。

    这里不是这样,因为以上所有内容都可以重写为:

    <c:if test="${cookie.DisabledPackagesTab == 'true'}">
        <b>Tab</b><img src="/tabImage.gif" align="left" />
    </c:if>
    

    【讨论】:

    • request.setAttribute.. 完美运行。您建议坚持使用 EL 并提供代码。但是,cookie 的范围仅限于for 循环。你不觉得${cookie.DisabledPackagesTab == 'true'} 在Scriplet 之外不起作用吗?
    • scriptlet 包含 Java 代码。不是 JSP 标签。不是 JSP EL 代码。 ${cookie.DisabledPackagesTab} 表示“名为‘DisabledPackagesTab’的cookie的值”。它不需要任何 scriptlet 或 for 循环即可工作,因为它会为您循环遍历 cookie,找到名为“DisabledPackagesTab”的cookie,并返回其值。
    • 您甚至不需要那里的== 'true' 部分。 EL 会自动将字符串强制转换为布尔值。
    猜你喜欢
    • 1970-01-01
    • 2017-06-27
    • 2010-11-01
    • 2013-04-23
    • 2012-02-24
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多