X

The blog for hints & tips about Oracle Application Development Framework and Mobile Application Framework

  • ADFv
    April 23, 2012

How-to invoke a method once upon application start

Frank Nimphius
Master Principal Product Manager

A requirement on the OTN forum was to execute a method only
once upon application start either for the application as a whole (all user instances)
or once per application user session. In addition, the method to be executed
was exposed as an Operation binding on the ADF binding layer.

One way to provide a solution to this requirement is to within
the combination of a phase listener on the JSPX of JSF document level and a
managed bean in application or session scope (dependent on whether the method
should be executed once per application start or once per application user
session).

The phase listener can be configured on a JSF document, as mentioned
or in the faces-config.xml
file if there is no single entry to an application. For this example, we assume
a single point of entry so that the phase listener can be configured on the
f:view attribute.

<f:view beforePhase="#{ManagedBean.onBeforePhase}">

The event logic is configured in a bean in request scope so
it could also hold component references for the page if required.

public void onBeforePhase(PhaseEvent phaseEvent) {//render response is called on an initial page request 
  if
(phaseEvent.getPhaseId() == PhaseId.RENDER_RESPONSE){

FacesContext fctx = FacesContext.getCurrentInstance();
ELContext elctx = fctx.getELContext();
ExpressionFactory exprFactory = fctx.getApplication().getExpressionFactory();

//call the managed bean in application or session scope. If the //bean instance already exists, then no new instance of it will be  //created,in which case the "initial load" method is not executed

ValueExpression ve = exprFactory.createValueExpression(
elctx, "#{your_managed_bean_in_application_or-session_scope", Object.class);

ve.getValue(elctx);

}

}

The idea for this phase listener is to reference a managed
bean in application scope or session scope base on your requirement. The
managed bean in session or application scope invokes the method you want to
invoke once per application or user session in its post construct method

//Managed Bean in application scope
import
javax.annotation.PostConstruct;

...

@PostConstruct

public
void methodInvokeOncedOnPageLoad(){

  //access the methods you want to invoke. If they are exposed in the //PageDef file, access the BindingContext --> BindingContainer --> //OperationBinding. Alternatively you can call BindingContext --> //findDataControl("Name as in DataBindings.cpx") --> //getApplicationModule --> findViewObject/Execute methods

...
}

Note that the Java EE @PostConstruct bean is called once
for each bean instantiation. In the managed bean case, the bean is instantiated
once per application or session and so is the method executed once.


                                         
    
                    
          
        
              
       

                                
                                                                

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.