当前位置: 首页 > 面试题库 >

JavaJSF服务层

景鹏云
2023-03-14
问题内容

我不确定在JSF中使用MVC环境的方法是否是最佳方法。由于我想充分利用JSF,因此我想知道应该如何“设计”我的服务层(或模型,用MVC术语来讲)。

我知道View-Controller的比例应该是1到1(排除的例外)。现在应该以哪种方式设计服务层?我应该使用一项大型服务(不这样认为)吗?如果没有,我应该基于什么拆分服务?

请注意,我的服务将从Bean(MVC术语为控制器)中调用,并且服务本身将在必要时使用JPA调用DAO。

提前致谢


问题答案:

服务层(业务模型)应围绕主要实体(数据模型)进行设计。例如,UserService对于User,ProductService对于Product,OrderService对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.*,服务层代码中的任何(间接)导入都表明设计不良。你应该将特定的代码行保留在备用bean中(通常是根据服务调用结果添加面部消息的代码)。这样,服务层可用于其他前端,例如JAX-RS甚至普通的servlet。

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



 类似资料:
  • 在 Serenity 中,服务终结点是 ASP.NET MVC 控制器的一个子类。 这是 Northwind 的 OrderEndpoint 摘录: namespace Serene.Northwind.Endpoints { [RoutePrefix("Services/Northwind/Order"), Route("{action}")] [ConnectionKey("N

  • 服务发现服务[架构概述]。 { "cluster": "{...}", "refresh_delay_ms": "{...}" } cluster (required, object) 承载服务发现服务的上游群集的标准定义。该群集必须实现和运行SDS HTTP API的REST服务。 refresh_delay_ms (required, integer) 每次访问SDS群集的API延迟

  • 服务器端提供了比较多的关于推送的 API,包括广播,多播和单播方式的推送,还有超时,心跳,推送事件等设置。 Timeout 字段 该字段用于设置推送空闲超时。默认值为 120 秒,即 2 分钟。 当服务器发布了推送主题后(后面会专门介绍推送),客户端会跟服务器端保持一个长连接,如果达到超时时间,仍然没有任何消息推送给客户端,则返回 nil,此时,如果客户端仍然在线的话,则会立即再次发送获取推送主题

  • 主要内容:1.RPC 架构,2.同步调用与异步调用,3.流行的 RPC 框架,4.HTTP 服务,5.总结1.RPC 架构 2.同步异步调用 3.流行的 RPC 框架 1.RPC 架构 先说说 RPC 服务的基本架构吧。我们可以很清楚地看到,一个完整的 RPC 架构里面包含了四个核心的组件。 Client Server Client Stub Server Stub(这个Stub大家可以理解为存根) 客户端(Client),服务的调用方。 服务端(Server),真正的服务提供者。 客户端存根,

  • 主要内容:1.RPC 架构,2.同步调用与异步调用,3.流行的 RPC 框架,4.HTTP 服务,5.总结1.RPC 架构 先说说 RPC 服务的基本架构吧。我们可以很清楚地看到,一个完整的 RPC 架构里面包含了四个核心的组件。 Client Server Client Stub Server Stub(这个Stub大家可以理解为存根) 客户端(Client),服务的调用方。 服务端(Server),真正的服务提供者。 客户端存根,存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后

  • 答案可能涵盖所有框架,但我对SpringMVC案例特别感兴趣。我正在重构一个访问内部数据库和远程服务的服务层。这些方法应该是事务性的,它们需要来自远程服务的数据。下面是类似的伪代码: 这样更容易实现。但是有许多缺点,例如当远程服务调用失败时不必要地创建和回滚事务,由于远程服务调用而导致的事务更长,并且可能更复杂。我正在考虑将服务调用移动到单独的非事务性方法,并调用事务性方法,如下面的代码段所示 假