`
wumourong
  • 浏览: 26653 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
文章分类
社区版块
存档分类
最新评论

EJB入门--First EJB

阅读更多
该文章在<>的实例的基础上建立的,主要是给新手一个比较直观的例子和作为自己的日志,并不打算介绍EJB的原理性的东西。另外,由于本人水平有限,请不吝赐教。
    笔者使用的IDE为:Eclipse3.0+MyEclipse4.01GA
    J2EE容器为:JBoss4.0
   
    本文描述一个帮助存款和取款的无状态会话Bean的完整开发及部署的过程。步骤如下:
1、编写无状态会话Bean的实现类。
2、编写无状态会话Bean的主接口和组件接口。
3、将Bean汇编成应用程序,编写部署描述项。
4、在EJB服务器上部署应用程序。
5、用Java应用程序进行测试。
上面是主要的过程,有些步骤可以不用手工完成,通过IDE可以简化开发过程,如果你对IDE的该功能不太清楚可以参考产品文档(http: //myeclipseide.com/enterpriseworkbench/help/index.jsp?topic=/com.genuitec.myeclipse.doc/html/quickstarts/firstejb/index.html)。

一、新建一个EJB Project,工程名字为FundEJB,其他默认就好。
二、创建Session Bean:
    1、在src目录下新建包:qiya.deng.fund.ejb,请注意包名最后一定要以ejb为后缀,因为后面我们需要使用的XDoclet工具。
    2、新建SessionBean class,命名为StatelessFundManagerEJB,要需要以EJB为后缀,原因同上,而且根据规范最好是以EJB或是Bean为后缀。
   

    3、配置XDoclet :
    右击项目选择Properties,选择MyEclipse-XDoclet,点击Add Stander...,选择Standard EJB。
   
    选中Standard EJB,在ejbxdoclet上点击右键添加Add,在其中选择jboss,因为该例子中使用jboss作为应用服务器。选中jboss,修改下列属性
    Version = 4.0
    destDir = src/META-INF
   修改完毕,点击OK按钮回到主窗口。

    4、运行Xdoclet:
    右击项目选择MyEclipse->run Xdoclet。运行是console窗口会产生提示信息,运行完毕可以看到目录结构发生变化。
   
    5、编辑实现类StatelessFundManagerEJB:
    在编辑StatelessFundManagerEJB类之前选观察下StatelessFundManager接口,一定可以发现这个远程组件接口的接口方法和StatelessFundManager的方法是有对应关系的。
    在StatelessFundManager.java文件最后添加:

        /**
     *
     * @param balance
     * @param amount
     * @return
     *
     * @ejb.interface-method
     */
    public double addFunds(double balance,double amount){
        balance += amount;
        return balance;
    }
   
    /**
     *
     * @param balance
     * @param amount
     * @return
     * @throws InsufficientBalanceException
     *
     * @ejb.interface-method
     */
    public double withdrawFunds(double balance,double amount)throws InsufficientBalanceException {
        if (balance < amount) {
            throw (new InsufficientBalanceException());
        }
        balance -= amount;
        return balance;
    }
    重复第4步运行Xdoclet,之后观察StatelessFundManager接口。

   6、部署该应用到EJB服务器:
    部署描述项在IDE自动生成了,该文件的位置在/META-INF/ejb-jar.xml。打开ejb-jar.xml,jboss.xml文件描述进行查看。
    利用MyEclipse提供的部署工具进行部署:
   
    然后运行JBoss容器,可以看到有如下信息提示:

   

    关于MyEclipse中Application Server的使用请查看文档(http://www.myeclipseide.com/images/tutorials/quickstarts/appservers/)。
    到现在为止,你已经发布了一个简单的无状态的会话Bean。下面写个简单的应用程序进行测试.
   
三、编写进行测试的Java客户端程序。
    客户端程序可以是Web程序也可以是Application应用程序。这里以Application应用程序为例。
    同样使用Eclipse,新建Java Project,这里命名为FundClient。右击该项目选择properties->Java Build path,在Projects中加入上面的Project:FundEJB。在Libraries中点击Add External JARs...,把$JBoss_Home/client的目录下的所有jar文件添加到Libraries中。
    最后,就是编写客户端代码:

package qiya.deng.client;
    //import省去
public class StatelessFundManagerTestClient extends JFrame implements
        ActionListener {

    double balance = 0;
    JTextField amount = new JTextField(10);
    JButton addFunds = new JButton("Add Funds");
    JButton withdrawFunds = new JButton("Withdraw Funds");
    String msg = "Current account balance";
    String strBal = "0";
    JLabel status;
    StatelessFundManager manager;
    NumberFormat currencyFormatter;
   
    public StatelessFundManagerTestClient(){
        super("Fund Manager");
    }
   
    public static void main(String[] args){
        new StatelessFundManagerTestClient().init();
    }
   
    private void init() {
       
        buildGUI();
       
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent event){
                System.exit(0);
            }
        });
       
        addFunds.addActionListener(this);
        withdrawFunds.addActionListener(this);
       
        createFundManager();
       
        currencyFormatter = NumberFormat.getCurrencyInstance();
        String currencyOut = currencyFormatter.format(0);
        status.setText(msg + currencyOut);
       
        pack();
        show();
    }

    private void buildGUI() {
        GridBagLayout gl = new GridBagLayout();
        GridBagConstraints gc = new GridBagConstraints();
        Container container = getContentPane();
        container.setLayout(gl);
       
        gc.fill = GridBagConstraints.BOTH;
        JLabel label = new JLabel("Enter Amount");
        gl.setConstraints(label,gc);
        container.add(label);
       
        gc.gridwidth = GridBagConstraints.REMAINDER;
        gl.setConstraints(amount,gc);
        container.add(amount);
       
        gl.setConstraints(addFunds,gc);
        container.add(addFunds);
        gl.setConstraints(withdrawFunds,gc);
        container.add(withdrawFunds);
       
        status = new JLabel(msg);
        gl.setConstraints(status,gc);
        container.add(status);
    }

    public void createFundManager(){
        try {
            Properties prop = new Properties();
            prop.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
            prop.put(Context.PROVIDER_URL,"localhost:1099");
            Context initial = new InitialContext(prop);
            Object objref = initial.lookup("ejb/StatelessFundManager");//JINI-Name
            StatelessFundManagerHome home =
                (StatelessFundManagerHome) PortableRemoteObject.narrow(objref,StatelessFundManagerHome.class);
            manager = home.create();
        } catch (ClassCastException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (CreateException e) {
            e.printStackTrace();
        }
    }

    public void actionPerformed(ActionEvent e) {
       
       
       
        if (e.getActionCommand().equalsIgnoreCase("Withdraw Funds")) {
            System.out.println("Withdraw Funds");
        }
        if (e.getActionCommand().equalsIgnoreCase("Add Funds")) {
            System.out.println("Add Funds");
        }
       
        if (e.getSource().equals(addFunds)){
            System.out.println("addFunds");
            try {
                status.setText(msg + currencyFormatter.format(manager.addFunds(0,Double.parseDouble(amount.getText()))));
            } catch (NumberFormatException e1) {
                e1.printStackTrace();
            } catch (RemoteException e1) {
                e1.printStackTrace();
            }
        }
        if (e.getSource().equals(withdrawFunds)){
            System.out.println("withdrawFund");
            try {
                status.setText(msg + currencyFormatter.format(manager.withdrawFunds(100,Double.parseDouble(amount.getText()))));
            } catch (NumberFormatException e1) {
                e1.printStackTrace();
            } catch (RemoteException e1) {
                e1.printStackTrace();
            } catch (InsufficientBalanceException e1) {
                e1.printStackTrace();
            }
        }
    }

}
    然后,你可以运行该程序进行测试了:
     
    至此,恭喜你,你已经大功告成,基本上对EJB建立了感性的认识,可以参考资料进行深入的学习了
分享到:
评论

相关推荐

    first-ejb3-tutorial-en.pdf

    ### EJB3基础知识与实践教程 #### 一、EJB3简介 EJB3(Enterprise JavaBeans 3)是Sun Microsystems推出的一种用于开发多层企业级应用的技术标准...希望本教程能够帮助初学者快速入门EJB3,并在实践中不断深入学习。

    Head First EJB(中文版)

    EJB入门书籍。以轻松而详尽的语言描述EJB,值得一读。 重新调整分数了,原来一直忘记改回来,十分抱歉。

    《EJB3.0入门经典教程精简版》源码

    本教程源码是针对EJB3.0入门的经典教程精简版,旨在帮助初学者快速掌握EJB3.0的核心概念和技术。 在EJB3.0中,有几个关键知识点: 1. **实体Bean(Entity Beans)**:EJB3.0引入了注解驱动的实体Bean,通过`@...

    head-first 系列合集(上)

    1. **Head-First EJB**:这本书深入浅出地介绍了EJB,它是Java平台企业版(Java EE)的核心组件,用于构建可扩展且可靠的服务器端应用程序。读者将学习到会话bean、实体bean、消息驱动bean的概念,以及如何使用容器...

    Head-First-Java(英文版)

    - **第一章:突破表面** - 本书首先通过快速入门的方式让读者了解Java的基本概念。 - **第二章:前往对象城** - 介绍面向对象编程的核心概念,包括类、对象等。 - **第三章:了解变量** - 探讨Java中的原始类型和...

    jakartaee-firstcup-examples

    【JakartaEE FirstCup 示例】是针对初学者的一个项目,旨在帮助他们快速入门Java EE(现称为Jakarta EE)的开发。这个项目包含了多个示例应用,通过这些实例,开发者可以了解和学习如何在实际环境中运用Jakarta EE的...

    Head First Java In English

    ### Head First Java 英文版知识点总结 #### 一、简介 《Head First Java》是一本专门为初学者设计的学习指南,旨在帮助读者不仅掌握 Java 编程语言的基础知识,还能在此过程中提高英语阅读水平。本书采用了独特的...

    Head First Java, 2nd Edition.pdf

    《Head First Java, 第二版》是一本深入浅出、以直观方式教授Java编程语言的书籍,适合初学者以及希望深化Java技能的程序员。本书由Kathy Sierra与Bert Bates共同编写,通过独特的教学方法,将复杂的概念转化为易于...

    HeadFirst全集

    该系列通过使用丰富的插图、实例以及易于理解的语言来教授复杂的概念和技术,非常适合初学者入门及进阶学习。 #### 二、HeadFirst系列覆盖的主题领域 HeadFirst系列涵盖了广泛的IT技术领域,包括但不限于: 1. **...

    Your First Cup An Introduction to the javaee platform.pdf

    该书出版于2011年6月,提供了关于Java EE平台的入门级教程和示例代码。 #### 二、Java EE平台定义 Java EE平台是一种广泛使用的标准,用于开发可伸缩、健壮且安全的企业应用程序。它基于Java标准版(Java SE),并...

    Head first servlets and JSP Second Edition

    1. **Jef Cumps**(J2EE咨询顾问):对Head First系列中的EJB书籍给予了高度评价,并表示该书不仅让他在考试中取得了优异的成绩,还使他在学习过程中享受到了乐趣。 2. **Philippe Maquet**(Loop Factory高级讲师...

    Head First Servlets and JSP (第二版 英文版)

    3. **Oliver Roell**(SCJP, SCJD, SCBCD, SCWCD, SCEA):对于初学者来说,这是市场上最好的Servlet技术入门书籍之一。 4. **Theodore Casser**(高级软件开发者,Nanavati Consulting):强烈推荐给所有对Java EE...

    一个走心的 Java Web 入门开发教程

    本教程“一个走心的 Java Web 入门开发教程”旨在为新手提供一个全面且深入的学习路径,帮助他们快速掌握 Java Web 的基础知识。 在 Java Web 开发中,我们通常会涉及以下几个核心概念: 1. **Java Servlet**:...

    JavaEE学习资料

    该文档旨在为初学者提供一个了解 Java EE 平台的入门指南,并通过一个具体的案例——“First Cup”来帮助读者更好地理解和掌握 Java EE 的核心概念和技术。 #### 二、背景与目标 《First Cup:Java EE 平台介绍》...

    JAVA程序员必看的15本书-JAVA自学书籍推荐 (2).pdf

    1. **《Head First Java》** - 对于初学者,这本书以轻松的方式介绍了Java的基础知识,包括语法和基本用法,适合快速入门。 2. **《Effective Java》** - Joshua Bloch 的经典之作,深入探讨了如何写出更高效、更...

    j2ee程序员必读书.txt

    - 内容:以友好的方式讲解Servlet和JSP的基础知识,适合Web开发入门者。 - **《Head First HTML CSS & XHTML》** - 内容:介绍了网页标准标记语言的基础知识,包括HTML、CSS和XHTML。 - **《HTML+CSS网页布局...

    JAVA程序员必看的15本书-JAVA自学书籍推荐.pdf

    例如《Head First Java》是一本通俗易懂的入门书籍,采用生动有趣的方式教授基础知识,适合快速入门。 2. **Java编程进阶** 随着基础的巩固,可以阅读《重构:改善既有代码的设计》来提升代码质量和设计能力,这...

Global site tag (gtag.js) - Google Analytics