Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to execute action on GET request with f:viewParam?

Tags:

jsf

jsf-2

I'm currently trying out sending the id of a record from one page to another page.

So in the page 1, i have something like this :

<p:column>
    <h:link value="#{rpb.map['transNum']}" outcome="TInput.xhtml">
        <f:param name="id" value="#{rpb.map['id']}" />
    </h:link>
</p:column>

and in the target page (TInput.xhtml), i have something like this to capture the id :

....
    xmlns:fn="http://java.sun.com/jsp/jstl/functions">

<f:metadata>
    <f:viewParam name="id" value="#{tInputBean.id}"></f:viewParam>
</f:metadata>

<h:head>
....

Now, clicking on the link, goes to page 2, and page 2 is handled by one view-scoped jsf bean. And from my debugging, this is the order of happenning :

  1. the @PostConstruct method is executed
  2. the model is updated with the id captured from the viewParam (after appy request + validation)

What i would like to achieve is that : after the model is updated, i would like to execute a query for that record id, get it's bean and it's list of details from Business Service.

I wonder where should i could put my query code :

  1. inside @PostConstruct method is not possible, since the id captured from the viewParam is set to the model after the @PostConstruct method finishes
  2. use a phase listener on after the model update ?
  3. use a system event ? although i cant seem to find the appropriate one for this case

Please enlighten me :)

like image 499
Albert Gan Avatar asked Apr 13 '11 10:04

Albert Gan


2 Answers

Add a <f:event type="preRenderView"> to the <f:metadata>.

<f:metadata>
    <f:viewParam name="id" value="#{tInputBean.id}" />
    <f:event type="preRenderView" listener="#{tInputBean.init}" />
</f:metadata>

with a

public void init(ComponentSystemEvent event) throws AbortProcessingException {
    // ...
}

(by the way, in contrary to the documentation, the argument and the exception are optional, at least in all Mojarra 2.x versions I've had used)

like image 54
BalusC Avatar answered Nov 19 '22 17:11

BalusC


I used the BalusC solution. Thanks;)

I just want to add if you use facelet, you need to put :

 <f:metadata>

in each page using the template:

mytemplate.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">

<ui:insert name="meta"/>

mypage.xhtml using mytemplate.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

<ui:composition template="mytemplate">

 <ui:define name="meta">
    <f:metadata>
       <f:viewParam name="id" value="#{tInputBean.id}" />
       <f:event type="preRenderView" listener="#{tInputBean.init}" />
     </f:metadata>
  </ui:define>
...

Solution found at : https://forums.oracle.com/forums/thread.jspa?threadID=2145709

like image 38
YoelBen Avatar answered Nov 19 '22 17:11

YoelBen