【问题标题】:Comparing Strings in Struts2 <s:if> Tag比较 Struts2 <s:if> 标签中的字符串
【发布时间】:2015-02-24 21:11:28
【问题描述】:

我有一个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 中删除了会话部分只是为了查看,现在它看起来像这样:

<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. 条件进入&lt;s:else&gt; 块。
  2. 访问类型未打印(不知何故未设置)。

【问题讨论】:

  • 错误可能是NullPointerException,然后您输入s:else 标签。显示您是如何将变量放入会话中的。
  • 嗨@RomanC,我已经编辑了帖子供您查看。

标签: java jsp struts2 ognl


【解决方案1】:

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

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

<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>

【讨论】:

  • 我明白了,所以GUEST 值应该来自后端。如果用户是第一次查看 index.jsp,应用程序如何知道他是访客?我需要使用拦截器来设置这个值吗?
  • MVC框架中的Struts,先调用控制器再渲染视图,不要直接调用JSP。在动作(控制器)中定义一个会话变量。
  • 嘿,我一直在考虑“调用控制器”。我在&lt;welcome-file-list&gt;web.xml 中有index.jsp,所以每次我在Eclipse 中运行它时它都会转到JSP。如何调用控制器?
  • 控制器末尾没有.jsp。欢迎文件应该重定向到控制器。
  • 我是从this 问题中知道的,但是你的帖子比较老,我添加了struts2 标签。
【解决方案2】:

我找到了罪魁祸首。

要在 Struts2 var 中设置 String 值,这一行:

&lt;s:set var="accessType" value="GUEST" /&gt;

应该是:

&lt;s:set var="accessType" value="'GUEST'" /&gt;

当放在value="" 属性中时,单引号 (' ') 必须将字符串文字括起来。

if 检查是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多