JSF. Load and invoke supported bean methods on each page
See the English answer > invoke JSF managed bean action on page load4
I have pages with datasheets and several bean - supported buttons The bean should be initialized with some default properties You can change the properties according to the operation I start with the requestscoped bean and @ postconstruct annotation methods However, it seems that datatable is only applicable to the view (session) scope Now my settings look like this:
@ManagedBean @ViewScoped public class ProductsTableBean implements Serializable { private LazyDataModel<Products> productsData; @Inject private ProductsFacade model; public void onPageLoad() { // here some defaults are set // ... System.err.println("onPageLoad called"); } public void addRow() { // andhere some defaults redefined // ... System.err.println("addRow called"); } ...
And fragments from JSF pages:
<p:commandButton action="#{productsTableBean.addRow()}" title="save" update="@form" process="@form" > </p:commandButton> ... <f:Metadata> <f:event type="preRenderView" listener="#{productsTableBean.onPageLoad}"/> </f:Metadata>
The following are the main problems in the call sequence. I have the following output:
onPageLoad called addRow called onPageLoad called <-- :(
However, I want addrow to be the last called action, as shown below:
onPageLoad called addRow called
Here are simple solutions
Solution
Check this link:
You know that events are called on every request: Ajax, validation failure You can check whether it is such a new request:
public boolean isNewRequest() { final FacesContext fc = FacesContext.getCurrentInstance(); final boolean getmethod = ((HttpServletRequest) fc.getExternalContext().getRequest()).getmethod().equals("GET"); final boolean ajaxRequest = fc.getPartialViewContext().isAjaxRequest(); final boolean validationFailed = fc.isValidationFailed(); return getmethod && !ajaxRequest && !validationFailed; } public void onPageLoad() { // here some defaults are set // ... if (isNewRequest()) {...} System.err.println("onPageLoad called"); }