Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 预处理/后处理来自复合内p:remoteCommand的bean操作方法_Jsf_Jsf 2_Primefaces_Action_Composite Component - Fatal编程技术网

Jsf 预处理/后处理来自复合内p:remoteCommand的bean操作方法

Jsf 预处理/后处理来自复合内p:remoteCommand的bean操作方法,jsf,jsf-2,primefaces,action,composite-component,Jsf,Jsf 2,Primefaces,Action,Composite Component,我有以下情况: 带有复杂JavaScript的JSF复合组件,我希望JavaScript使用支持bean(使用此复合组件的页面的支持bean,而不是支持组件@FacesComponent)中的新值对其进行部分刷新。 我不想进行完全更新,因为它是一个复杂的JavaScript插件,它将无法接受地崩溃 我使用Primefaces的回调函数从支持组件@FacesComponent获取值,如下所述 我知道这是对JSF的一些滥用,但我希望将所有功能封装在一个单元中,如果您可以建议另一个很好的解决方案如何封

我有以下情况:

带有复杂JavaScript的JSF复合组件,我希望JavaScript使用支持bean(使用此复合组件的页面的支持bean,而不是支持组件
@FacesComponent
)中的新值对其进行部分刷新。 我不想进行完全更新,因为它是一个复杂的JavaScript插件,它将无法接受地崩溃

我使用Primefaces的回调函数从支持组件
@FacesComponent
获取值,如下所述

我知道这是对JSF的一些滥用,但我希望将所有功能封装在一个单元中,如果您可以建议另一个很好的解决方案如何封装如此复杂的jQuery插件,那么就不要搞乱(为了清楚起见,我知道Primefaces有它自己的组件实现,但是它的功能不足以满足我的需求,所以我需要自己实现)它与ajax回调和参数高度相关,非常欢迎在这里分享

我的问题是如何使用JavaScript从backing bean更新backing组件
@FacesComponent
中的值?目前我参与了以下事件链:

  • 使用传递给支持组件
    @FacesComponent
    的参数从Javascript调用,稍后在
    AjaxBehaviorEvent

    JavaScript

           refreshEvents([
                  {name:'start', value:start.format()}, 
                  {name:'end', value:end.format()}
           ]);
    
     <p:remoteCommand name="refreshValues" oncomplete="loadValues()"  action="#{cc.refreshLocal()}" process="@this"/>
    
    JSF代码

           refreshEvents([
                  {name:'start', value:start.format()}, 
                  {name:'end', value:end.format()}
           ]);
    
     <p:remoteCommand name="refreshValues" oncomplete="loadValues()"  action="#{cc.refreshLocal()}" process="@this"/>
    
  • 通过以下JavaScript代码从复合组件调度jQuery事件:

        var hiddenField = $(document.getElementById(variables.hiddenId));
        hiddenField.trigger("keypress");
    
  • 在复合组件的重写方法
    public void queueEvent(FacesEvent event)
    中,我在第一步中添加到我之前存储的
    AjaxBehaviorEvent
    属性中,并向前调度它

  • 在复合组件嵌套并在此组件上执行
    过程的页面中,从复合组件“捕获”的已调度事件:

    <p:ajax event="refreshEvent" process="@this"  listener="#{bean.refreshEvents}"/>
    
    
    
    {bean.refreshEvent}
    方法中,我对
    @EJB
    bean执行请求并加载数据

  • loadValues()

  • 在支持组件的方法
    #{cc.getLocalData()}
    中,我使用以下命令添加回调参数:

    RequestContext.getCurrentInstance().addCallbackParam(“param”,…);

  • 函数
    updateValue(xhr,status,args)
    从步骤5进入
    args
    此参数的值并执行实际更新

  • 所以,我的一般问题是,是否有可能简化这个过程,以及如何简化


    谢谢。

    这确实有点过于复杂了。总共有3个ajax请求只执行一个操作和一个通过视图状态来回传递数据的支持组件

    您的主要目标似乎是能够将bean操作方法声明为复合组件属性,然后由复合组件中的
    调用该属性,并基于传入的参数返回所需的模型实体,最好进行一些预处理和后处理

    您可以在复合界面中使用
    来声明方法表达式属性:

    <cc:interface componentType="yourComposite">
        <cc:attribute name="eventListener" method-signature="com.example.Entity method(java.lang.String, java.lang.String)" required="true" />
    </cc:interface>
    
    复合实现可以如下所示:

    <cc:implementation>
        ...
        <p:remoteCommand name="refreshEvents" 
            process="@this" action="#{cc.processEventListener}"
            oncomplete="updateValues(xhr, status, args)" />
        ...
    </cc:implementation>
    

    现在只有1个ajax请求“像往常一样”.

    看看最新的PF快照或elite版本。它有扩展功能。如果你真的使用PF,为什么不下载源代码,创建补丁并提交呢?有两个问题。首先,我还不在那里,我有很多东西要学。其次,由于我的工作政策,共享代码并不简单,不是不可能,但也不简单。实际上,我只是看了一下源代码,我想我所需要做的就是重写
    protectedvoidencodeevents(FacesContext上下文,Schedule)
    ,可能没有我想的那么难,谢谢你的点击。但是对于这个场景,我应该在webbean中创建json,我想将所有这些功能(POJO->json)封装在一个支持组件中,是否可以实现并保留1个ajax请求?
    <cc:implementation>
        ...
        <p:remoteCommand name="refreshEvents" 
            process="@this" action="#{cc.processEventListener}"
            oncomplete="updateValues(xhr, status, args)" />
        ...
    </cc:implementation>
    
    public void processEventListener() {
        String start = getRequestParameter("start");
        String end = getRequestParameter("end");
        // ...
        MethodExpression method = (MethodExpression) getAttributes().get("eventListener");
        Entity entity = (Entity) eventListener.invoke(getFacesContext().getELContext(), new Object[] { start, end });
        // ...
        addCallbackParam("param", entityAsJSON);
    }