题
由于我学习JSF2,我意识到我不知道后盾成分应该是什么。从设计的角度来看,是什么EJB和@ManagedBeans
之间的差异?
在我将要使用JPA结束,所以EJB是业务层的自然选择。它是使用EJB直接从JSF一个很好的做法(如这里解释 )?
目前我倾向于使用@ManagedBeans
对于不需要访问业务层(例如视图助手)或处理请求/会话数据的组件。用于其它目的,例如在网格中列出的东西,我会直接访问EJB。
这是一个好的设计?我将使用@ManagedBeans
所有支持bean清洁层分离的缘故,即使在某些情况下,它们仅委托给EJB?
解决方案
非常有效的问题,但是我想答案取决于你项目的集成方式的“严”。有确实有点JSF支持bean和EJB之间的冗余既实现一些业务逻辑。
在一个理想与converters
,rendered
,validator
等辅助bean JSF功能的使用的能确实是干净的业务逻辑代码。但在实践中的一些演示相关的逻辑经常漏洞了。
此呈现相关的逻辑应理想地不处于EJB。本演示相关的逻辑可能取决于脸包,但没有必要的。这就是它的不的,使得它呈现相关或不。
一个统一的组件模型具有一定的优势,但。而且它是由缝和的弹簧。在这两种情况下,声明式事务等业务组件可以直接在JSF(Spring不使用EJB,但提供了一个类似的模型)使用。但是EJB纯粹会说,你应该分离两种。
所以对我来说这是最终的项目的口味和大小的问题。我可以想像,使用EJB在JSF工作正常一款小型/中型项目。对于更大的项目中,这种严格是至关重要的,要确保你不要拧层。
其他提示
在Java EE 6的存在的各种管理豆之间有一些重叠:JSF管理豆(@ManagedBean),CDI管理豆(@Named)和EJB豆(@Stateless,@Statefull,@Singleton)
。在视图层我看不出有任何特别的优点与@ManagedBean粘连。该变种CDI @命名似乎是能够做同样多的,例如为你提供进入转换范围。
在目前的想法似乎是,最终的EJB组件模型也将被改装为一组CDI注释。特别是专家组成员礼萨·拉赫曼经常暗示了这一点。例如见依赖注入Java EE 6中 - 第1部分
有关被这并没有发生时间,所以EJB豆类保持的最简单的地方,把业务逻辑,特别是当JPA用于持久性。
不过,CDI是否会获得EJB的能力,恕我直言,它仍然使用了“釜底抽薪豆”的概念一个单独的bean,并为“商业逻辑”一个单独的bean的最佳实践。
背衬豆可真纤薄,只是含有一些参考对象和服务(EJB)的建模。支持bean的操作方法几乎可以直接委托给服务,但其附加值是在向用户提供反馈(加时成功或失败FacesMessages)和做小UI修改(例如,设置一个布尔值false时显示一些对话框)
在服务(业务逻辑)不应该知道任何特定呈现任何内容。他们应该是同样来自JSF支持bean,JAX-RS,Servlet的,独立的Java SE远程客户端或任何使用。
即使所有的豆类将成为CDI豆,那么这并没有改变这种责任的基本划分。
有趣的文章,没有早知道是这样。然而,对我这篇文章的气味更像是对JSF夸夸其谈管理的Bean。它还紧夫妇EJB与JSF。这是小(个人)的应用在现实世界中的SOA应用程序也许有趣,但可能不是你想要完全控制EJB的被服务。
至于使用什么哪一个,我只想坚持以@ManagedBean
表示,可呈现绑定到一个或多个特定JSF视图的JSF模型。您可以完全使用非JSF具体的业务逻辑和/或datamodels @EJB
s。您可以在JSF模型注入@EJB
s并委托其在操作方法,也许还getter / setter方法,但是你不应该做的另一种方式圆,即没有定义在@EJB
JSF的模型,这导致了紧耦合和将使@EJB
s unuseable JSF上下文之外。至于,你的设计听起来不错,只要你看在javax.faces
类不导入从@EJB
包东西。
从你的XHTML调用EJB,您将引入实施视图和业务层的选择之间的紧耦合。
如果您使用托管bean来调用EJB,[甚至,放在业务委派],你就可以彻底改变你的业务层到春天,而不会影响视图层(XHTML)。
时,在技术上是可行的,而且很容易让你(JSR 299)能够使用EJB作为托管bean,而这可能是这些厂商要你做什么 - 让紧盯细节。但无论是做正确的事吗? - 不