托管 bean 和支持 bean 之间的区别

Posted

技术标签:

【中文标题】托管 bean 和支持 bean 之间的区别【英文标题】:Difference between managed bean and backing bean 【发布时间】:2011-06-10 10:52:51 【问题描述】:

我在几个论坛中遇到了术语“托管 bean”和“支持 bean”。很多人认为两者是一样的。但是,似乎有细微的差别。谁能帮我理解这两个术语之间的确切区别?

【问题讨论】:

在JSF的掩护下:BackingBean managedBean = new BackingBean() @BalusC:Ed Burn 和 Chris Schalk 谈到了不同之处。见***.com/questions/27423969/… @Shirgill:当前问题与“模型豆”无关。 托管 bean 是支持 bean,但是支持 bean 需要/可能不是“托管”bean。 E:@BalusC 评论太棒了!赞成。 【参考方案1】:

更改我最初的答案 - 两者之间没有有意义的区别。 tutorial 表示支持 bean 稍后被声明为托管 bean。所以,总结一下:

支持 bean 是脱离上下文的类 当一个托管 bean 被声明为与 JSF 托管 bean 工具一起使用时,它就是支持 bean。

我从未真正使用过“backing bean”这个词,因为我发现它没有用处。所以你最好只使用“托管bean”。请注意,在 JSF 2.0(和 CDI 中)你有 @ManagedBean- 所以你的 bean 是一个托管 bean。

BalusC 建议“backing bean”是定义,“managed bean”是实例。虽然这可能是 JSF 创建者的最初想法,但我认为不值得支持它。例如,CDI 和 spring 对于“bean 定义”和“bean 实例”没有不同的术语。

JSF 2.0 规范只提到了“backing bean”这个词几次,没有任何定义。除此之外,它还提到了“backing bean class”,这可能意味着“backing bean”!=“backing bean class”,这带来了进一步的混乱。

所以总结一下 - 对我来说两者都是可以互换的,我会坚持只使用“托管 bean”

【讨论】:

查看 BalusC 的评论。看来您的回答并不完全正确:***.com/questions/4749451/… 是的,没有区别,但是将 ManagedBean 称为 BackingBean 的原因是因为它“备份”表单,而不是使用 String,int,Boolean,我们使用 UIInput,UIOutput,它提供了更多的控制权表单元素。 BackingBean 与 Forms 一起使用,就是这样。 支持 bean 支持 facelets 页面。当您将其称为托管 bean 时,您会想到它是由工件管理的,但该概念在业务逻辑中没有意义。【参考方案2】:

什么是托管 Bean?

由 JSF 实现管理的 JavaBean 对象称为托管 bean。 托管 bean 描述了如何创建和管理 bean。 它与 bean 的功能无关。

什么是Backing Bean?

Backing bean 是与页面中使用的 UI 组件相关联的 JavaBeans 组件。 支持 bean 管理将 UI 组件对象的定义与执行特定于应用程序的处理和保存数据的对象分开。 支持 bean 定义与页面上使用的 UI 组件相关的属性和处理逻辑。 每个 backing-bean 属性都绑定到组件实例或其值。 支持 bean 还定义了一组执行组件功能的方法,例如验证组件的数据、处理组件触发的事件以及在组件激活时执行与导航相关的处理。

Backing Bean 和 Managed Bean 有什么区别?

Backing Beans 只是一种约定,是 JSF Managed Beans 的一个子类型,具有非常特殊的用途。 Backing Bean 没有什么特别之处,除了它的用途之外,它与任何其他托管 bean 都不同。

MB:托管 Bean; BB : 支持豆

1) BB:支持 bean 是被表单引用的任何 bean。

MB:托管 bean 是已向 JSF 注册的支持 bean(在 faces-config.xml 中),并在需要时由 JSF 自动创建(并可选择初始化)。

托管 bean 的优点是 JSF 框架会自动创建这些 bean,可选择使用您在 faces-config.xml 中指定的参数初始化它们。

2) BB:Backing Beans 应该只定义在请求范围

MB:由 JSF 创建的托管 bean 可以存储在请求、会话或应用程序范围内

应在请求范围内定义支持 Bean,与特定页面以一对一的关系存在,并保存所有页面特定的事件处理代码。 在实际场景中,多个页面可能需要在幕后共享同一个支持 bean。 支持 bean 不仅包含视图数据,还包含与该数据相关的行为。

【讨论】:

【参考方案3】:

Backing Bean 是与 JSF UI 绑定的任何 bean。而托管 bean 是任何 bean

【讨论】:

什么意思,托管 bean 是什么 bean?就像具有某种状态但不受任何 JSF 视图限制的平均值? (如 .xhtml )?【参考方案4】:

简单地说,

作为开发者的你:

@ManagedBean(name="managedBean")
@RequestScoped
public class BackingBean 
    // ...

JSF 作为 bean 管理框架在幕后工作:

BackingBean managedBean = new BackingBean();
externalContext.getRequestMap().put("managedBean", managedBean);

因此,支持 bean 是您开发的具体类,通常与视图相关联,托管 bean 是具体实例,它在 bean 管理框架创建并放置在所需范围内按需提供,并由 EL 中的#managedBean 提供。您永远不需要自己创建并将其放入范围内。如果你这样做了,那么就没有框架管理的 bean。

CDI @Named 和 Spring @Component 与 JSF @ManagedBean 做的事情基本相同。

要详细了解 JSF、CDI 和 Spring 等 bean 管理框架如何查找和创建托管 bean,以下故障排除程序应提供深入见解:Identifying and solving javax.el.PropertyNotFoundException: Target Unreachable。

另见:

What components are MVC in JSF MVC framework? JSF Controller, Service and DAO JSF managed bean naming conventions

【讨论】:

【参考方案5】:

http://docs.oracle.com/javaee/5/tutorial/doc/bnaqm.html 说

典型的 JavaServer Faces 应用程序包括一个或多个支持 bean,每个支持 bean 都是与特定页面中使用的 UI 组件相关联的 JavaServer Faces 托管 bean。托管 bean 是 JavaBean 组件(请参阅 JavaBeans 组件),您可以使用托管 bean 工具对其进行配置,这在配置 Bean 中进行了描述。本节介绍在应用程序中创建、配置和使用支持 bean 的基本概念。

http://docs.oracle.com/javaee/6/tutorial/doc/bnaqm.html 没有提到“backing bean”。

【讨论】:

【参考方案6】:

Managed Beans由容器管理(实例化和销毁)。

Backing Beans 是将视图作为数据模型支持的托管 bean。

【讨论】:

请写下投反对票的原因。 您在哪里阅读了这些定义?特别是第二个。 最佳答案!说到点子上了。支持 bean 是支持 JSF 的 MVC 模式的托管 bean。它们用作 (M) 模型部分。【参考方案7】:

我会说支持 bean 是严格用于 UI 目的的 bean,即在 jsp 文件中引用。毕竟,由 JSF 容器管理的所有 bean 都是托管 bean,但是它们可能会在不同的上下文中使用。有关更多信息,请参阅此处接受的答案:JSF : ManagedBean, Good place to deal with Business Logic?

【讨论】:

【参考方案8】:

Backing Bean 是一种托管 Bean。 Managed Bean 是一个 Object (即 Class 的实例),由容器创建(这就是它被称为 managed 的​​原因),当然 Object 有一个 Class ,如果你喜欢它,你可以创建该类的尽可能多的实例不管他们用 m = new MyManagedBean() 有什么注释,它只是一个 Not-So-Managed-Bean 或者至少不是由容器管理而是由你管理:)

支持 bean 是一种托管 bean(正如 Santosh 所说:一种约定),它通常使用 JSF requestScope(但在 ADF 等某些框架中,甚至有一个指定范围仅用于支持 bean,称为 backingBeanScope - 你会从来没有猜到)。

是的... jsf 托管 bean 的风格称为 BackingBeans 用于绑定 UIComponent 和编写 ActionListener,而假设“模型 bean”风格将进入会话范围并保存您的数据

【讨论】:

答案因不同原因而被否决。我认为 Santos 的回答被否决了,因为他只是从另一个网页复制并粘贴了文本,而没有注明原始作者或页面(可以在此处找到相同的文本:developersbook.com/jsf/interview-questions/…))。由于所讨论的术语没有官方定义,因此没有人应该坚持认为他的观点是唯一的真理。 *** 社区在推广最佳答案方面具有良好的意识。【参考方案9】:

我参加了关于 JSF 的非常好的(昂贵的)课程。我在那里学到的只是http://www.avromroyfaderman.com/2008/07/from-backing-bean-to-managed-bean/ 中解释的内容。

也许这种差异不是理论上的差异或术语的词源,但它肯定是设置架构的一种非常实用的方法,特别是如果您是一个有多个开发人员的大型项目的一部分和/或需要维护很多代码很久了。基本上,这个想法是将 UI 业务逻辑放在托管 Bean 中。支持 bean 是稀疏的,只支持页面本身。

【讨论】:

【参考方案10】:

从此链接JSF - Managed Beans

托管 Bean:

Managed Bean 是向 JSF 注册的常规 Java Bean 类。也就是说,Managed Beans 是一个由 JSF 框架管理的 java bean。

从此链接Creating and Using a Backing Bean for a Web Page :

支持 Bean:

在 JSF 中,支持 bean 是 JavaBean,主要用于提供 UI 逻辑和管理 Web 层和应用程序的业务层之间的数据(类似于数据传输对象)。通常每个 JSF 页面都有一个支持 bean。支持 bean 包含页面上使用的 UI 组件的逻辑和属性。

注意:

为了在应用程序启动时可用的支持 bean,您 将其注册为具有名称和范围的托管 bean

【讨论】:

@BalusC 我添加了我得到答案的来源和参考资料【参考方案11】:

托管 Bean:

托管 bean 是已向 JSF(在 faces-config.xml 中)或使用注解注册的支持 bean。托管 Bean 在需要时由 JSF 自动创建(并且可以选择初始化)。

如果您在应用程序中使用托管 Bean,则必须在 JSF 页面中使用以下语法来设置或获取来自 bean 的值

<h:inputText value="#user.name"/>

支持 Bean:

包含 Web 表单的部分或全部组件对象的 bean。这样的 bean 称为 web 表单的支持 bean。

当你使用 backing bean 时,你需要将组件连接起来 形成豆子上的那些。您为此目的使用绑定属性

例子:

<h:inputText binding="#myForm.myComponent" .../>

观察我们如何获取或设置 Backing bean 的值。

Backing Beans 应该在请求范围内定义,与特定页面以一对一的关系存在并保存所有页面特定的事件处理代码

希望它对某人有用。

【讨论】:

以上是关于托管 bean 和支持 bean 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

使用 CDI(上下文和依赖注入)支持 bean 而不是托管 Bean

托管 bean 中的 View 和 Request 范围之间的区别

使用 URL 参数的 JSF 托管 Bean 方法调用

spring boot: 一般注入说明 @Component, application event事件为Bean与Bean之间通信提供了支持

共享处理程序和支持 bean

GlassFish 域中的 JSF 托管 Bean 唯一性