有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JSTL:“空”检查错误?需要修理吗

我试图使用JSTL的empty操作符来检查对象是否为NULL,并相应地输出一些html,但不管如何,它似乎总是返回true。所以,要么我误解了如何实现这一点(这是很有可能的),要么这里有一些bug。不管怎样我都需要一个有效的解决方案。。如果不是通过JSTL,那么可以通过其他方式。以下是代码:

<%@page import="com.ksc.models.UserToken"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%
    UserToken token = (UserToken)session.getAttribute("userToken");
    if (token != null) {
        System.out.println("***** Token: " + token.toString());
    }
%>

    <div class="navbar navbar-fixed-top">
        <div class="navbar-inner">
            <div class="container-fluid">
                <a class="btn btn-navbar" data-target=".nav-collapse" data-toggle="collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </a>
                <a href="/KSC" class="brand">KSC Technology &amp; Sciences</a>
                <div class="nav-collapse">
                    <div class="pull-right">
                        <ul class="nav">
                            <c:choose>
                                <c:when test="${empty token}">
                                    <li><a href="/KSC/account/login">Login</a></li>
                                </c:when>
                                <c:otherwise>
                                    <li class="dropdown">
                                        <a class="dropdown-toggle" data-toggle="dropdown" href="#">
                                            <b class="icon-user"></b>
                                            Account
                                            <b class="caret"></b>
                                        </a>
                                        <ul class="dropdown-menu">
                                            <li><a href="/KSC/account/my-account">My Account</a></li>
                                            <li><a href="/KSC/account/logout">Logout</a></li>
                                            <c:if test="${token.hasRole('Administrators')}">
                                                <li><a href="/KSC/admin">Dashboard</a></li>
                                            </c:if>
                                        </ul>
                                    </li>
                                </c:otherwise>
                            </c:choose>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>

如您所见,我希望在用户未登录时输出“登录”链接,或在用户登录时输出注销链接。顶部打印令牌的代码向我证明了对象并不总是空的。事实上,我已经看到输出窗口给了我以下信息:

INFO: ***** Token: com.ksc.models.UserToken@72087294

然而,用户界面总是显示登录链接,即使我已经通过了身份验证。那么,有什么好处呢

编辑

我对代码进行了一点编辑,现在开始怀疑这里是否还有其他问题。。这是我的代码:

<%@page import="com.ksc.models.UserToken"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%
    UserToken token = (UserToken)session.getAttribute("userToken");

    boolean authorized = (token != null);

    if (authorized) {
        System.out.println("***** Auth Token: " + token.toString());
    }
%>

<div class="navbar navbar-fixed-top">
    <div class="navbar-inner">
        <div class="container-fluid">
            <a class="btn btn-navbar" data-target=".nav-collapse" data-toggle="collapse">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </a>
            <a href="/KSC" class="brand">KSC Technology &amp; Sciences</a>
            <div class="nav-collapse">
                <div class="pull-right">
                    <ul class="nav">
                        <c:if test="${not authorized}">
                            <li><a href="/KSC/account/login">Login</a></li>
                        </c:if>
                        <c:if test="${authorized}">
                            <li class="dropdown">
                                <a class="dropdown-toggle" data-toggle="dropdown" href="#">
                                    <b class="icon-user"></b>
                                    Account
                                    <b class="caret"></b>
                                </a>
                                <ul class="dropdown-menu">
                                    <li><a href="/KSC/account/my-account">My Account</a></li>
                                    <li><a href="/KSC/account/logout">Logout</a></li>
                                    <c:if test="${token.hasRole('Administrators')}">
                                        <li><a href="/KSC/admin">Dashboard</a></li>
                                    </c:if>
                                </ul>
                            </li>
                        </c:if>
                    </ul>
                </div>
            </div>
        </div>
    </div>
</div>

现在我很确定这应该是有效的。这段代码是单个jsp页面中的所有内容,然后将其放入带有<jsp:include>标记的普通页面中。此外,我正在使用Spring MVC。这些事实中的任何一个(或两者)会导致这个问题吗?这很奇怪,因为我仍然看到输出窗口显示auth令牌在那里的事实。救命


共 (1) 个答案

  1. # 1 楼答案

    在我的控制器方法中将其添加到ModelMap中,然后像这样使用它:

    <c:if test="${userToken == null}">

    <c:if test="${userToken != null}">

    它现在起作用了,但我仍然想知道为什么另一种方法不起作用。。非常困惑