简体   繁体   中英

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

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

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)

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM