【问题标题】:Can not invoke bean action method in onclick attribute of a ui component [duplicate]无法在 ui 组件的 onclick 属性中调用 bean 操作方法 [重复]
【发布时间】:2015-02-20 07:27:18
【问题描述】:
<h:outputLink value="/4JVA-157292-war/supinfo/auth/mycar.xhtml">Car</h:outputLink>
<h:outputLink value="Log Out" onclick="${loginController.logout()}" />

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

【问题讨论】:

    标签: jsf onclick action


    【解决方案1】:

    &lt;h:ouputLink&gt; 组件用于渲染普通的a 锚元素,其href 属性评估为&lt;h:outputLink&gt;value 属性,并附加查询参数,以防组件具有&lt;f:param&gt; 标记作为其子元素.

    &lt;h:ouputLink&gt; 未使用来执行服务器端操作,正如您错误地期望的那样。您可能将它与用于通过 JavaScript 调用触发服务器端操作的 &lt;h:commandLink&gt; 组件混淆了。

    如果你想调用 action 方法,你必须切换到一个命令组件(或其派生项),如&lt;h:commandLink&gt;。它的action 属性应该指向所需的操作方法,如下所示:

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

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

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

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


    至于您遇到的问题的原因,onclick 属性呈现为生成的a 元素的onclick 事件处理程序,该处理程序响应它附加到的 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;" ... />
      

    【讨论】:

    • 如果您也能解释一下onclick 的实际含义/设备/工作原理,那就太好了,因为 OP 显然完全误解了它。
    • 是的,答案中完全没有这一点。我会尽快更新。谢谢!
    • @skuntsel 谢谢你的解释。现在对我来说很清楚了。
    • @Bubble 不客气!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2011-10-14
    • 2012-08-17
    • 2011-02-09
    • 2012-07-25
    • 2012-10-18
    相关资源
    最近更新 更多