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: 370
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