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

Tia*_*tos 11 javascript ajax jsf facelets primefaces

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

我正在使用JSF 2.0,Facelets和PrimeFaces.

Bal*_*usC 22

几种方式.

  1. 使用"隐藏形式"技巧(实际上,"黑客"给予丑陋更好的措辞).

    <h:form>
        <h:commandScript name="commandName" action="#{bean.action}" render=":results" />
    </h:form>
    <h:panelGroup id="results">
        ...
    </h:panelGroup>
    
    Run Code Online (Sandbox Code Playgroud)

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

    commandName();
    
    Run Code Online (Sandbox Code Playgroud)

    请注意触发的重要性,<h:commandScript>而不是load在情况下autorun="true".该<p:remoteCommand>立即调用jsf.ajax.request()功能,而load只是触发因素,这是不支持IE的"click"事件.如果您使用的是autoRun="true",您可以安全地使用<o:commandScript>.

    要在<h:commandScript>事件期间调用它,请考虑将其放入h:.该o:自动将<h:commandScript>在端部<o:commandScript>,因此onclick()包装是不必要的.

    <h:commandScript ... autorun="true" />
    
    Run Code Online (Sandbox Code Playgroud)
  2. 由于您已经在使用PrimeFaces,只需使用它click().

    <h:form>
        <p:remoteCommand name="commandName" action="#{bean.action}" update=":results" />
    </h:form>
    <h:panelGroup id="results">
        ...
    </h:panelGroup>
    
    Run Code Online (Sandbox Code Playgroud)

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

    commandName();
    
    Run Code Online (Sandbox Code Playgroud)

    然而,这不使用JSF本机<h:commandButton>,而是使用PrimeFaces本机jQuery(你知道,PrimeFaces是jQuery/UI之上的JSF组件库).

    要在onclick()事件期间调用它,请设置onclick.

    <p:remoteCommand ... autoRun="true" />
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建一个自定义click(),扩展<h:commandLink>并生成必要的JSF本机click()调用.然后,您将重新发明load使用本机JSF ajax而不是jQuery.JSF实用程序库OmniFaces有一个<h:outputScript target="body">组件就是这样做的.另请参见展示源代码.

    <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>
    
    Run Code Online (Sandbox Code Playgroud)

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

    document.getElementById("form:button").onclick();
    
    Run Code Online (Sandbox Code Playgroud)

    要在target="body"事件期间调用它,请设置<script>.

    <h:outputScript target="body">
        document.getElementById("form:button").onclick();
    </h:outputScript>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 升级到JSF 2.3并使用本机<body>组件.它自2.3.0-m06起可用.语法与上面完全相同$(document).ready().只需替换UIComponentUICommand.