1

我试图在一个 JSF 页面之间传递一个参数,从一个 bean 到另一个。我知道这是一个常见的问题,事实上我在写下来之前已经尝试了几种方法。为此,我将两个 bean 都放在了会话范围内,并在第一个 bean 中添加了以下内容:

<p:commandButton value="Submit" type="submit"
    actionListener="#{sourceBean.save}" action="success">

    <f:setPropertyActionListener
            target="#{targetBean.foo}" value="#{sourceBean.foo}" />
</p:commandButton>

问题是我不希望这些 bean 在会话范围内,而是在视图范围内。所以我试着把我的第一页:

<p:commandButton value="Submit" type="submit"
    actionListener="#{sourceBean.save}" action="success">
    <f:param name="foo" value="#{sourceBean.foo}"/>                     
</p:commandButton>

在第二页:

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

问题是传递的字符串是空的,所以很明显,我从转换器中得到一个错误。

我想我在托管 bean 的配置中遗漏了一些东西。我是否必须以某种方式链接目标和源 bean?此刻我有这样的配置:

    <managed-bean>
    <managed-bean-name>targetBean</managed-bean-name>
    <managed-bean-class>guiBeans.TargetBean</managed-bean-class>
    <managed-bean-scope>view</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>sourceBean</managed-bean-name>
    <managed-bean-class>guiBeans.SourceBean</managed-bean-class>
    <managed-bean-scope>view</managed-bean-scope>
</managed-bean>

另一个问题:在我的应用程序中,我在转换期间使用的值 foo.id 在我保存对象时由数据库自动设置,因此当我调用时:

actionListener="#{sourceBean.save}"

转换器获取 id 并将其转换为字符串(如果需要,反之亦然)。所以,我想知道在 JSF 中是首先调用 actionListener 还是设置参数的函数。

这可能是我得到空字符串的原因吗?非常感谢。

4

1 回答 1

1

<f:param>是在呈现表单期间评估的,而不是在提交表单期间。您的问题表明该#{sourceBean.foo}值仅在提交表单期间设置,因此在表单呈现期间不可用。

基本上需要替换action="success"action="#{bean.action}"

public String action() {
    return "success?foo=" + foo.getId();
}

或者,如果您使用的是导航箱

<navigation-case>
    <from-outcome>success</from-outcome>
    <to-view-id>/some.xhtml</to-view-id>
    <redirect>
        <view-param>
            <name>foo</name>
            <value>#{sourceBean.foo.id}</value>
        </view-param>
    </redirect>
</navigation-case>

与具体问题无关,<f:param> 根本不支持该converter属性。您必须直接访问所需的属性(id在上面的示例中)。

于 2012-11-21T15:01:58.553 回答