java - 比较 Struts2 中的字符串 <s :if> Tag

标签 java jsp struts2 ognl

我有一个 index.jsp页面中某些元素根据用户是否登录而打开/关闭。

<head>
    <s:set var="accessType" value="GUEST" />
    <s:if test="#session.containsKey('currentAccessType')">
        <s:set var="accessType" value="#session.currentAccessType" />
    </s:if>
</head>

<body>
    <nav>
        <s:if test="#accessType.equals('GUEST')">
            <ul>
                <li><a href="index.jsp">Home</a></li>
                <li><a href="#">Login</a></li>
                <li><a href="http://www.mywebsite.com" target="_blank">Main Site</a></li>
            </ul>
        </s:if>

        <s:else>
            <ul>
                <li><a href="index.jsp">Home</a></li>
                <li><a href="#">Control Panel</a></li>
                <li><a href="#">Logout</a></li>
                <li><a href="http://www.mywebsite.com" target="_blank">Main Site</a></li>
            </ul>
        </s:else>
    </nav>
</body>

accessType设置为 GUEST .但是,即使用户尚未登录,它也会进入 else block 。

我是否在字符串比较中犯了错误?

更新:
我从 index.jsp 中删除了 session 部分只是为了看看,它现在看起来像这样:

<head>
    <s:set var="accessType" value="GUEST" />
    <!-- removed session code for testing -->
</head>

<body>
    <nav>
        <s:if test="#accessType.equals('GUEST')">
            <ul>
                <li><a href="index.jsp">Home</a></li>
                <li><a href="#">Login</a></li>
                <li><a href="http://www.mywebsite.com" target="_blank">Main Site</a></li>
            </ul>
        </s:if>

        <s:else>
            <ul>
                <li><a href="index.jsp">Home</a></li>
                <li><a href="#">Control Panel</a></li>
                <li><a href="#">Logout</a></li>
                <li><a href="http://www.mywebsite.com" target="_blank">Main Site</a></li>
            </ul>
        </s:else>
    </nav>

    <br />

    Access type is <s:property value="#accessType" />.
</body>

问题:

  1. 条件输入<s:else>阻止。
  2. 访问类型未打印(不知何故未设置)。

最佳答案

您在 s:if 语句中比较一个字符串,当您为变量使用一个字符串值时,它在测试文件中运行良好。所以,"'GUEST'" 起作用了。如果没有引号,OGNL 会尝试解析双引号中的值,如果它在值堆栈中找不到名为 GUEST 的变量,则返回 null。然后您尝试打印这个转换为空字符串的值。您还在 JSP 中硬编码了 'GUEST' 的值,这不好。

解决方案:您不应在 JSP 中编写业务逻辑。您应该在操作中定义 session 变量并在 JSP 中访问此 session 变量,而不是根据某些逻辑条件重新定义变量值。

<head>
<!--
    <s:set var="accessType" value="GUEST" />
    removed session code for testing -->
</head>

<body>
    <nav>
        <s:if test="#session.currentAccessType.equals('GUEST')">
            <ul>
                <li><a href="index.jsp">Home</a></li>
                <li><a href="#">Login</a></li>
                <li><a href="http://www.iacademy.edu.ph" target="_blank">Main Site</a></li>
            </ul>
        </s:if>

        <s:else>
            <ul>
                <li><a href="index.jsp">Home</a></li>
                <li><a href="#">Control Panel</a></li>
                <li><a href="#">Logout</a></li>
                <li><a href="http://www.iacademy.edu.ph" target="_blank">Main Site</a></li>
            </ul>
        </s:else>
    </nav>

    <br />

    Access type is <s:property value="#session.currentAccessType" />.
</body>

关于java - 比较 Struts2 中的字符串 <s :if> Tag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27676055/

相关文章:

java - 字符串到对象而不是对象到字符串?

java - jsp session 中的类型转换错误

java - 在Struts2中加载长时间运行的初始化数据时如何避免WSOD(黑屏)?

java - 如何使用 Struts 2 在 jsp 中获取操作 url

java - 匿名内部类——获取 "this"

java - 如何运行 jetty 服务器进行 java junit 测试

java - Coldfusion 读取不带扩展名的 XML HTTP

java - Spring MVC 3.0 中映射到模型的对象列表

java - JSP 代码错误

java - struts2中访问url参数的方法