应用请求值和更新模型值之间的区别

9
我经常对这两个阶段有疑虑。以下是我的理解:
1. 应用请求值 - 在这个阶段,提交的值来自于请求参数。然后将这些请求值设置到后台bean中,即设置为组件UIInput。
2. 更新模型值 - 在这个阶段,处理后的值从后台bean(UIInput)传递到托管bean中(这是我们自定义的JSF bean)。
我认为我的理解是正确的。但是,读了一些文章让我感到困惑。我希望您能更清楚地解释这两个阶段。
1个回答

19

应用请求值

  • 在这个阶段,提交的值来自请求参数。然后将请求值设置到后备Bean中,即设置为组件UIInput。

这不是完全正确的。值并没有被设置到后备Bean中,而是被设置到组件中。基本上,对于组件树中的每个UIInput组件,以下操作会发生:

input.setSubmittedValue(request.getParameter(input.getClientId()));

这里的inputUIInput,而requestHttpServletRequest


更新模型值

  • 在此阶段,处理过的值从后备bean(UIInput)传输到托管bean中(这是我们自定义的JSF bean)。

也不完全正确。 UIInput组件不是后备bean。基本上,对于组件树中的每个UIInput组件都会发生以下情况:

bean.setProperty(input.getValue());

在这里,bean和property是基于输入的valuebinding而定义的,例如value="#{bean.property}"


总之,你的困惑显然在于区分JSF组件树、JSF后备bean和JSF管理bean。JSF组件树是你在JSP/Facelets页面中定义的那个,并且你可以通过FacesContext#getViewRoot()获取它。JSF后备bean是JavaBean类,其属性使用EL绑定到组件树上,例如#{bean.property}。JSF管理bean是那些JavaBean类的具体实例。它们可以是请求、会话或应用程序范围的(在JSF 2.0中也可以是视图范围的)。实际设置和检索值的地方是管理bean。

另请参阅


等待答案。如果我所说的正确,那么我对这两个阶段很清楚了。 - Krishna
1
不,那不正确。该属性不一定需要是 UIComponent。更重要的是,这根本不是必需的(即使链接的 Debug JSF lifecycle 文章解释了这些 UIComponent 绑定仅用于纯演示目的,并且在现实世界中,您只应在想要执行更多操作而不仅仅是获取/设置值时使用它们)。我个人不同意 Bozho 的答案,它确实具有误导性。Backing Bean 和 Managed Bean 之间的区别在于以下单行代码最好概括:BackingBean managedBean = new BackingBean(); - BalusC
@KRishna @BalusC 感谢讨论。我已经更改了我的答案,但我不完全同意@BalusC的观点。类定义本身也是托管bean - 否则他们会称注释为@BackingBean。如果您没有通过托管bean设施实例化它,则后备bean将不会支持任何内容。实际上,上面的一行可能是JSF创建者所想的,但这是误导性的。例如,Spring和CDI没有两个术语用于bean声明和bean实例。 - Bozho
1
@Krishna:它们看起来确实是一样的。Backing Bean 是绑定到 JSF 视图(即支持视图)的 Bean 的(抽象)类定义。在 classpath 中只有一个。Managed Bean 是由 JSF 创建和放置在范围内的具体实例(即由 JSF 管理)。可以有多个实例。 - BalusC
2
@Krishna:好的,以你的看法,现在更有意义的是什么?顺便说一句,@Bozho在某个地方提出了一个公正的观点。只需始终称它们为"Managed Beans"即可。这是完全有效的。 - BalusC
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接