h:自动调用JSF中的链接

时间:2012-05-23 16:41:27

标签: java jsf jsf-2 el

我在JSF2中创建了一个用户身份验证,每个页面上显示的标题都包含:

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

用户指的是userBean,而 logout()只会使会话无效,并向登录页面发出重定向。因此,当用户登录时, user.loggedIn 变为true,并显示注销链接,但它会以某种方式立即被调用,并且用户立即被注销。

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

修改 我复制了错误的代码......花了一个小时搞清楚用户无法登录的原因后,我的运气好了。您可以查看以前的修订版以查看错误复制的代码。

2 个答案:

答案 0 :(得分:4)

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

<击>

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

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

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

<击>


更新<h:link>无意调用bean操作。它的目的是作为纯粹的GET链接。 outcome per specification被评估为值表达式,而不是方法表达式。 outcome必须表示链接必须导航到的视图ID。当EL将您的方法评估为值表达式时,它当然会立即被调用。只需将<h:commandLink>与重定向结合使用即可。另外一个好处是,这不是可收藏的,也不是searchbot-crawlable。

答案 1 :(得分:-1)

这是jsfToolbox的例子:

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

在退出结束时摆脱你的parens。