从JSF中的请求ManagedBeans传递数据

时间:2009-12-19 18:22:52

标签: java jsf

我对“请求”类型的ManagedBeans的生命周期感到有些困惑。

在这个示例中,我使用一个请求bean“userBean”来填充此页面,使用一个请求bean“userEditBean”来填充以下编辑页面。

<h:form>
    <h:panelGrid border="1" columns="2">

        <h:outputText value="Name" />
        <h:outputText value="#{userBean.user.name}" />
        ...
    </h:panelGrid>

    <h:commandButton value="Edit" action="edit" actionListener="#{userEditBean.init}">
        <f:attribute name="user" value="#{userBean.user}"/>
    </h:commandButton>
</h:form>

当我按下编辑按钮时,会创建userEditBean,但属性映射会将“user”解析为null。

这是否意味着在userBean被销毁之后解析属性EL?如何将传入bean中的值传递给传出bean?

2 个答案:

答案 0 :(得分:1)

您使用表达式设置属性值,而不是静态值。每当您请求该值时,将再次重新评估表达式。 userBean.user显然不在后续请求中。您需要确保它在那里(换句话说,userBean的构造函数应确保已创建并设置user

但是有其他选择。其中最好的方法是使用Tomahawk<t:saveState>。将其添加到页面中的某个位置:

<t:saveState value="#{userBean.user}" />

那就是说,我同意Bozho认为整个方法有点奇怪,但这是另一个故事。但是,您可以从以下任一文章中获得许多有用的想法:Communication in JSF和/或Using Datatables。祝你好运。

答案 1 :(得分:0)

request范围表示bean在一个请求期间存在。然后填写编辑页面(第一个请求),并发送编辑后的用户(第二个请求)。

除此之外,<f:attribute>设置父组件中的属性,而不是request中的属性。因此,在您的代码中,属性将在button.getAttributes()中找到(如果您已绑定按钮)。

此外,有一个名为actionListener的{​​{1}}方法很奇怪。由于您不需要该事件,因此可以将init设置为将执行编辑操作的方法,并使该方法返回所需的导航规则。