什么是托管bean以及每页应该使用多少?

时间:2013-12-06 17:08:30

标签: jsf architecture managed-bean

我正在使用JavaServer Faces开发Web应用程序。

我已经找到了很多关于如何使用JavaServer Faces的示例和教程,但它们都没有实际解释Bean的用途。我最初的想法是,豆类代表形式。您在表单中输入数据并单击提交按钮,关联的Bean将填充数据并调用方法。

但是,到目前为止,我只看到每个页面有一个Bean的示例,因此Bean也可以表示页面,因此包含多个表单。

我也对Bean的范围感到困惑。如果Bean表示表单或页面,则在请求结束后它将变为无效。如果你让bean活在会话范围内,那么Bean会发生什么?您是否仍然可以以某种方式从中获取数据,或者只是在您返回之后只为您填写相关表单?

总结一下 - 什么是Managed Bean以及如何正确使用它?

1 个答案:

答案 0 :(得分:12)

当您永远不需要像手动执行someScopedMap.put("bean", new Bean());那样自己管理bean实例时,bean是一个托管bean。框架负责这一点。这与页面是否包含表单无关。您基本上是在告诉框架“嘿,这是一个支持bean类com.example.Foo。您可以将它用作名为”foo“的托管bean,并在EL表达式通过{{1}引用它时将其放在范围X中“,而不需要自己做所有这些。框架(JSF,CDI,Spring等)自行管理它。

关于选择正确的范围,逻辑上取决于数据需要保留的范围。例如,您显然不希望将提交的表单数据存储在应用程序范围内。否则,该网站的任何其他访问者都会看到它。只需逻辑思考并阅读How to choose the right bean scope?

对于“每个表单一个bean”或“每页一个bean”的概念,这实际上是主观的,因为两者在技术上都可以同样有效,但是对于可维护性,强烈建议尽可能使您的类更加光滑,包括支持豆子。因此,“每种形式的一个豆”是更好的做法。不要在一个班级中将完全不同的职责放在一起。 Law of demeter等。 Bean可以使用#{foo}@Inject轻松访问彼此。

另见: