我在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 ,但它需要一个表单,我试图避免它。
修改 我复制了错误的代码......花了一个小时搞清楚用户无法登录的原因后,我的运气好了。您可以查看以前的修订版以查看错误复制的代码。
答案 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。