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

99封情书 提交于 2019-12-18 12:32:36

问题


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


回答1:


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)




回答2:


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



来源:https://stackoverflow.com/questions/5647679/how-to-execute-action-on-get-request-with-fviewparam

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!