【问题标题】:Configuration of the beans when using <f:param> <f:viewParam>使用 <f:param> <f:viewParam> 时的 bean 配置
【发布时间】:2012-11-09 20:19:00
【问题描述】:

我试图在一个 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还是设置参数的函数。

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

【问题讨论】:

    标签: jsf-2 scope javabeans


    【解决方案1】:

    &lt;f:param&gt; 是在呈现表单期间评估的,而不是在提交表单期间。您的问题表明 #{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>
    

    与具体问题无关&lt;f:param&gt; doesn't 完全支持 converter 属性。您必须直接访问所需的属性(在上面的示例中为 id)。

    【讨论】:

    • 你太棒了!!我只更新了我的导航规则,它起作用了!
    • 对于转换器,我对支持转换器的 感到困惑。我更新了问题以避免混淆。
    猜你喜欢
    • 2012-07-01
    • 2014-04-06
    • 2013-10-27
    • 2013-12-18
    • 1970-01-01
    • 2017-03-17
    • 2012-01-23
    • 2011-07-31
    • 2012-07-31
    相关资源
    最近更新 更多