【问题标题】:h:link in JSF gets called automatically自动调用 JSF 中的 h:link
【发布时间】:2012-05-30 06:13:34
【问题描述】:

我正在 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,但它需要一个表单,我正在努力避免它。

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

【问题讨论】:

    标签: java jsf jsf-2 el


    【解决方案1】:

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

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

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

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


    更新:&lt;h:link&gt; 不打算调用 bean 操作。它的目的是作为一个纯粹的 GET 链接。 outcome 是 per specification 评估为值表达式,而不是作为方法表达式。 outcome 必须代表链接必须导航到的视图 ID。当 EL 将您的方法评估为值表达式时,它当然会立即被调用。只需继续使用 &lt;h:commandLink&gt; 和重定向即可。另一个优点是这不是可收藏的,也不是可搜索机器人抓取的。

    【讨论】:

    • 很抱歉,我复制了错误的代码(我在尝试解决方案时使用的代码)。请参阅上面的编辑。
    • &lt;h:link&gt; 无法调用 bean 操作。它纯粹是一个页面到页面导航的 GET 链接。 outcome 按规范评估为值表达式。只需将&lt;h:commandLink&gt; 与重定向结合使用即可。另一个优点是它既不是书签也不是 searchbot-crawlable。
    • 好吧,不知道。谢谢!
    • 不客气。在以后的问题中,请不要在提供代码时如此粗心:)
    【解决方案2】:

    这是来自 jsfToolbox 的示例:

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

    在注销结束时去掉你的括号。

    【讨论】:

    • 我收到一个服务器错误:“类 'project.UserBean' 没有属性 'logout'。”我应该对 bean 中的方法做一些特别的事情吗?
    • 这只更证实了我的回答。 EL 将其作为值表达式进行评估,并且没有括号,然后它正在寻找不存在的 getLogout() 方法。
    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2018-01-18
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多