Thursday, March 20, 2008

Oracle ADF Two action listeners in one action


Some time ago, I run into a situation when I wanted to add two action listeners inside a single command element but I realized that this was just not possible. When I asked about that in the JDeveloper forums somebody told me that this could only be accomplished in code, but at that time my knowledge was just not enough



A couple of days ago I run into the same problem. I had a view page that when accessed wanted to know two things:



  • First was the ${row.rowKeyStr} of the row to display
    and ...

  • Next a session scope boolean parameter called
    #{sessionScope.returnHome} that
    indicated whether to return the user to the application home page
    or to another (the search in that case) page.



To summarize, I ended up with the a button called View record in
two different pages both having a navigation case (also called
view) linking to the view record page. in the application JSF
diagram.




On both cases the expression #{row.rowKeyStr} had to be
recorded in the JSF session scope along with a value for the
returnHome flag that had to be true on one occasion
and false on the other..



Following is the code I used to perform this. First the base class :



package myapp.view.backing;

import javax.faces.application.Application;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;

class backing_SRListBase {

public backing_SRListBase()
{
}

public String viewButtonBase_action( boolean returnHome)
{
// access the faces context
FacesContext fc = FacesContext.getCurrentInstance();
Application app = fc.getApplication();

// on both case row.rowKeyStr points to the current row key
ValueBinding vbActRowKey = app.createValueBinding("#{row.rowKeyStr}");
String rowKey = (String )vbActRowKey.getValue(fc);

// in that case we must save that in sessionScope
ValueBinding vbSessionScopeRowKey = app.createValueBinding("#{sessionScope.rowKey}");
vbSessionScopeRowKey.setValue( fc, rowKey);

// also save the return home boolean value
ValueBinding vbReturnHome = app.createValueBinding("#{sessionScope.returnHome}");
vbReturnHome.setValue( fc, new Boolean( returnHome));

return "view";
}
}


Finally, the backing bean for each of the two pages looks like this



package myapp.view.backing;

public class backing_OpenSRList
extends backing_SRListBase {

public backing_OpenSRList()
{
}

public String viewButton_action()
{
return viewButtonBase_action( false);
}
}

0 comments:

Post a Comment