【问题标题】:jstl conditional not workingjstl条件不工作
【发布时间】:2014-04-07 21:50:20
【问题描述】:

我正在尝试将我的 Java 代码从我的 JSP 文件中分离出来,但我遇到了一些问题。我正在尝试确定用户是否是访客,然后打印适当的操作 EG 登录表单或他们的用户名。

这是我的 index.jsp 文件:

<% if(view.guest) { %>
<%= "Scriptlet: Login Form Here" %>
<% } else { %>
<%= "Scriptlet: User Name Here" %>
<% } %>

<br/><br/>

<c:choose>
<c:when test="${view.guest eq true}">
JSTL Tag: Login Form Here
</c:when>
<c:otherwise>
JSTL Tag: User Name Here
</c:otherwise>
</c:choose>

这会产生以下输出:

Scriptlet:登录表单

JSTL 标签:用户名

如您所见,Scriptlet 产生了预期的结果,但 JSTL 标记产生了相反的结果。事实上,如果我将 JSTL 的条件反转为 false(出于调试目的),它仍然会产生相同的结果“JSTL 标记:用户名”

顺便说一句,view.guest 是对象视图的公共布尔变量。

【问题讨论】:

    标签: jstl conditional-statements


    【解决方案1】:

    JSP EL 不访问局部变量。它访问页面、请求、会话或应用程序范围的属性。它还假设您没有使用公共字段(永远不应该使用),但要遵守 Java Bean 约定。

    而且,就像在 Java 中一样,将布尔值与 true 进行比较是不必要的。你只需要

    <c:when test="${view.guest}">
    

    如果存在名为“view”的页面、请求、会话或应用程序属性,并且公共 getGuest()isGuest() 方法返回 true,则条件将评估为 true。

    如果您根本不使用 scriptlet,您的页面中将永远不会有局部变量,您也永远不会遇到这个问题。

    【讨论】:

    • 我使用了 但它不起作用有什么方法可以针对对象中的变量进行测试吗?
    • 我在回答中修正了一个错误。重新阅读它。但是请务必忘记公共字段和脚本。
    • 好的,所以在我的 CodeProjects.java 文件中添加了这个:public boolean isGuest(){return guest;} 它仍然给出相同的结果
    • 但是您在页面、请求、会话或应用程序范围内的名为“view”的属性中是否有此 CodeProjects 类的实例?
    • 是的。我在页面顶部的 index.jsp 文件中实例化该类,如下所示: 构造函数接受一个参数,用于确定用户是否具有来自 session.getAttribute("auth") 的有效身份验证哈希码。如果返回 null,则假定访客正在访问。然后在 JSTL 中调用布尔方法 view.isGuest() ......这是行不通的。但是它可以在 scriptlet 中使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2020-07-14
    • 2011-09-07
    相关资源
    最近更新 更多