JSF服务层

Men*_*nno 20 java model-view-controller jsf service-layer

我不确定我在JSF中使用MVC环境的方法是否是最好的方法.由于我想要充分利用JSF,我想知道我的服务层(或模型,用MVC术语说)应该如何"设计".

我知道视图 - 控制器比率应该是1比1(排除例外情况).现在我应该以什么方式设计我的服务层?我应该使用一项大型服务(不这么认为)吗?如果没有,根据我应该分割我的服务?

注意,我的服务将从Beans(控制器以MVC术语)调用,服务本身将在必要时使用JPA调用DAO.

提前致谢

Bal*_*usC 39

应围绕主实体(数据模型)设计服务层(业务模型).例如UserServicefor User,ProductServicefor Product,OrderServicefor Order等.你绝对不应该有一个庞大的服务类.那是极端紧密的耦合.

对于服务层API本身,Java EE 6提供EJB 3.1作为服务层API.在很古老的J2EE时代,很久以前当EJB 2.0开发起来很糟糕时,Spring更常被用作服务层API.有些人现在仍然使用它,但是由于Java EE 6已经包含了从Spring学到的所有好的经验教训,它已经变得多余了.请注意,EJB(和JPA)在诸如Tomcat之类的准系统servlet容器中不可用.您需要在其上安装OpenEJB(或者只升级到TomEE).

无论服务层API选择如何,最好的方法通过完全在服务层执行业务作业,使您的JSF支持bean(操作)侦听器方法尽可能保持流畅.请注意,服务层本身不应具有任何JSF依赖性.因此javax.faces.*,服务层代码中的任何(in)直接导入都表示设计不良.您应该将特定代码行保留在辅助bean中(通常是根据服务调用结果添加faces消息的代码).这样,服务层可以重用于其他前端,例如JAX-RS甚至普通的servlet.

您应该了解Java EE应用程序中服务层的主要优点是容器管理事务的可用性.对@StatelessEJB的一个服务方法调用有效地计为单个数据库事务.因此,如果在使用@PersistenceContext EntityManager服务方法调用调用的任何DAO操作之一中发生异常,则将触发完整的回滚.这样,您最终得到一个干净的DB状态而不是脏DB状态,因为例如第一个DB操作查询成功,但第二个没有.

也可以看看: