2012-09-13 53 views
4

我一直在考虑这个问题,现在还没有想出如何在表示层的JSF项目中组织我的bean/classes的最佳实践。显然有很多因素起作用,但我想讨论一下。这里是我目前的思路:在JSF中支持Bean组织

考虑一个基本的JSF(仍然坚持在JSF 1.xx这里不幸)包含一个视图页面(查看数据)和一个编辑页面(添加,更新,删除数据)。这里是我会组织项目:

请求范围BackingBean:

  • 查看相关的东西(保存状态,绘制逻辑等)。仅在一个请求中需要的东西
  • 动作,动作侦听器和值更改侦听器。如果它们适用于多个视图,则可以将它们分离为它们自己的文件。

会话范围BackingBean:

  • 任何需要将保持在超过一个请求。数据库中的数据,一个SelectItems等
  • 这个bean被注入到请求Bean,任何数据的存储实例对象

数据对象:

  • 它似乎没有任何意义使数据对象变成bean,因此它们被分开存储。这可能是用户,书籍,汽车以及您要在页面上显示的任何对象。所述对象可包含视图助手方法以及如getFormattedName()等

DAO:

  • 非bean对象处理与业务逻辑层的所有交互。它加载数据bean并准备提交等。我通常将其作为一类公共静态方法。

转换器,验证:

  • 单独的文件

这似乎是所有需要在你的平均JSF应用程序。我已阅读了这个:http://java.dzone.com/articles/making-distinctions-between,以及这里的答复:JSF backing bean structure (best practices),但我从来没有觉得我们有一个完整的图片。 BalusC的回应很有帮助,但似乎没有涵盖完整的应用程序。让我知道你的想法!

+1

这不是我是谁回答了这个问题。更重要的是,我个人不同意这个答案。也http://stackoverflow.com/questions/7223055/distinction-between-different-types-of-managed-beans见为了补充这个答案,你可能会发现下面的答案有帮助:http://stackoverflow.com/questions/ 7031885 /如何选择正确的bean范围True,JSF 2.x,但同样的原则适用于JSF 1.x。 – BalusC

+0

第一个链接是我的意思链接。尽管如此,我仍然遇到了一些麻烦。如果我理解正确的,你的模型bean是类似我的数据对象,和你说的控制器/托管bean应该是一个豆,类似我backingbean,虽然我以尽量减少会议的数量把它分解成两个数据。这是否准确? – bhouse

回答

1

我认为你是在正确的轨道上一般,但是我会做一些不同的事情:

  1. 我把你的DAO层,它分成两个单独的层,一个纯DAO层,仅仅负责从各种来源获取数据(例如数据库调用,Web服务调用,文件读取等)。那么我有一个包含快速导入到调用DAO是不针对任何一个JSF视图业务逻辑层以及任何额外的计算,算法或其他通用业务逻辑。

  2. 在MVC模式,你的ManagedBean起着控制器的作用,因此也应是表示逻辑(特定于操纵视图或各种视图组件之间的交互的逻辑)的存储库。它也将您的业务逻辑与事件行为联系起来。

  3. 我不会用公共静态方法为您的业务逻辑或DAO层。这不适用于自动化单元测试,并阻止您的应用程序使用依赖注入框架(如CDI或Spring)。相反,为您的BO和DAO创建一个接口,然后为此创建一个实现类。

  4. 在那个笔记上,使用CDI或Spring之类的依赖注入框架:)它可以让您自动将Business Logic对象或DAO注入ManagedBeans以及您的单元测试。它也允许你交换实现或DAO,而不需要耦合到应用程序其他层的代码。

+0

感谢您的回复!我想我的帖子中可能不太清楚,但我已经把这个项目分成了三层。所以我的文章只是关于表现层。还有一个构建“业务”层的Spring Framework,可以完成数据库调用和类似的事情。我的“DAO”只是一个基本上需要Business Objects并将它们映射到我的表示层数据对象的类。然后在提交回业务层时采用其他方式。 – bhouse

+0

至于点数2:我同意支持bean应该扮演控制器的角色,而这正是我的要求范围的bean会做。它也可以像你说的那样提供视图操作或交互。 – bhouse

+0

那么在JSF中究竟扮演着Model的角色呢? –