【问题标题】:Using jquery ajax to call a jsf managed bean method (an AjaxBehaviorEvent listener handler)使用 jquery ajax 调用 jsf 托管 bean 方法(AjaxBehaviorEvent 侦听器处理程序)
【发布时间】:2013-01-06 17:04:10
【问题描述】:

我想知道是否有办法通过使用 jquery ajax 服务器请求直接触发 jsf 托管 bean 方法(使用 AjaxBehaviorEvent 类型参数:使用 f:ajax 时触发相同)。顺便说一下,我jsf 开发人员,我没有找到一个关于使用 jquery ajax 和 Java EE 作为服务器端框架的例子,我发现的所有例子都是用 php..所以我希望得到一个完整的例子。 我认为另一种解决方法可能是在客户端使用 jquery 提交 commandLink 并通过该调用传递参数,但我更喜欢前一种解决方案,我希望它能工作。

非常感谢您的帮助!

【问题讨论】:

    标签: jquery ajax jsf managed-bean


    【解决方案1】:

    给你:

    <script type="text/javascript">
    
        doAwesomeness();
    
    </script>
    

    在您的页面中:

    <a4j:jsFunction name="doAwesomeness" action="#{awesomeBean.awesomeMethod}"/>
    

    祝你好运!

    【讨论】:

    • Thnx 很棒的 stackoverflow 成员 :)
    • 但这不是纯粹的 JSF。标签来自RichFaces
    【解决方案2】:

    jQuery ajax 请求和 JSF ajax 请求使用不同的 js 库,我认为尝试将它们混合太多没有意义......

    如果您希望从 jQuery 触发 JSF 托管 bean 操作,您最好使用隐藏的 h:commandButton 来实现此目的...

    JSF:

    <h:commandButton id="someId" action="#{someBean.someMethod}" style="display:none">
        <f:ajax render="someId" execute="someId"/>
    </h:commandButton>
    

    如果你想传递更多隐藏的参数,你可以在隐藏的h:commandButtonexecute属性中添加更多隐藏的JSF组件ID,这样它们对应的属性将在服务器端更新......

    js

    $("#someId").click();
    

    另一方面,如果您想在 servlet 中使用与您的 jQuery 调用相对应的托管 bean 数据,您始终可以访问该 JSF 托管数据,如下所示:JSF - get managed bean by name

    【讨论】:

    • 感谢您的回答,但我仍然认为即使 jQuery ajax 和 JSF ajax 使用不同的 js 库,也可以从一个向另一个发出请求,因为我猜它们实际上都在处理 HTTP请求,以便他们可以交流..
    • 好吧,现在我投降了..我想在萤火虫上检测一个带有 请求 URL 的 commandLink 是如何形成的,因为我可以用 jquery-ajax 做同样的事情,我发现了这个:
    • j_idt7 = j_idt7&j_idt7%3Aj_idt11 =玛丽&j_idt7%3Aj_idt13 =玛丽&s_var1 =&s_proclength =&s_taskId =&javax.faces.ViewState = -1257726806850207849%3A3895641171480667070&javax.faces.source = j_idt7%3Aj_idt50&javax.faces.partial.event =单击&的javax .faces.partial.execute=j_idt7%3Aj_idt50&javax.faces.partial.render=j_idt7%3Acontent&taskname=marytask&javax.faces.behavior.event=click&javax.faces.partial.ajax=true
    • :发送了很多 jsf 特定的参数,如果不了解其背后的所有理论,很难进行个性化..
    • 我认为你不应该去那里......无论如何你不应该过多地使用那个隐藏按钮......当你这样做时,它比所有的js代码都好......跨度>
    【解决方案3】:

    与 islandguy 指出的一样,如果您使用 Primefaces,则应使用 &lt;p:remoteCommand/&gt; 命令,如下所示:

    <script type="text/javascript">
          doAwesomeness();
    </script>
    

    与:

     <p:remoteCommand name="doAwesomeness" 
              actionListener="#{awesomeBean.awesomeMethod}"
              oncomplete="jsToExecuteOnAjaxSuccess()" />
    

    希望这会有所帮助..

    【讨论】:

      猜你喜欢
      • 2013-03-18
      • 1970-01-01
      • 2013-01-24
      • 2011-11-06
      • 2011-11-10
      • 2013-04-16
      • 2012-08-11
      • 2014-07-02
      • 1970-01-01
      相关资源
      最近更新 更多