我有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)。
我在这个网站上看到了几个问题。但我真的不知道在这种情况下该怎么做。
答案 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"/>
还有更简洁的方法在页面之间传输数据。