如何使用f:viewParam对GET请求执行操作?

时间:2011-04-13 10:27:28

标签: jsf jsf-2

我正在尝试将记录的ID从一个页面发送到另一个页面。

所以在第1页中,我有类似的东西:

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

并且在目标页面(TInput.xhtml)中,我有类似的东西来捕获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>
....

现在,单击链接,转到第2页,第2页由一个视图范围的jsf bean处理。从我的调试来看,这是发生的顺序:

  1. 执行@PostConstruct方法
  2. 使用从viewParam捕获的id更新模型(在appy请求+验证之后)
  3. 我想要达到的目标是: 模型更新后,我想执行该记录ID的查询,获取它的bean以及它的业务服务详细信息列表。

    我想知道我应该在哪里放置查询代码:

    1. 在@PostConstruct方法中是不可能的,因为从@PaostConstruct方法完成后,从viewParam捕获的id被设置为模型
    2. 在模型更新后使用阶段监听器吗?
    3. 使用系统事件?虽然我似乎无法找到合适的案例
    4. 请赐教:)

2 个答案:

答案 0 :(得分:8)

<f:event type="preRenderView">添加<f:metadata>

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

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

(顺便说一下,与文档相反,参数和异常是可选的,至少在我使用的所有Mojarra 2.x版本中都是如此)

答案 1 :(得分:4)

我使用了BalusC解决方案。感谢;)

我只想添加如果你使用facelet,你需要把:

 <f:metadata>
使用模板在每个页面中

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使用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>
...

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

找到解决方案