0

我正在 JSF2 中创建用户身份验证,并且我在每个页面上显示的标题都包含以下内容:

<c:if test="#{user.loggedIn}">
    <li><h:link value="Log out" outcome="#{user.logout}"/></li>
</c:if>

User引用 userBean,logout()只是使会话无效,并发出重定向到登录页面。因此,当用户登录时,user.loggedIn变为真,并显示注销链接,但不知何故立即被调用,并且用户立即注销。

有谁知道为什么会这样?我想过使用h:commandLink,但它需要一个表单,我试图避免它。

编辑: 我复制了错误的代码......在花了一个小时弄清楚为什么用户无法登录之后我的运气。您可以查看以前的版本以查看错误复制的代码。

4

2 回答 2

4

当 JSF 标签未被识别和解析时,可能会发生这种情况,并且它有效地呈现为纯文本,其中所有 EL 表达式都被评估为值表达式。在您的情况下,它基本上会打印#{user.logout()}. 但是当 EL 这样​​做时,当然会调用方法的逻辑。

如果您删除该action属性并在浏览器中打开页面并执行View Source,那么您将看到一个未解析的<h:commandLink>标签而不是生成的 HTML<a>元素。

确保h:在视图文件的根标记中的正确 URI 上定义了 XML 命名空间。

xmlns:h="http://java.sun.com/jsf/html"


更新<h:link>不打算调用 bean 操作。它的目的是作为一个纯粹的 GET 链接。根据规范outcome,它被评估为值表达式,而不是方法表达式。必须表示链接必须导航到的视图 ID 。当 EL 将您的方法评估为值表达式时,它当然会立即被调用。只需与重定向结合使用即可。另一个优点是这不是可收藏的,也不是可搜索机器人抓取的。outcome<h:commandLink>

于 2012-05-23T16:50:30.647 回答
-1

这是来自 jsfToolbox 的示例:

<h:commandLink id="link1" 
               value="#{bundle.checkoutLabel}" 
               action="#{shoppingCartBean.checkout}" />

在注销结束时摆脱你的括号。

于 2012-05-23T16:47:43.027 回答