2009-12-19 22 views
0

我对“请求”类型的ManagedBeans的生命周期有些困惑。通过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> 

当我按下Edit按钮时,创建了一个userEditBean,但属性映射将“user”解析为null。

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

回答

1

您正在使用表达式设置属性值,而不是静态值。无论何时您请求该值,该表达式都将被重新评估。 userBean.user显然不存在于随后的请求中。您需要确保它的存在(换句话说,该userBean的构造应确保user被创建和设置。

但是也有替代品。其中最好的是使用Tomahawk<t:saveState>为。在页面某处添加:

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

这么说,我与Bozho同意,整个方法是有点奇怪,但这是另外一个故事你可以但是得到很多有用的想法了以下任一操作。文章:Communication in JSF和/或Using Datatables。祝你好运

+0

必须传入传入数据的奇怪之处是什么? – Stroboskop 2009-12-19 19:58:13

+0

什么也没有,但只是当你使用标准的JSF组件时,你需要做更多的工作,因为你试图将整个Java对象传递给后续请求,而HTTP/HTML只需要和产品字符串。但我明白你想要什么,'t:saveState'就是你需要的。在'UserEditBean'中只需访问'UserBean'(托管属性注入?)以获取其'用户'属性。 – BalusC 2009-12-19 20:38:01

+0

看起来像t:saveState做我想要的。而另一个罐子,我需要包括... – Stroboskop 2009-12-19 20:52:55

0

request范围意味着bean在一次请求期间生活。然后填写编辑页面(第一个请求),并发送编辑的用户(第二个请求)。

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

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

+0

是的,但button.getAttributes()似乎只包含一个EL表达式。当我尝试解决它(调用userEditBean.init)时,它解析为null。我该怎么做? – Stroboskop 2009-12-19 18:34:08