如何使用脚本在jsf中执行自动单击命令按钮

时间:2012-09-05 10:05:55

标签: javascript jsf oracle-adf

我有一种情况,我必须在以下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调用它。 但是当用户加载此页面时,按钮不会被单击,并且不会执行其动作侦听器操作。 请帮助。

2 个答案:

答案 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阶段。然后通过调用

调用JS
String 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(侦听器)中排队一个动作事件