无法在 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;" ... />
<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;" ... />