Enterprise JavaBean笔记:Domain Object

首先解释一下DO的意思:Domain Object,域对象,在某一个范围(域)内有效的对象。

之所以设置DO,是因为Entity bean在远程传输(RMI)的过程中会舍弃信息(那些由EntityManager控制的信息会在RMI传输后丢失),从而使得部分方法失效。

如 果探究过Entity Bean的OneToMany、ManyToMany模型的Lazy fetch机制的话,就会发现,这些方法是受EntityManager控制的,只有在需要调用的时候才会有内容(即再向服务器发送请求获取内容)。如果 经过RMI后,Entity Bean不再受EntityManager控制,那么Lazy fetch机制将失效(对应的方法返回的结果是未知的,也就是说Entity Bean的部分方法也失效了。为了避免使得Entity Bean失效,设置一个轻量级的DO来代替Entity Bean,保证DO的方法都是可用的。

因此,每个Entity Bean可能会有多个DO,用来对应不同的功能,有些DO预先获取了lazy fetch的列表,有些则不,充分发挥lazy fetch需要才调用的效果。

 

Enterprise JavaBean笔记:第一印象

这篇文章只是对 EJB 起一个很初步的认识。

以前觉得,既然有了 JSP 和 Servlet ,基本分离了表现和逻辑,再加上 Filter 作为视图层的补充,Listener 为事件监听。已经是一个比较完善的架构了。EJB 要作为那一部分的补充而存在呢?

实际上,EJB 的存在应该是为了补充 Servlet 对拓展性不足而存在的。EJB 的存在,一个基本的修改的是,把两层结构 user -> Servlet ,修改为 user -> Servlet -> EJB。实际上,如果按照原来的设想,Servlet本身就可以作为一个 Stateless Session Bean,但由于 Servlet 实现的历史原因, Servlet 必须继承于 HttpServlet 类,并且带有 HTTP 的特征,作为视图层的 JSP 实际上是一个特殊化的 Servlet 。也就是说, Servlet 本来也是为单一业务(HTTP)而存在的,算是一个适配器。而客户端技术,却不仅仅只是 HTTP 和 HTML,因此,一个只为业务而生的逻辑层应运而生,即 EJB 。

在《Java EE 6 Tutorial》中对 EJB 的介绍:

You should consider using enterprise beans if your application has any of the following requirements.

  • The application must be scalable. To accommodate a growing number of users, you may need to distribute an application’s components acrossmultiplemachines. Not only can the enterprise beans of an application run on differentmachines, but also their locationwill
  • remain transparent to the clients.
  • Transactionsmust ensure data integrity. Enterprise beans support transactions, the mechanisms thatmanage the concurrent access of shared objects.
  • The application will have a variety of clients. With only a few lines of code, remote clients can easily locate enterprise beans. These clients can be thin, various, and numerous.

EJB 的拓展性,主要体现在 EJB 容器的对象缓存上。由于 EJB 的缓存,客户端(包括 Web 应用)可以很快地获取 EJB 对象。而其他特点,数据一致性、支持多客户端,都基于对象池的设计。

EJB 的类型分为 Session bean 和 Message Driven Bean。 Session Bean 中的无状态 Bean 就是缓存的主要对象。关于这方面的资料,可以参考《The Java EE 6 Tutorial》。

Enterprise JavaBean 笔记:JBoss安装与配置

记得刚上大学不久,学 Java 的时候,就曾经听说过 Enterprise JavaBean 了,但一直没有试用过,因为,从这个名字看来,很容易和 JavaBean 混淆。而在 Enterprise JavaBean 介绍中提到的分布式、可伸缩的网络模块的时候,又显然和作为对象数据存取规范的 JavaBean 规范不同。Enterprise JavaBean 更像是一个遵循 JavaBean 规范的网络服务提供者。一直以来用PHP来开发网站,对 Java 这边规范的 MVC 开发模式还是颇为羡慕。而这个学期就开始 EJB 的旅程了~

这个系列博客大概会持续讨论关于 Enterprise JavaBean 的问题,欢迎大家提出意见。 :-)

环境选择:

这里选择 NetBeans + JBoss AS 5.1 作为开发环境。选择 JBoss AS 5.1 是因为课程需要,其实 NetBeans + Glassfish 的组合可能更好。

  1. JBoss AS 5.1:可以在http://sourceforge.net/projects/jboss/files/JBoss/JBoss-5.1.0.GA找到,下载后解压即可。
  2. Netbeans 7.2:可以在http://www.netbeans.org下载NetBeans 7.2 for Java EE(按提示安装即可,其中可以选择安装安装包带上的Glassfish 3.2.2,Java EE 6兼容服务器)。

配置:

NetBeans安装成功后,如果开始时选择了Glassfish,那么已经有一个Java EE 6兼容服务器。不过,这里选择课堂要求的JBoss Application Server 5.1。

  1. 在NetBeans的服务器平台上,点击“工具”->“服务器”。
  2. 在服务器窗口点击“添加服务器”,按提示添加“JBoss Application Server”,选择JBoss的安装根目录即可。
  3. 启动JBoss AS 5.1,如果出现“java.lang.IllegalArgumentException: Wrong arguments. new for target java.lang.reflect.Constructor expected=[java.net.URI] actual=[java.io.File]”的提示,大多是因为注入AttachmentStore类的时候没有指定注入类型导致。
    编辑%JBOSS_HOME%/server/default/conf/bootstrap/profile.xml文件:
    ……
    
    <bean name="AttachmentStore" class="org.jboss.system.server.profileservice.repository.AbstractAttachmentStore">
        <constructor>
            <parameter>
                <inject bean="BootstrapProfileFactory" property="attachmentStoreRoot" />
            </parameter>
        </constructor>
    ……

    修改<parameter>标签为:

    ……
            <parameter class="java.io.File">
    ……

    即可。

测试:

  1. 新建 EJB 模块。新建 Stateless Session Bean(无状态会话Bean),新建向导创建Local(本地)接口的无状态会话 Bean,添加一个 Bussiness Method (在编辑区域内,按 alt + Insert,即弹出生成代码框,选择 NetBeans 的原因一部分就是因为 NetBeans 挺方便的代码生成功能)。
    代码看起来像:
    package hello.greeting;
    
    import javax.ejb.Stateless;
    
    @Stateless
    public class Greeting implements GreetingLocal {
    
        public String greet(String name) {
            return "Hello, " + name + "!";
        }
    }

    接口如下:

    package hello.greeting;
    
    import javax.ejb.Local;
    
    @Local
    public interface GreetingLocal {
    
        public String greet(String name);
    }
  2. 新建 Web 应用程序项目,编辑项目属性,添加 上面创建的 EJB 模块到 Libraries (库)中,不需要包括在编译包中。这里只是为了让这个 Web 应用程序知道会话 Bean 的接口而已。
    编辑 index.jsp,在空白处添加对 EJB 的引用:
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <%@page import="javax.naming.*" %>
    <%
    InitialContext context = new InitialContext();
    GreetingLocal bean = (GreetingLocal) context.lookup("Greeting/local");
    out.println(bean.greet("Jack"));
    %>
  3. 发布 EJB 模块和 Web 应用程序来测试吧~