我不确定我在 JSF 中使用 MVC 环境的方法是否是最好的方法。因为我试图充分利用 JSF,所以我想知道我的服务层(或模型,用 MVC 术语来说)应该如何“设计”。
我知道视图与控制器的比例应该是 1 比 1(排除例外)。
现在我应该以什么方式设计我的服务层?我应该使用一项大型服务(不这么认为)吗?如果不是,我应该根据什么分割我的服务?
请注意,我的服务将从 Bean(MVC 术语中的控制器)调用,并且服务本身将在必要时使用 JPA 调用 DAO。
提前致谢
服务层(业务模型)应围绕主要实体(数据模型)进行设计。例如。UserService
for User
, ProductService
for Product
, OrderService
for Order
等等。您绝对不应该拥有一个庞大的服务级别左右。这是极其紧密的耦合。
至于服务层 API 本身,Java EE 6 提供 EJB 3.1 作为服务层 API。在黑暗的 J2EE 时代,很久以前,当 EJB 2.0 开发起来很糟糕时,Spring 更多时候被用作服务层 API。如今有些人仍在使用它,但由于 Java EE 6 融入了从 Spring 中学到的所有优秀经验,它已经成为多余 https://blogs.oracle.com/arungupta/entry/why_java_ee_6_is。请注意,EJB(和 JPA)在准系统 servlet 容器(例如 Tomcat)中不可用。您需要在其上安装 OpenEJB(或者只是升级到 TomEE)。
无论服务层 API 选择如何,最好保留 JSF 支持 bean(操作)侦听器方法尽可能光滑完全在服务层中执行业务工作。请注意,服务层应该单独not有任何 JSF 依赖项。因此,任何(in)直接进口javax.faces.*
在服务层代码中表明设计不好。您应该将特定的代码行保留在支持 bean 中(通常是根据服务调用结果添加面孔消息的代码)。这样,服务层就可以被其他前端重用,例如 JAX-RS 甚至普通的 servlet。
您应该了解,Java EE 应用程序中服务层的主要优势是容器管理事务的可用性。一个服务方法调用@Stateless
EJB 实际上算作单个数据库事务。因此,如果在使用任何 DAO 操作之一期间发生异常@PersistenceContext EntityManager
它是由服务方法调用调用的,然后是complete将触发回滚。这样,您最终会得到一个干净的数据库状态,而不是一个脏的数据库状态,因为例如第一个数据库操作查询成功,但第二个没有成功。
也可以看看:
- 为实体创建主从页面、如何链接它们以及选择哪个 bean 范围 https://stackoverflow.com/questions/8459903/creating-a-master-detail-user-interface-for-entities-which-bean-scope-to-choose/
- 什么时候有必要或方便使用 Spring 或 EJB3 或全部一起使用? https://stackoverflow.com/questions/18369356/when-is-it-necessary-or-convenient-to-use-springjsf2-or-ejb3jsf2-or-all-of-the/
- JSF 控制器、服务和 DAO https://stackoverflow.com/questions/30639785/jsf-controller-service-and-dao
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)