How to ensure custom serverListener events fires before action events
        Posted  
        
            by frank.nimphius
        on Oracle Blogs
        
        See other posts from Oracle Blogs
        
            or by frank.nimphius
        
        
        
        Published on Sat, 26 Feb 2011 13:13:00 +0000
        Indexed on 
            2011/02/26
            15:29 UTC
        
        
        Read the original article
        Hit count: 455
        
ADFv
|JavaScript
Using JavaScript in ADF Faces you can queue custom events defined by an af:serverListener tag. If the custom event however is queued from an af:clientListener on a command component, then the command component's action and action listener methods fire before the queued custom event. If you have a use case, for example in combination with client side integration of 3rd party technologies like HTML, Applets or similar, then you want to change the order of execution.
The way to change the execution order is to invoke the command item action from the client event method that handles the custom event propagated by the af:serverListener tag. The following four steps ensure your successful doing this
1. Call cancel() on the event object passed to the client JavaScript function invoked by the af:clientListener tag
2.      
Call the custom event as an immediate action by
setting the last argument in the custom event call to true
function invokeCustomEvent(evt){
  evt.cancel();        
  var custEvent = new AdfCustomEvent(
                        evt.getSource(),
                        "mycustomevent",                                                                                           
                        {message:"Hello World"}, 
                        true);
   custEvent.queue();
}
3.      
When handling the custom event on the server,
lookup the command item, for example a button, to queue its action event. This
way you simulate a user clicking the button. Use the following code
ActionEvent event =
new ActionEvent(component);
event.setPhaseId(PhaseId.INVOKE_APPLICATION);
event.queue();
The component reference needs to be
changed with the handle to the command item which action method you want to
execute. 
4.      
If the command component has behavior tags, like
af:fileDownloadActionListener,
or af:setPropertyListener,
defined, then these are also executed when the action event is queued. However,
behavior tags, like the file download action listener, may require a full page
refresh to be issued to work, in which case the custom event cannot be issued
as a partial refresh.
File download action tag:
http://download.oracle.com/docs/cd/E17904_01/apirefs.1111/e12419/tagdoc/af_fileDownloadActionListener.html
" Since file downloads must be processed with an ordinary request - not
XMLHttp AJAX requests - this tag forces partialSubmit to be false on the parent
component, if it supports that attribute."
To issue a custom event as a non-partial submit, the previously shown sample code would need to be changed as shown below
function invokeCustomEvent(evt){
  evt.cancel();        
  var custEvent = new AdfCustomEvent(
                        evt.getSource(),
                        "mycustomevent",                                                                                           
                        {message:"Hello World"}, 
                        true);
   custEvent.queue(false); 
}
To learn more about custom events and the af:serverListener, please refer to the tag documentation:
http://download.oracle.com/docs/cd/E17904_01/apirefs.1111/e12419/tagdoc/af_serverListener.html
© Oracle Blogs or respective owner