Jsf 预处理/后处理来自复合内p:remoteCommand的bean操作方法
我有以下情况: 带有复杂JavaScript的JSF复合组件,我希望JavaScript使用支持bean(使用此复合组件的页面的支持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的一些滥用,但我希望将所有功能封装在一个单元中,如果您可以建议另一个很好的解决方案如何封
@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"/>
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);
}