我对“请求”类型的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?
答案 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
设置为将执行编辑操作的方法,并使该方法返回所需的导航规则。