我有一个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块。
我在String比较中是否犯了错误?
更新
我从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>
问题:
<s:else>
阻止。答案 0 :(得分:2)
您正在比较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>
答案 1 :(得分:1)
我找到了罪魁祸首。
要在Struts2 var中设置String值,此行:
<s:set var="accessType" value="GUEST" />
应该是:
<s:set var="accessType" value="'GUEST'" />
单引号('')放在value=""
属性中时必须包围字符串文字。
if-check是正确的。