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

时间:2015-02-20 07:27:18

标签: jsf onclick action

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

如您所见,如果我点击汽车链接。我将执行${loginController.logout()},但是如果我删除了注销。我会进入车页。

1 个答案:

答案 0 :(得分:4)

<h:ouputLink>组件用于呈现普通a锚元素,其href属性评估为value <h:outputLink>属性,附带查询参数该组件的子标记为<f:param>个标记。

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

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

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

通过这种方式,您将能够执行bean操作方法。

另外值得注意的是,由于JSF 2.0有一个<h:link>组件,可用于处理应用程序范围的导航。它在outcome属性中获取导航案例结果,因此<h:outputLink>组件可用于链接到外部资源。

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


关于您遇到的问题的原因,onclick属性呈现为生成的onclick元素的a事件处理程序,它响应HTML元素上的单击事件。附属于。如果事件被触发,则调用客户端JavaScript代码(通过函数调用onclick指向或执行其中包含的内联代码)。请注意onclick在客户端上运行(在Web浏览器中的JavaScript上下文中),而action在服务器上运行(根据Web服务器中按下的提交按钮执行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;" ... />