无法在 ui 组件的 onclick 属性中调用 bean 操作方法

Can not invoke bean action method in onclick attribute of a ui component

<h:outputLink value="/4JVA-157292-war/supinfo/auth/mycar.xhtml">Car</h:outputLink>
<h:outputLink value="Log Out" onclick="${loginController.logout()}" />

如您所见,如果我单击汽车 link。我将执行 ${loginController.logout()},但如果我删除注销。我会进入汽车页面。

<h:ouputLink> 组件用于呈现普通 a 锚元素,其 href 属性评估为 <h:outputLink>value 属性并附加查询参数如果组件有 <f:param> 个标签作为其子标签。

<h:ouputLink> 未用于 执行服务器端操作,正如您错误地期望的那样。您可能将它与用于通过 Java 脚本调用触发服务器端操作的 <h:commandLink> 组件混淆。

如果你想调用动作方法,你必须切换到命令组件(或其衍生物),如 <h:commandLink>。它的 action 属性应该指向所需的操作方法,如下所示:

<h:commandLink value="Log out" action="#{loginController.logout}" />

这样你就可以执行bean action方法了。

另外值得注意的是,自从 JSF 2.0 以来,有一个 <h:link> 组件可用于处理应用程序范围的导航。它在其 outcome 属性中采用导航案例结果,从而使 <h:outputLink> 组件可用于链接到外部资源。

有关该主题的更多信息,请阅读以下答案:When should I use h:outputLink instead of h:commandLink?


至于您遇到的问题的原因,onclick 属性呈现为生成的 a 元素的 onclick 事件处理程序,该元素响应 HTML 它附加到的元素。如果触发事件,则调用客户端 Java 脚本代码(通过函数调用 onclick 指向或通过执行其中包含的内联代码)。请注意 onclick 在客户端运行(在 Web 浏览器中的 Java 脚本上下文中),而 action 在服务器上运行(根据在其中按下的提交按钮执行 Java 代码网络服务器)。

使用 onclick 至少在以下情况下可能会富有成效:

  • 如果它与命令组件一起使用,它可能停止向服务器提交表单如果一旦事件将被触发 任何相关的连续事件之前,一些客户端要求不满足(即显示确认对话框并按下取消按钮,或客户端验证失败)与元素(如表单提交):

    <h:commandLink value="Delete item" action="#{bean.delete(item)}" onclick="return confirm("Are you sure you want to delete this item?");" ... />
    

    <h:commandLink value="Submit data" action="#{bean.action}" onclick="return inputValid();" ... />
    

    <script type="text/javascript">
        function inputValid() {
            var isInputValid = ...;
            //decide what's valid or not and set variable to true/false accordingly
            return isInputValid;
        }
    </script>
    
  • 它可用于触发一些 GUI 更改,尤其是与非命令组件一起使用时,例如:

    <h:button value="Show dialog" onclick="showDialog(); return false;" ... />