@ViewScoped,f:setPropertyActionListener只能工作一次

时间:2013-10-03 00:34:18

标签: jsf

我有2个managedBeans:第一个(RequestScoped)通过h:commandLink将参数发送到第二个(ViewScoped)。两个managedBeans都在同一个页面中,但我在富图的不同选项卡中使用它们:TabPanel:

@ManagedBean
@RequestScoped
public class TheRequestScopedManagedBean {

   private String number
   ...

@ManagedBean
@ViewScoped
public class TheViewScopedManagedBean {

    private String number;
    ...

这是视图,它使用了一个丰富的:dataTable: (action方法仅用于显示rich:tabPanel中的第二个选项卡。)

// ... another dataTable's columns 
<rich:column>
    <f:facet name="header">Number</f:facet>
    <b>
        <a4j:commandLink value="#{theRequestScopedManagedBean.number}"  
         render="someRichPanel" action="#{anotherBean.showSecondTab}" immediate="true">
             <f:setPropertyActionListener target="#{theViewScopedManagedBean.number}" value="#{theRequestScopedManagedBean.number}" />
        </a4j:commandLink>
   </b>
</rich:column>

这里的问题是,ViewScopedBean仅在第一次显示该值时,当我再次尝试传递它时,它会显示其默认值(null)。

我在这个网站上看到了几个问题。但我真的不知道在这种情况下该怎么做。

1 个答案:

答案 0 :(得分:0)

action="#{anotherBean.showSecondTab}"将导致导航案例触发。这将导致视图和请求范围bean被销毁和重新创建(这是视图范围bean的预期行为)。

如果您正在使用EL2.2,您可以轻松地将值直接传递给视图范围bean中的方法。假设您的viewscoped bean有一个方法takeValue,您可以将参数直接传递给方法,如下所示:

    <a4j:commandLink value="#{theRequestScopedManagedBean.number}" render="someRichPanel" action="#{theViewScopedBean.takeValue(theRequestScopedManagedBean.number)}" immediate="true"/>

还有更简洁的方法在页面之间传输数据。