我已经考虑了一段时间了,并且还没有提出如何在表示层的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 's response was helpful, but didn'似乎完全涵盖了一个完整的应用程序 . 让我知道你的想法!
1 回答
我认为你一般都在正确的轨道上,但是我会做一些不同的事情:
我会把你的DAO层分成两个单独的层,一个纯DAO层只负责从各种来源获取数据(例如数据库调用,Web服务调用,文件读取等等) . 然后,我将拥有一个业务逻辑层,其中包含对DAO调用的直通以及任何其他计算,算法或其他一般业务逻辑,这些逻辑并非特定于任何一个JSF视图 .
在MVC模式中,ManagedBean扮演Controller的角色,因此也应该是Presentation Logic的存储库(特定于操作视图或在各种View组件之间交互的逻辑) . 它还会将您的业务逻辑与事件行为联系起来 .
我不会对您的业务逻辑或DAO层使用公共静态方法 . 这不适合自动化单元测试,并阻止您的应用程序使用CDI或Spring等依赖注入框架 . 而是为您的BO和DAO创建一个接口,然后为此创建一个实现类 .
在这方面,使用像CDI或Spring这样的依赖注入框架:)它将允许您自动将业务逻辑对象或DAO注入ManagedBeans以及单元测试 . 它还允许您交换实现或DAO,而无需与应用程序的其他层中的代码耦合 .