JBuilder9+Weblogic7实战篇Entity Bean运用(四)

原创 2003年09月24日 20:30:00

JBuilder9+Weblogic7实战篇<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

ENTITY BEAN的运用(四)

                                                                      作者:黄 凯        

E_mail:hk_sz@163.com

 

七、通过Session Bean访问Entity Bean

    在前面给出的Entity Bean实例都是通过java客户端程序直接访问Entity Bean(通过Entity Bean的远程接口),在实际的应用系统开发中通常不采用这种做法,经常采用的是这样一种做法:建立一个Session Bean,该Session Bean中封装对Entity Bean的访问。而且访问时通过Entity Bean的本地接口进行以提高性能,客户端不与Entity Bean直接打交道,客户端通过Session Bean完成对Entity Bean的操作。这中做法其实是遵循了一种设计模式:Facade设计模式。

7.1 EJB引用

    在一个EJB中访问其他EJB,例如Session Bean facade要访问Entity Bean student,可以直接在facade中用“硬编码”实现,即在facade中通过Student的JNDI名字找到Home对象,然后获得对外接口(Remote接口或Local接口),完成方法调用。这种方式的缺点是显而易见的,因为这两个EJB被紧紧绑在一起,例如student有什么改动,例如改名字,那么facade就必须改代码(这也是为什么在《Entity Bean的运用(二)》中需要重新建立一个TestClient的原因)。

    J2EE采用这样一种方式解决此问题:在facade的部署描述文件中定义一个EJB引用,该项描述了对另一个EJB的引用,在facade的代码中只使用EJB引用的名字,EJB引用的名字是不变的,但是它所引用的内容是可变的,参见以下代码:

   <weblogic-enterprise-bean>

       <ejb-name>facade</ejb-name>

          <reference-descriptor>

             <ejb-reference-descriptor>

                 <ejb-ref-name>student</ejb-ref-name>

                 <jndi-name>Student</jndi-name>

             </ejb-reference-descriptor>

          </reference-descriptor>

       <jndi-name>facade</jndi-name>

     </weblogic-enterprise-bean>

     建立了EJB引用后,facade可以通过此引用获得要访问的EJB student的接口,参见以下代码:

    Context context = new InitialContext();

    Object ref = context.lookup("java:/comp/env/student");

    studentHome = (StudentHome)ref;

    在使用EJB引用时,作为lookup方法参数的完整的JNDI名字是“java:/comp/env/”+ EJB引用名,例如名为student的EJB引用,对应完整的JNDI名字是“java:/comp/env/student”。

7.2 EJB引用实例

7.2.1打开《Entity Bean的运用(一)》中建立的comSample工程,新建一个名为facade的Session Bean(可参看《SESSION BEAN篇》)。修改该Bean的如下信息:

    ★ Bean name: facade

Interface: remote

Session type: Stateless

7.2.2 在文档窗口“EJB Designer”中用鼠标右键单击facade,选择Open DD Editor菜单项。

7.2.3 在“DD Editor”界面中单击下方的EJB Local References选项卡。

7.2.4 在“EJB Local References”的设置界面中,单击Add按钮,然后在Name项后输入EJB引用的名字student,选中IsLink复选框(如果要引用的EJB是位于同一Jbuilder工程中则选种此项),Link项选择Student(要引用的EJB),其他项采用系统自动的设置即可。

7.2.5 在facade中增加一个方法getStuInfo(),该方法的功能是找到与参数(代表stuid)对应的Entity Bean Student,然后调用Student的方法getStuid()getStuname()。该方法的属性如下:

    Method name: getStuInfo

Return type: String

Input parameters: String stuid

Interface: remote

7.2.6 在facadeBean类中加入访问Student的代码。要访问Student,首先要获得StudentHome对象,这可以通过EJB引用获得。获得Home对象这部分代码要放在facadeejbCreate()方法和ejbActivate()方法中(即只要facade的实例一被建立或激活,就会获得StudentHome对象)。获得StudentHome对象后,在getStuInfo()方法中通过Home对象得到Student的本地接口(Local Interface),然后通过本地接口调用Student的方法。用以下代码替换facadeBean.java的代码:(灰色代码部分为手工添加的)

package cmpsample;

 

import java.math.*;

import javax.ejb.*;

import javax.naming.*;

 

public class facadeBean

    implements SessionBean

{

    SessionContext sessionContext;

    public Student student = null;

    private StudentHome studentHome = null;

    public void ejbCreate() throws CreateException

    {

        try

        {

            Context context = new InitialContext();

            Object ref = context.lookup("java:/comp/env/student");

            studentHome = (StudentHome) ref;

        }

        catch (Exception e)

        {

            e.printStackTrace();

        }

    }

 

    public void ejbRemove()

    {

        /**@todo Complete this method*/

    }

 

    public void ejbActivate()

    {

        try

        {

            Context context = new InitialContext();

            Object ref = context.lookup("java:/comp/env/student");

            studentHome = (StudentHome) ref;

        }

        catch (Exception e)

        {

            e.printStackTrace();

        }

 

    }

 

    public void ejbPassivate()

    {

        /**@todo Complete this method*/

    }

 

    public void setSessionContext(SessionContext sessionContext)

    {

        this.sessionContext = sessionContext;

    }

 

    public String getStuInfo(String stuid)

    {

        String strStu = null;

        try

        {

            student = studentHome.findByPrimaryKey(new BigDecimal(stuid));

            strStu = "The studentID is " + student.getStuid() + " Name is " +

                student.getStuname();

        }

        catch (Exception e)

        {}

        return strStu;

    }

}

7.2.7 重新编译EJB module,生成Cmp.jar文件,并部署到Weblogic Server上。

7.2.8 新建facade的客户端程序facadeTestClient1.java,利用该客户端程序访问facadegetStuInfo()方法。修改该客户端程序的main()方法如下:

    public static void main(String[] args)

    {

        facadeTestClient1 client = new facadeTestClient1();

        client.create();

        client.getStuInfo("2");

    }

7.2.9 编译运行该客户端程序,验证结果。

 

参考

电子工业出版社   《J2EE应用开发(Jbuilder+Weblogic)》

 

我的文章首发牛耳论坛(www.newer.com.cn/bbs)和程序员论坛(www.csdn.net),欢迎转载,不过,请保留作者以及修订者的名字,谢谢。

 

JBuilder9+Weblogic7实战篇ENTITY BEAN的运用

五、使用EJB QL开发查询5.1 什么是EJB QL    在关系数据库的操作中查询是经常使用的,主要是通过select语句完成的。Entity Bean作为代表数据库中数据的持久性组件也同样需要查...
  • Arias
  • Arias
  • 2005年03月22日 17:52
  • 868

JBuilder9+Weblogic7实战篇Entity Bean运用(二)

JBuilder9+Weblogic7实战篇ENTITY BEAN的运用(二)                                                             ...
  • kanaima
  • kanaima
  • 2003年09月23日 23:35
  • 925

JBuilder9+Weblogic7实战篇Entity Bean运用(三)

JBuilder9+Weblogic7实战篇ENTITY BEAN的运用(三)                                                             ...
  • kanaima
  • kanaima
  • 2003年09月23日 23:41
  • 929

JBuilder9+Weblogic7实战篇之Entity Bean运用篇(一)

JBuilder9+Weblogic7实战篇ENTITY BEAN的运用(一)                                                             ...
  • kanaima
  • kanaima
  • 2003年09月23日 23:33
  • 1060

ENTITY BEAN的运用(四)

七、通过Session Bean访问Entity Bean    在前面给出的Entity Bean实例都是通过java客户端程序直接访问Entity Bean(通过Entity Bean的远程接口)...
  • cnham
  • cnham
  • 2005年10月12日 16:42
  • 961

JBuilder9+Weblogic7实战篇之Filter运用篇

JBuilder9+Weblogic7实战篇运用篇(Filter过滤器在Jbuilder9中的运用)                                                  ...
  • kanaima
  • kanaima
  • 2003年08月31日 10:51
  • 748

bean、javabean、entity、dto、ejb、pojo都是些什么鬼

1、javaBean javaBean是一种Java语言写成的可重用组件。为写成JavaBean,类必须是具体和公共的,并且具有无参数的构造器。JavaBean通过提供符合一致性设计模式的公共方法将...
  • alabadazi
  • alabadazi
  • 2015年11月27日 22:35
  • 2605

JavaBean, EntityBean, POJO, PO, BO,VO,DTO,DAO 区别

先记一部分 这个类是共有类(public),并且必须有一个公共的缺省构造函数。 这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范。(JavaBean是一个定义了系...
  • ID_Rin
  • ID_Rin
  • 2017年01月07日 01:08
  • 895

EntityBean关系

Entity Bean之间也可以进行继承。子类所创建的表自动拥有父类定义的一些字段。如果不想要该父类生成表,那就把它定义为abstract class。@Inheritance的strategy设为T...
  • xeseo
  • xeseo
  • 2013年07月25日 12:20
  • 668

J2EE学习笔记五:entity bean概念

    Entity Bean提供了一个关系数据库的面向对象的抽象,它能同时从面向对象技术和面向过程技术中获益。既然Entity Bean和Session Bean都是Enterprise Bean,...
  • CMTobby
  • CMTobby
  • 2007年11月28日 17:26
  • 2142
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JBuilder9+Weblogic7实战篇Entity Bean运用(四)
举报原因:
原因补充:

(最多只允许输入30个字)