Java JSF服务层
我不确定我在JSF中使用MVC环境的方法是否是最好的方法。由于我试图充分利用JSF,我想知道我的服务层(或模型,用MVC术语来说)应该如何“设计” 我知道视图控制器的比例应该是1:1(排除了例外情况)。 现在,我应该以什么方式设计我的服务层?我应该使用一个大服务吗(我不这么认为)?如果没有,我应该根据什么划分我的服务 注意,我的服务将从bean(MVC术语中的控制器)调用,并且服务本身将在必要时使用JPA调用DAO 提前感谢服务层(业务模型)应该围绕主实体(数据模型)进行设计。例如,Java JSF服务层,java,model-view-controller,jsf,service-layer,Java,Model View Controller,Jsf,Service Layer,我不确定我在JSF中使用MVC环境的方法是否是最好的方法。由于我试图充分利用JSF,我想知道我的服务层(或模型,用MVC术语来说)应该如何“设计” 我知道视图控制器的比例应该是1:1(排除了例外情况)。 现在,我应该以什么方式设计我的服务层?我应该使用一个大服务吗(我不这么认为)?如果没有,我应该根据什么划分我的服务 注意,我的服务将从bean(MVC术语中的控制器)调用,并且服务本身将在必要时使用JPA调用DAO 提前感谢服务层(业务模型)应该围绕主实体(数据模型)进行设计。例如,UserSe
UserService
用于User
,ProductService
用于Product
,OrderService
用于Order
,等等。你绝对不应该有一个庞大的服务类别。这是非常紧密的耦合
至于服务层API本身,JavaEE6提供EJB3.1作为服务层API。在黑暗的J2EE时代,很久以前,EJB2.0的开发非常糟糕,Spring更多地被用作服务层API。现在仍有一些人在使用它,但由于JavaEE6吸收了从Spring中学到的所有好的经验教训,它已经变得非常有用了。请注意,EJB(和JPA)在诸如Tomcat之类的基本servletcontainers中不可用。例如,您需要在其上安装OpenEJB(或者升级到TomEE)
不管服务层API的选择如何,最好的方法是通过完全在服务层执行业务作业来保持JSF支持bean(action)侦听器方法尽可能流畅。请注意,服务层本身不应该有任何JSF依赖项。因此,在服务层代码中直接导入javax.faces.*
表示设计不好。您应该在backingbean中保留特定的代码行(通常是根据服务调用结果添加faces消息的代码)。通过这种方式,服务层可重用于其他前端,例如JAX-RS甚至普通servlet
您应该了解,JavaEE应用程序中服务层的主要优势是容器管理事务的可用性。
@无状态
EJB上的一个服务方法调用有效地算作单个DB事务。因此,如果在使用由服务方法调用的@PersistenceContext EntityManager
的任何DAO操作期间发生异常,则将触发完全回滚。这样,您将得到一个干净的DB状态,而不是脏DB状态,因为例如,第一个DB操作查询成功了,但第二个没有成功
另见:
您可能没有太多的服务和控制器,但也不会太少,因为这样它们就会有太多的逻辑和字段。你必须达成妥协。所以。。如果将服务与DAO(以及实体)进行比较,服务的比率将为1:1?剩下的解释是100%清楚的,我的服务的目的已经确定了(所以业务逻辑,没有JPA逻辑,没有JSF逻辑)。我还需要进一步研究正确的范围等等。再次感谢:)不完全是1:1。您可以在一个服务类中注入多个DAO。取决于实体本身是否有任何子实体。@BalusC将一个hibernate类声明为JSFbean是否常见?例如,我有一个公司视图(它有属性名称、地址、联系人等)。我有一个问题,因为除了所有的公司财产,我还有一个清单。它给了我一个错误,因为它是一个hibernate类,所以它试图找到一个类型为List的列,但该列不存在。我可以通过使问题暂时化来解决它。但是这是一个好的实践吗?@Erick:查看“另请参阅”链接,了解在支持bean类中正确使用实体类和服务类的具体示例。您应该了解Java EE应用程序中服务层的主要优势是容器管理事务的可用性。我喜欢这个