如何使用本机 JavaScript 在 HTML DOM 事件上调用 JSF 托管 bean?

How to invoke a JSF managed bean on a HTML DOM event using native JavaScript?

提问人:Tiago Vieira Dos Santos 提问时间:5/16/2013 最后编辑:BalusCTiago Vieira Dos Santos 更新时间:1/23/2023 访问量:17584

问:

我需要在 HTML DOM 事件期间使用 ajax 执行 JSF 托管 Bean 操作方法,类似于 jQuery 的 .在这个项目中,我只能使用 JSF 生成的 JavaScript。有没有办法在原生 JSF 中做到这一点?我可以使用哪个事件或可以使用哪个 JSF ajax 函数?load$(document).ready(function() { $.ajax(...) })

我正在使用 JSF 2.0、Facelets 和 PrimeFaces。

JavaScript ajax jsf primefaces facelets

评论

3赞 BalusC 5/16/2013
@Heppy:不,绝对没有。您是 JSF 的新手吗?

答:

35赞 BalusC 5/16/2013 #1

几种方式。

  1. 用。请注意,这仅在 JSF 2.3 之后可用。<h:commandScript>

     <h:form>
         <h:commandScript name="commandName" action="#{bean.action}" render=":results" />
     </h:form>
     <h:panelGroup id="results">
         ...
     </h:panelGroup>
    

    您可以在 JS 中调用它,如下所示:

     commandName();
    

    参数可以按如下方式传递:

     commandName({ name1: "value1", name2: "value2" });
    

    并得到如下:

     String name1 = externalContext.getRequestParameterMap().get("name1"); // value1
     String name2 = externalContext.getRequestParameterMap().get("name2"); // value2
    

    要在事件期间调用它,请设置 .loadautorun="true"

     <h:commandScript ... autorun="true" />
    

  2. 如果您使用的是 PrimeFaces,请使用其 <p:remoteCommand>

     <h:form>
         <p:remoteCommand name="commandName" action="#{bean.action}" update=":results" />
     </h:form>
     <h:panelGroup id="results">
         ...
     </h:panelGroup>
    

    您可以在 JS 中调用它,如下所示:

     commandName();
    

    然而,它不使用 JSF 原生 jsf.ajax.request(),而是使用 PrimeFaces 原生 jQuery(你知道,PrimeFaces 是 jQuery/UI 之上的 JSF 组件库)。

    参数可以按如下方式传递:

     commandName([{ name: "name1", value: "value1" }, { name: "name2", value: "value2" }]);
    

    并得到如下:

     String name1 = externalContext.getRequestParameterMap().get("name1"); // value1
     String name2 = externalContext.getRequestParameterMap().get("name2"); // value2
    

    要在事件期间调用它,请设置 .loadautoRun="true"

     <p:remoteCommand ... autoRun="true" />
    

  3. 如果您使用的是 OmniFaces,请使用其 <o:commandScript>。用法与 with 完全相同,但可用于较旧的 JSF 2.x 版本。<h:commandScript>

    只需在第一个示例中替换为。历史说明:完全基于 .h:o:<h:commandScript><o:commandScript>


  4. 使用“隐藏形式”技巧(实际上,“hack”被赋予了丑陋更好的措辞)。

     <h:form id="form" style="display:none;">
         <h:commandButton id="button" action="#{bean.action}">
             <f:ajax render=":results" />
         </h:commandButton>
     </h:form>
     <h:panelGroup id="results">
         ...
     </h:panelGroup>
    

    您可以在 JS 中调用它,如下所示:

     document.getElementById("form:button").onclick();
    

    请注意触发而不是 .立即调用生成的函数,而基本上只模拟元素上的“点击”动作,就好像使用鼠标一样,这在 IE 中是不支持的,并且在某些浏览器中还要求元素实际上是可交互的(即 届时就不能使用了)。onclick()click()onclick()onclickclick()display:none

    你可以通过事先通过JS填写的相同形式传递参数。如何在将 JavaScript 变量作为参数传递给 JSF 操作方法?<h:inputHidden>

    要在事件期间调用它,请考虑将其放入 .自动将 的末尾放在 ,因此不需要包装器。load<h:outputScript target="body">target="body"<script><body>$(document).ready()

     <h:outputScript target="body">
         document.getElementById("form:button").onclick();
     </h:outputScript>
    

  5. 或者,创建一个自定义来扩展和生成必要的 JSF 本机调用。例如,您可以查看 OmniFaces 的源代码UIComponentUICommandjsf.ajax.request()<o:commandScript>

评论

0赞 Tiago Vieira Dos Santos 5/16/2013
谢谢 BalusC!使用组件 remoteCommand 解决了这个问题,现在它 100% 工作了!