1
如果您正在构建单个应用程序,则无需复制任何内容。如果你想在业务代码和 web/view 代码之间有一个非常严格的分离,你可以创建一个ear
, with anejb module
和 a web module
。web 模块中的所有类都可以访问ejb 模块中的所有类,但反之则不然。这有效地在您的应用程序中施加了分层。
但你不必为了这种分离而去。您也可以将您的 EJB bean 与您的 Servlet 以及您拥有的东西放在一起。你把豆子放在哪里没有限制。它可以位于单独的包中,也可以与 Servlet 位于同一包中。
你可能想看看我做的这个例子:http: //arjan-tijms.omnifaces.org/2011/08/minimal-3-tier-java-ee-app-without-any.html。在那里,BusinessBean
有一个 EJB 与单个 war 中的 JSF 支持 bean 驻留在相同的(默认)包中。
在单一战争设置中,一切都可以访问一切。请注意,即使在这种情况下,您也可能希望保持您的业务代码“干净”,并将诸如此类HttpRequest
的事情排除在外。
2
EJB bean,尤其是 EJB light,提供了大多数 Web 应用程序需要的东西:事务、池、线程安全、安全性和注入。与 JPA 结合使用时,您将充分利用 EJB bean。优点是您的代码将不那么冗长,同时避免使用纯 JDBC 时遇到的竞争条件和不一致。
例如
@Stateless
public class CustomerService {
@PersistenceContext
private EntityManager entityManager;
public void addCustomer(Customer customer) {
entityManager.persist(customer);
}
}
如果没有 EJB,您将需要一堆 try/finally 块来打开和关闭连接、启动和提交事务等。如果没有 JPA,您将有一大块乏味的代码插入Customer
实体的各个字段,如将示例放入准备好的语句中。
如果您(稍后)拥有调用一个或多个其他服务的服务,并且所有内容都需要保存到数据库中,或者什么都不保存(而不是两者之间未定义的内容),那么在纯 JDBC 中完成这是一个相当大的挑战。除了可以在中间阶段使用的方法之外,您还必须传递打开的连接,并且需要打开/关闭连接和启动/提交事务的每个服务方法的特殊变体。用不了多久,这将变得非常复杂和一大团泥巴。
使用 EJB,您从另一个 EJB bean 中调用的 EJB bean 中的每个方法都会自动加入正在进行的事务,或者如果没有事务在进行中,则启动它自己的方法。仅此一项就极大地简化了典型 Web 应用程序执行的许多常见业务任务。
不要让任何人告诉你只有“企业应用程序”需要事务,而 Web 应用程序不需要这个。这是不正确的。在进行数据库操作时,事务是非常基本的事情,与主键或外键的基本要求相同。在为订单(在网上商店)执行业务逻辑时,您绝对不希望减少库存,但不发送实际订单,或者发送订单但不从客户帐户中扣除任何款项等。最简单的业务逻辑通常涉及写入至少两个表,并且每次发生这种情况时,您最好使用事务。
请确保您使用的是 EJB 3。远离所有与 EJB 2 相关的事物。甚至不要触摸 Home 接口或实体 Bean 之类的东西,它们已经被弃用了大约 6 年。(不要将 EJB 实体 Bean 与 JPA 实体混淆,尽管不幸的名称相似,但它们完全不同。JPA 实体非常理智和有用)