我有一种情况,我必须在以下JSF页面中的页面加载上执行commandButton动作侦听器
<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
xmlns:trh="http://myfaces.apache.org/trinidad/html">
<jsp:directive.page contentType="text/html;charset=UTF-8"/>
<f:view>
<af:document id="d1" partialTriggers="pt1">
<af:resource type="javascript">
function callCustomButton(){
var button =AdfPage.PAGE.findComponentByAbsoluteId("cbCustomFields");
ActionEvent.queue(button,true);
}
</af:resource>
<af:clientListener method="callCustomButton" type="load"/>
<af:form id="f1">
<af:pageTemplate viewId="/ESOPM_Base_Template.jspx" id="pt1">
<f:facet name="main_content">
<af:decorativeBox id="db1" theme="medium">
<f:facet name="top"/>
<f:facet name="center">
<af:panelGroupLayout layout="scroll" id="pgl2">
<trh:tableLayout id="tblUpload" cellPadding="3" cellSpacing="3" halign="center" inlineStyle="font-size:1.2em; font-weight:bold; font-family:helvetica,sans-serif;">
<trh:rowLayout id="rl1">
<trh:cellFormat id="cf1">
<af:panelGroupLayout layout="horizontal" id="pgl3">
<af:commandButton text="Custom Fields"
actionListener="#{EditProperties.generateCustomAttributeFields}"
id="cbCustomFields" partialSubmit="true" visible="true"/>
</af:panelGroupLayout>
</trh:cellFormat>
</trh:rowLayout>
</trh:cellFormat>
</trh:rowLayout>
</trh:tableLayout>
</af:panelGroupLayout>
</f:facet>
</af:decorativeBox>
</f:facet>
</af:pageTemplate>
</af:form>
</af:document>
</f:view>
</jsp:root>
命令按钮是“自定义字段”,我试图通过客户端监听器在页面中使用的javascript调用它。 但是当用户加载此页面时,按钮不会被单击,并且不会执行其动作侦听器操作。 请帮助。
答案 0 :(得分:1)
这是adf-stuff JSF 2吗?如果是这样,您可以使用preRenderViewlistener在页面加载时执行服务器端的某些操作:
<f:view>
<f:metadata>
<f:event type="preRenderView" listener="#{bean.doSomething}"/>
</f:metadata>
</f:view>
<强>更新强>
另一种方法是使您的支持bean请求作用域并使用@PostConstruct Annotation初始化数据:
@ManagedBean
@RequestScoped
public class Bean {
@PostConstruct
public void init (){
}
}
如果你有机会切换到另一个JSF组件库,我会推荐Primefaces。它们为客户端脚本执行支持bean方法提供了一个非常简单的解决方案。请参阅https://www.primefaces.org/showcase/ui/ajax/remoteCommand.xhtml上的<p:remoteCommand>
。
答案 1 :(得分:1)
在f:view(托管bean)中创建一个afterMethod并监听RENDER_RESPONSE阶段。然后通过调用
调用JSString script = "callCustomButton();";
FacesContext fctx = FacesContext.getCurrentInstance();
//Trinidad class
ExtendedRenderKitService erks = null;
//Service also is a Trinidad class
erks = Service.getRenderKitService(fctx, ExtendedRenderKitService.class);
erks.addScript(fctx, script);
通过在视图范围
中设置内存标志,确保避免双重调用弗兰克 附:您是否尝试在服务器上调用该函数,在托管bean(侦听器)中排队一个动作事件