Links

   Quran Explorer - Interactive Audio Recitations & Translations

Thursday, May 23, 2013

JSF Action vs ActionListener

96 down vote accepted

Following is the difference btwn Action and ActionListener in JSF

actionListener

Use actionListener if you want have a hook before the real business action get executed, e.g. to log it, and/or to set an additional property (by ), and/or to have access to the component which invoked the action (which is available by ActionEvent argument). The actionListener method has by default the following signature:
import javax.faces.event.ActionEvent;
// ...

public void actionListener(ActionEvent event) {
    // ...
}
Note that you can't pass additional arguments by EL 2.2. You can however override the ActionEvent argument altogether by passing and specifying custom argument(s). The following examples are valid:
actionListener="#{bean.methodWithoutArguments()}" 
actionListener="#{bean.methodWithOneArgument(arg1)}" 
actionListener="#{bean.methodWithTwoArguments(arg1, arg2)}" 
(note the importance of the parentheses in the argumentless method, if they were absent, JSF would still expect a method with ActionEvent argument)

action

Use action if you want to execute a business action and if necessary handle navigation. The action method can return a String which will be used as navigation case outcome (the target view). A return value of null or void will let it return to the same page. A return value of empty string or the same view ID will also return to the same page, but destroy any view scoped beans. The action method can be any valid MethodExpression, also the ones which uses EL 2.2 arguments, e.g:
 value="submit" action="#{bean.edit(item)}" />
with
public void edit(Item item) {
    // ...
}
Note that when your action method solely returns a string, then you can also just specify exactly that string in the action attribute.
E.g. this is totally clumsy:
 value="Go to next page" action="#{bean.goToNextpage}" />
with
public String goToNextpage() {
    return "nextpage";
}
Instead just do
 value="Go to next page" action="nexpage" />
Please note that this in turn indicates a bad design: navigating by POST. This is not user nor SEO friendly. This all is explained in When should I use h:outputLink instead of h:commandLink? and is supposed to be solved as
 value="Go to next page" outcome="nextpage" />

Invocation order

The actionListeners are always invoked before the action in the same order as they are been declared in the view and attached to the component. So, the following example
 value="submit" actionListener="#{bean.listener1}" action="#{bean.submit}">
     type="com.example.SomeActionListener" />
     target="#{bean.property}" value="some" />
will invoke Bean#listener1(), SomeActionListener#processAction(), Bean#setProperty() and Bean#submit() in this order.

Exception handling

The actionListener supports a special exception: AbortProcessingException. If this exception is thrown from an actionListener method, then JSF will skip any remaining action listeners and the action method and proceed to render response directly. You won't see an error/exception page, JSF will however log it. If you intend to block the page by an error page as result of a business exception, you should be performing the job in the action method.

 DISCLAIMER: I dont take any credit for this explanation. (because it was 'shamelessly' copied from BalusC's answer at Stack Overflow)

No comments:

Post a Comment

Feel free to leave a comment