完全了解Enterprise Java开发并在阅读following教程之后。我设法开发了我的第一个会话bean。在阅读了一些关于会话bean的内容后,我确实对它有一些疑问(会话bean),我希望这里的专家可以帮助我。
通常在不使用EJB的servlet场景中,我们会执行类似以下的操作来完成某项任务
StudentList stud = businesslayer.businessMethod_GetStudentsFromDb();
现在,业务层将调用服务层,该层将从数据库中获取详细信息并将其返回。
现在我的问题如下:
1 - 如果我使用无状态EJB实现此机制,我将必须将包含域对象 StudentList 的域包复制到我的企业项目的“-ejb”文件夹中(我正在使用netbeans)。同样,我必须将其他Business方法从我的“-war”文件夹的源文件夹复制到ejb文件夹,以便“-ejb”文件夹中的无状态bean可以使用这些方法。 “-ejb”文件夹中的Cant类使用类内部“-war”文件夹的源文件夹。
2 - 这是迄今为止我无法理解的问题。如果我使用EJB而不是当前的机制,我会得到什么好处?
答案 0 :(得分:4)
<强> 1 强>
如果您正在构建单个应用程序,则无需复制任何内容。如果您希望在业务代码和Web /视图代码之间进行非常严格的分离,则可以使用ear
和ejb module
创建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,它与单个战争中的JSF支持bean位于相同的(默认)包中。
在单一战争设置中,一切都可以访问所有内容。请注意,即使在这种情况下,您可能希望保持业务代码“干净”,并保留HttpRequest
之类的内容。
<强> 2 强>
EJB bean,尤其是EJB light,提供了大多数Web应用程序所需的东西:事务,池,线程安全,安全性和注入。与JPA结合使用时,您将充分利用EJB bean。优点是您的代码将更加冗长,同时屏蔽了使用普通JDBC时遇到的竞争条件和不一致性。
E.g。
@Stateless
public class CustomerService {
@PersistenceContext
private EntityManager entityManager;
public void addCustomer(Customer customer) {
entityManager.persist(customer);
}
}
如果没有EJB,您将需要一堆try / finally块来打开和关闭连接,启动并提交事务等。如果没有JPA,您将会有一大堆繁琐的代码插入{的单个字段{1}}实例中显示的实体为预准备语句。
如果您(稍后)拥有调用一个或多个其他服务的服务,并且所有内容都需要保存到数据库中,或者没有任何内容(与之间未定义的内容相反),那么在普通JDBC中实现这一点非常困难。除了可以在中间阶段使用的方法之外,您还必须传递开放连接并且需要每个服务方法的特殊变体来打开/关闭连接和启动/提交事务。不久之后,这将变得非常复杂,并且是泥泞的大球。
使用EJB,您在其他EJB bean中调用的EJB bean中的每个方法都会自动加入正在进行的事务,或者如果没有正在进行的事务则自动启动它。仅这一点就大大简化了典型Web应用程序执行的许多常见业务任务。
不要让任何人告诉您只有“企业应用程序”需要交易,而Web应用程序不需要这样做。这是不正确的。在执行数据库操作时,事务是一个非常基本的事情,与主键或外键的基本要求相同。在执行订单(在网上商店)时执行业务逻辑时,您绝对不希望您的库存减少,但不发送实际订单,或发送订单但不从客户的帐户中扣除任何金额等。最简单的业务逻辑通常涉及写入至少两个表,每次发生这种情况时,最好使用事务。
确保您使用的是EJB 3。远离与EJB 2有关的所有事情。甚至不要触摸家庭界面或实体豆等已经被弃用了6年的东西。 (不要将EJB Entity Beans与JPA实体混淆,尽管名称相似,但这些完全不同.JPA实体非常合理且有用)