使用<f:param> <f:viewparam> </f:viewparam> </f:param>时配置bean

时间:2012-11-21 14:41:45

标签: jsf-2 scope javabeans

我正在尝试将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>

问题是传递的String为null,显然,我从转换器中得到一个错误。

我想我在托管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并将其转换为String(反之亦然)。 所以,我想知道在JSF中是先调用actionListener还是设置参数的函数。

这可能是我获得null String的原因吗?非常感谢。

1 个答案:

答案 0 :(得分: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> doesn't完全支持converter属性。您必须直接访问所需的属性(在上例中为id)。