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

ber*_*tie 8 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>
Run Code Online (Sandbox Code Playgroud)

在目标页面(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>
....
Run Code Online (Sandbox Code Playgroud)

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

  1. 执行@PostConstruct方法
  2. 使用从viewParam捕获的id更新模型(在appy请求+验证之后)

我想要实现的是: 在更新模型之后,我想对该记录id执行查询,获取它的bean以及它来自Business Service的详细信息列表.

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

  1. @PostConstruct方法内部是不可能的,因为在@PostConstruct方法完成,从viewParam捕获的id被设置为模型
  2. 在模型更新后使用阶段监听器?
  3. 使用系统事件?虽然我似乎无法找到适合这种情况的人

请赐教:)

Bal*_*usC 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>
Run Code Online (Sandbox Code Playgroud)

用一个

public void init(ComponentSystemEvent event) throws AbortProcessingException {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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