使用Eclipse开发CMP2.0

原创 2003年06月30日 15:34:00

使用Eclipse开发CMP2.0

--集成JBoss-IDE 1.1.0、JUnitEJB、MySQL

 

Eclipse作为目前成功的开源IDE之一受众多Java开发人员的喜爱,但是其内部并不直接支持EJB的开发一直为广大开发人员所诟病,并且大大增加了EJB初学者使用Eclipse开发EJB的难度;JBoss作为目前最为成功的EJB容器,由于文档的缺乏,初学者往往抓不住要点,对部署和调试时产生的错误往往束手无策。本文使用JBoss Group提供的Eclipse插件JBoss-IDE 1.1.0进行CMP开发,希望能够带领大家一窥Eclipse下开发EJB的神秘面目。

范例开发使用软件:

1)Eclipse2.1       http://www.eclipse.org

2)JBoss3.07        ( http://sourceforge.net/projects/jboss/

3)JBoss-IDE 1.1.0  ( http://sourceforge.net/projects/jboss/

4)JUnit            ( http://sourceforge.net/projects/junit/

5)JUnitEJB         ( http://sourceforge.net/projects/junitejb/

6)MySQL 3.23.56    ( http://www.mysql.com

7)MySQL JDBC 2.0.14( http://www.mysql.com/downloads/

 

一.配置篇
1.  Eclipse插件的配置
    首先将下载的JBossIDE文件org.jboss.ide.eclipse_1.1.0.bin.dist.zip直接解压缩至Eclipse2.1所在目录下,Eclipse目录结构如下图所示:

CSDN_Dev_Image_2003-6-272201341.gif

如果操作正确,将出现“确认文件夹替换窗口”,点击“全部”即可。等到Eclipse下次启动时,插件将自动加载。

 

2.  JBoss3.07的配置

    这里需要对JBoss进行配置的地方有两处,一处为JBoss的日志信息选项,使得我们今后在部署EJB时能够得到关于部署的详细信息;另一处为JBoss中的数据源,使得我们可以使用容器持久化管理的EntityBean对数据库中的数据进行操作。

    (1)首先我们讲述日志信息选项的更改,进入JBoss所在目录下的server/default/conf目录,找到文件log4j.xml,将其用文本编辑器打开,将属性作如下修改:

修改一:

  <!-- Limit JBoss categories to INFO

  <category name="org.jboss">

    <priority value="INFO"/>

  </category>

  -->

修改为:

  <!-- Limit JBoss categories to INFO -->

  <category name="org.jboss">

    <priority value="INFO"/>

  </category>

 

修改二:

  <!-- ============================== -->

  <!-- Append messages to the console -->

  <!-- ============================== -->

 

  <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">

    <param name="Threshold" value="INFO"/>

    <param name="Target" value="System.out"/>

修改为:

  <!-- ============================== -->

  <!-- Append messages to the console -->

  <!-- ============================== -->

 

  <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">

    <param name="Threshold" value="DEBUG"/>

    <param name="Target" value="System.out"/>

将这些属性进行修改之后,当我们部署CMP EntityBean的时候将能看见JBoss针对所部署的CMP EntityBean自动产生的SQL插入语句与CMP EntityBean中包含的EJB-QL语句;并且在EntityBean被使用时发生的SQL查询语句。

(2)接着我们讲述数据源的配置,第一步:我们进入JBoss的文件夹下的docs/examples/jca目录,用文本编辑器打开mysql-service.xml,将其中的部分内容作如下修改:

<attribute name="JndiName">MySqlDS(数据源名称)</attribute>

<attribute name="ManagedConnectionFactoryProperties">

<properties>

        <config-property

name="ConnectionURL" type="java.lang.String">jdbc:mysql://localhost:3306/resultmanager

(数据库URL)

</config-property>

        <config-property

name="DriverClass" type="java.lang.String">com.mysql.jdbc.Driver

(数据库驱动程序)

</config-property>

<config-property

name="UserName" type="java.lang.String">DataBase(数据库用户)

</config-property>

<config-property

name="Password" type="java.lang.String">

sailing(数据库用户密码)

</config-property>

</properties>

</attribute>

将修改好的内容保存后,复制mysql-service.xml文件至JBoss文件夹下server/default/deploy 目录,此时deploy目录中的文件如下图所示:

CSDN_Dev_Image_2003-6-272201343.gif

第二步,我们将含有MySQL JDBC 2.0.14驱动程序的jar文件复制到JBoss安装目录的server/default/lib目录下,此时lib目录中的文件如下图所示:CSDN_Dev_Image_2003-6-272201345.jpg

现在我们已经完成了前期的配置工作,接下来我们将讲述CMP EntityBean的开发。

 

二:开发篇

1.  程序介绍:程序中含有两个EntityBean,分别为StudentBean和ResultBean。StudentBean中包含学生的基本信息:student_ID(学号,主键),name(名字);ResultBean中包含学生的成绩信息:result_ID(成绩的编号,主键),catalogname(科目名称),score(成绩得分),student_ID_FK(与StudentBean相关联的外键)。实体关系图如下:

CSDN_Dev_Image_2003-6-272201347.gif

数据库建立脚本如下:

#

# Table structure for table 'result'

#

 

CREATE TABLE `result` (

  `result_ID` int(5) unsigned NOT NULL default '0',

  `catalogname` varchar(50) NOT NULL default '0',

  `score` int(5) unsigned NOT NULL default '0',

  `student_ID_FK` int(5) unsigned default '0',

  PRIMARY KEY  (`result_ID`)

) TYPE=MyISAM;

 

#

# Table structure for table 'student'

#

 

CREATE TABLE `student` (

  `student_ID` int(5) unsigned NOT NULL default '0',

  `name` varchar(50) NOT NULL default '0',

  PRIMARY KEY  (`student_ID`)

) TYPE=MyISAM;

 

2.  建立工程:选择FileàNewàProject…,出现对话框,如图所示:

CSDN_Dev_Image_2003-6-272201349.jpg

选中Java Project,点击Next按钮,出现对话框:

CSDN_Dev_Image_2003-6-2722013411.jpg

Project name中填入工程名称ResultManager,下面的对话框为工程文件的存放路径,选择默认即可。填写完毕后点击Next按钮,出现下图:

CSDN_Dev_Image_2003-6-2722013413.jpg

接着选择右上偏中的Libraries标签,如图:

CSDN_Dev_Image_2003-6-2722013415.jpg

选择右方的add External JARs…按钮,将JBoss目录中client目录下的所有jar文件选中,加入到当前工程中:

CSDN_Dev_Image_2003-6-2722013417.jpg

 

CSDN_Dev_Image_2003-6-2722013419.jpg

点击Finish按钮,结束工程的建立。

建立完成的工程结构如下图(文中涉及工程结构的图均不包含导入工程的JAR文件)

CSDN_Dev_Image_2003-6-2722013421.gif

3.  建立StudentBean EntityBean:(1)选择FileàNewàClass,在弹出的对话框中按照下图进行填写:

CSDN_Dev_Image_2003-6-2722013423.jpg

完成后选择Finish。Eclipse将为我们自动产生实现接口中方法的默认实现代码。此时的工程文件夹结构如图所示:

CSDN_Dev_Image_2003-6-2722013425.gif

2)编写StudentBean EntityBean:由于XDoclet中的ejb和JBoss标签有着良好的自解释性,所以很容易看出其代表的意思(由于本文主要讲述工具的使用方法,所以省去关于CMP原理及XDoclet中包含标签的介绍)。StudentBean代码如下所示:

package edu.njut.resultmanager.ejb;

 

import java.rmi.RemoteException;

 

import javax.ejb.EJBException;

import javax.ejb.EntityBean;

import javax.ejb.EntityContext;

import javax.ejb.RemoveException;

 

 

 

/**

 * @author sailing

 * @ejb.bean

 *         name = "Student"

 *         display-name = "Student EntityBean"

 *         description = "Student CMP EntityBean"

 *         view-type = "both"

 *         jndi-name = "Student"

 *         local-jndi-name = "StudentLocal"

 *         type = "CMP"

 *         cmp-version = "2.x"

 *         primkey-field = "student_ID"

 *        

 * @ejb.persistence

 *         table-name = "student"

 *

 * @jboss.persistence

 *           datasource = "java:/MySqlDS"

 *           datasource-mapping = "mySQL"

 *

 * @ejb.finder

 *         query = "SELECT OBJECT(o) FROM Student o"

 *         result-type-mapping = "Local"

 *         signature = "java.util.Collection findAll()"

 *

 * @ejb.finder

 *         query = "SELECT DISTINCT OBJECT(o) FROM Student o WHERE o.name=?1"

 *         result-type-mapping = "Local"

 *         signature = "java.util.Collection findByName(java.lang.String name)"

 *

 */

public abstract class StudentBean implements EntityBean {

    private javax.ejb.EntityContext _entityContext;

 

    //------CMP Fields------

 

    /**

     * @ejb.persistence

     *         column-name = "student_ID"

     *

     * @ejb.interface-method

     *         view-type = "both"

     * @ejb.pk-field

     */

    public abstract java.lang.Integer getStudent_ID();

 

    /**

     * set student's ID

     * @param id student's ID

     */

    public abstract void setStudent_ID(java.lang.Integer id);

 

    /**

     * @ejb.persistence

     *         column-name = "name"

     *

     * @ejb.interface-method

     *         view-type = "both"

     */

    public abstract java.lang.String getName();

 

    /**

     * set student's name

     * @param name student's name

     */

    public abstract void setName(java.lang.String name);

 

    //------CMR Fields------

 

    /**

     * @ejb.relation

     *         name = "student-result"

     *         role-name = "student-has-result"

     *         target-ejb = "Result"

     *         target-multiple = "no"

     *         target-role-name = "result -belong-student"

     *         target-cascade-delete = "yes"

     *       

     * @jboss.target-relation

     *          related-pk-field = "student_ID"

     *          fk-column = "student_ID_FK"

     *          fk-constraint = "yes"

     */

    public abstract java.util.Collection getResults();

 

    /**

     * @ejb.interface-method

     *         view-type = "both"

     * @param results student's results

     */

    public abstract void setResults(java.util.Collection results);

 

    //------EJB CreateMethod------

 

    /**

     * @ejb.create-method

     */

    public java.lang.Integer ejbCreate(java.lang.Integer studentID,

        java.lang.String name) throws javax.ejb.CreateException {

        setStudent_ID(studentID);

        setName(name);

 

        //EJB 2.0 spec says return null for CMP ejbCreate methods.

        return null;

    }

 

    public void ejbPostCreate(java.lang.Integer studentID, java.lang.String name) {}

 

    //-----------EJB callback method-------------

 

    /* (non-Javadoc)

     * @see javax.ejb.EntityBean#ejbActivate()

     */

    public void ejbActivate() throws EJBException, RemoteException {

    }

 

    /* (non-Javadoc)

     * @see javax.ejb.EntityBean#ejbLoad()

     */

    public void ejbLoad() throws EJBException, RemoteException {

    }

 

    /* (non-Javadoc)

     * @see javax.ejb.EntityBean#ejbPassivate()

     */

    public void ejbPassivate() throws EJBException, RemoteException {

    }

 

    /* (non-Javadoc)

     * @see javax.ejb.EntityBean#ejbRemove()

     */

    public void ejbRemove()

        throws RemoveException, EJBException, RemoteException {

    }

 

    /* (non-Javadoc)

     * @see javax.ejb.EntityBean#ejbStore()

     */

    public void ejbStore() throws EJBException, RemoteException {

    }

 

    /* (non-Javadoc)

     * @see javax.ejb.EntityBean#setEntityContext(javax.ejb.EntityContext)

     */

    public void setEntityContext(EntityContext arg0)

        throws EJBException, RemoteException {

    }

 

    /* (non-Javadoc)

     * @see javax.ejb.EntityBean#unsetEntityContext()

     */

    public void unsetEntityContext() throws EJBException, RemoteException {

    }

}

注意:按照JBoss-IDE说明文档中所描述,在Java编辑器中按下ctrl+space将出现编写XDoclet标签的提示,但在中文版的操作系统中ctrl+space为切换中英文输入法,这里产生了快捷键的冲突。为了解决这个问题,我们必须对Eclipse中的快捷键做出修改。方法为:WindowsàPreferencesàWorkbechàKeysàEditàContent Assist,选中Ctrl+Space[conflict],将Key sequence框中的Ctrl+Space改为Ctrl+Alt+Space,这样你就可以在Java编辑器中通过快捷键Ctrl+Alt+Space快速完成标签的编写了。修改完成后如下图所示:

CSDN_Dev_Image_2003-6-2722013427.jpg

 

4.  剩余类文件的编写:由于剩余的类文件的编写与StudentBean EntityBean大相径庭,这里便不再列出了,具体的代码可以在随文档的源代码中找到。当所有文件编写完成后,工程的目录结构如下图:

CSDN_Dev_Image_2003-6-2722013429.gif

注意,这里在SequenceSessionBean的代码中出现了错误,是由于在SequenceSessionBean中调用了即将由XDoclet自动生成的本地对象(SequenceLocal)和本地主方法(SequenceLocalHome)造成的,当通过XDoclet自动生成了相应Bean文件的各个相关类文件后错误就将消失。

5.  使用XDoclet生成部署描述符以及相关类文件:(1)用鼠标右键单击工程名称,在弹出菜单中选择Properties选项,如图:

CSDN_Dev_Image_2003-6-2722013431.gif

在弹出的对话框中选择XDoclet Configurations选项

CSDN_Dev_Image_2003-6-2722013433.jpg

 

2)在Define the XDoclet Configurations… 下方的空白区域中单击鼠标右键,在弹出的菜单中选择add。

CSDN_Dev_Image_2003-6-2722013435.gif

在弹出的对话框中填上EJB(名称可以随意填写)。

CSDN_Dev_Image_2003-6-2722013437.gif

3)在选中刚刚添加的“EJB”前提下,用鼠标右键单击左下方的空白区域,在弹出菜单中选择Add Doclet选项

CSDN_Dev_Image_2003-6-2722013439.gif

在弹出菜单中选择ejbdoclet,点击OK。

CSDN_Dev_Image_2003-6-2722013441.jpg

ejbdoclet中的属性进行如下修改:

CSDN_Dev_Image_2003-6-2722013443.gif

 

4)选中ejbdoclet,点击鼠标右键,在弹出菜单中选择add,接着选择fileset。

CSDN_Dev_Image_2003-6-2722013445.gif

CSDN_Dev_Image_2003-6-2722013447.jpg

fileset的属性作如下修改

CSDN_Dev_Image_2003-6-2722013449.gif

 

5)以同样的方法添加deploymentdescriptor,将其属性作如下修改

CSDN_Dev_Image_2003-6-2722013451.gif

 

6)以同样的方法添加jboss,将其属性作如下修改:

CSDN_Dev_Image_2003-6-2722013453.gif

CSDN_Dev_Image_2003-6-2722013455.gif

 

6)以同样的方法添加packageSubstitution,将其属性作如下修改:

CSDN_Dev_Image_2003-6-2722013457.gif

这里的packages属性为将被替换的包的名称,而substituteWith为替换后的名称。例如,edu.njut.resultmanager.ejb将被替换为edu.njut.resultmanager.interfaces,

也就是说XDcolet根据edu.njut.resultmanager.ejb中的类文件所含有的标签生成的相关类文件将存放在edu.njut.resultmanager.interfaces下。

7)以同样的方法添加homeinterface、remoteinterface、localhomeinterfaces、localinterface,全部添加完成后点击OK按钮推出,全部任务结构如下图所示:

CSDN_Dev_Image_2003-6-2722013459.gif

 

8)在工程上单击鼠标右键,在弹出的菜单中选择Run XDoclet即可自动生成部署描述符以及相应文件类文件。

CSDN_Dev_Image_2003-6-2722013461.gif

执行后控制台出现如下内容:

CSDN_Dev_Image_2003-6-2722013463.jpg

此时工程目录结构如下所示:

CSDN_Dev_Image_2003-6-2722013465.gif

 

三. 测试篇

在测试别写之前我们需要做一些工作,首先将JUnitJUnitEJB从网上下载后,我们用winrar等可以解开zip压缩文件的工具打开junitejb.jar文件,我们发现其中的META-INF文件夹已经包含了EJB部署描述符和JBoss容器部署描述符,这表示我们可以将其直接部署进JBoss。

CSDN_Dev_Image_2003-6-2722013467.gif

但在部署之前,我们需要将junit.jar中junit包下的所有子包加入进junitejb.jar文件中,具体操作可以用压缩软件直接完成,或者使用jar命名。加入完成后junitejb.jar内部文件结构如下图:

CSDN_Dev_Image_2003-6-2722013469.gif

其次将修改完成的junitejb.jar文件拷贝至JBoss目录下的server/default/deploy目录中。

最后我们需要将junit.jar和junitejb.jar文件加入到工程的classpath中,具体操作参考前文,加入完成后工程的Libraries如图所示:

CSDN_Dev_Image_2003-6-2722013471.gif

2.       测试文件的编写:点击New按钮àJUnitàTestCase

CSDN_Dev_Image_2003-6-2722013473.jpg

选择后点击Next按钮,在弹出窗口中作如下填写:

CSDN_Dev_Image_2003-6-2722013475.jpg

这里需要注意的是TestCMP的父类不是原来默认的junit.framework.TestCase而是net.sourceforge.junitejb.EJBTestCase(此前确保junit.jar和junitejb.jar文件已加入到工程classpath中)。完成后点击Finish按钮文件的建立,关于TestCMP的代码可以在随文档的源代码文件中找到。

 

四.部署篇

1.  设置JBoss服务器调试:点击工具条上的CSDN_Dev_Image_2003-6-2722013477.gif旁的向下箭头,在弹出菜单中选择Debug…

CSDN_Dev_Image_2003-6-2722013479.gif

在弹出的对话框中选择JBoss 3.0.x,然后点击最下方的New按钮

CSDN_Dev_Image_2003-6-2722013481.gif

在左边出现的对话框中的JBoss 3.x Home Directory中选择JBoss的安装目录:

CSDN_Dev_Image_2003-6-2722013483.jpg

完成后点击DEBUG按钮即可对启动JBoss服务器。当服务器运行时我们可以点击控制台中的STOP按钮停止服务器的运行。

CSDN_Dev_Image_2003-6-2722013485.jpg

注意,在启动数据库服务器前,请确保MySQL服务器已经启动,且含有名为resultmanager的数据库,同时存在与您在前面数据源设置的相同的用户名和密码具有该数据库的操作权限。

2.  将Bean文件打包为jar文件:用鼠标右键点击工程中的src文件夹,在弹出菜单中选择Export选项,如图:

CSDN_Dev_Image_2003-6-2722013487.gif

在弹出的对话框中选择JAR file,点击Next,在接下来弹出的对话框中的JAR file:中填上欲存放jar文件的路径,完成后点击Finsh。

CSDN_Dev_Image_2003-6-2722013489.jpg

3.  部署:将导出的jar文件拷贝至JBoss目录下的server/default/deploy目录下(确保此时JBoss服务器处于运行状态),此时察看控制台,会有如下信息,说明部署成功。

CSDN_Dev_Image_2003-6-2722013491.jpg

4.  测试:先选中工程中的TestCMP.java文件,接着选择工具条上的CSDN_Dev_Image_2003-6-2722013493.jpg旁边的向下箭头,在弹出的右侧菜单中选择Run AsàJUnit Test开始运行测试。

CSDN_Dev_Image_2003-6-2722013495.gif

测试完成后查看测试结果,如下图所示表示测试成功。

CSDN_Dev_Image_2003-6-2722013497.gif

 

五. 结束

至此我们利用Eclipse成功的开发了CMP应用,但是其中的步骤繁琐严重影响着开发效率,并且容易产生错误,这样有利有弊。利在与程序员在繁琐的操作中加深对EJB的理解,了解许多快速开发J2EE工具隐藏的东西;弊则是刚刚提到的严重影响开发效率,并且随着工程量的扩大,维护代价也不断上升。文章中源代码下载

 

关于作者:

蔡永航,南京工业大学工商管理三年级学生,Mars Studio( http://online.njut.edu.cn/mars )成员,中华联盟( http://www.robochina.org )成员业余时间酷爱Java编程。联系方式:iamcyhasp@sohu.com 。

 

Android基础入门教程——1.2.1 使用Eclipse + ADT + SDK开发Android APP

Android基础入门教程——1.2.1 使用Eclipse + ADT + SDK开发Android APP标签(空格分隔): Android基础入门教程1.前言 这里我们有两条路可以选,直接使...
  • zpj779878443
  • zpj779878443
  • 2015年07月18日 22:29
  • 12018

Eclipse开发Web项目入门篇

前言:以前一直使用myeclipse 8 开发web,今天特意使用eclipse,所以在这小记一下,一来有需要的可以参考下,二来随手做个笔记备用 1. 开发环境的搭建 1.1. 开发工具 JDK:jd...
  • ldw4033
  • ldw4033
  • 2014年01月15日 16:27
  • 8134

使用Eclipse新建phonegap程序,并打包

1.新建一个Android工程 2.解压Phonegap包,找到里面的找到Android目录,会发现有如下文件 phonegap-1.0.0.jar   phonegap-1.0.0.js   x...
  • l863784757
  • l863784757
  • 2014年07月17日 17:30
  • 2673

eclipse插件开发以及打包使用

一、摘要 主要是把现有的java项目打包成eclipse插件,方便使用。 二、java项目打包 有两种打包,1是可以把整个项目包括所依赖的lib打成一个jar文件,2是只是src相关文件打包(这种方式...
  • u010727953
  • u010727953
  • 2017年05月16日 15:54
  • 155

怎样使用Eclipse 来开发JAVA程序

1.首先打开eclipse 2.点击File,你会发现一个New的选项,把鼠标挪到那块,会显示出很多东西 3.点击Java Project,然后会要求你输入这个项目的名字,随便起一个就好了,然后点...
  • qq_32866009
  • qq_32866009
  • 2016年08月25日 21:11
  • 201

微信公众号开发之使用eclipse创建微信web工程并发布到BAE测试

本篇博文主要是讲一下在eclipse上创建一个微信web工程并发布到BAE上,其中会讲一些应该注意的问题 1.切入正题,为了减少麻烦,我使用百度提供的一键安装版的Eclipse,下载地址:http:...
  • u013310075
  • u013310075
  • 2014年04月25日 18:01
  • 4254

如何使用eclipse开发android

本文示例代码下载地址: http://www.ibm.com/developerworks/cn/education/opensource/os-eclipse-android/download...
  • shuimanting520
  • shuimanting520
  • 2016年05月18日 07:15
  • 899

Android开发之使用Eclipse开发工具实现Android平台JNI的开发

Android开发之使用Eclipse开发工具实现Android平台JNI的开发           最近公司做项目,需要在Android平台上做一个视频解码播放的App,我细细琢磨,解码必然是要...
  • FlyingSnow2211
  • FlyingSnow2211
  • 2016年05月26日 16:50
  • 1467

Eclipse应用程序项目的打包与发行

当项目完成后接下来的就是打包发行了,应用程序(Application)项目和Eclipse插件项目(plugin)的打包是不同的,本章将分别介绍两者的打包方法,并给出实际的打包例子。7.1  应用程序...
  • qiqijava
  • qiqijava
  • 2005年02月04日 09:22
  • 2149

玩转Eclipse开发工具(一)

由于之前学习JavaSE,大部分时间我所使用的编辑器是Windows操作系统自带的记事本及从网上下载的 Notepad++编辑器,然后使用命令行工具编译和运行的,因此对Java的Eclipse开发工...
  • erlian1992
  • erlian1992
  • 2016年06月22日 11:04
  • 4202
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Eclipse开发CMP2.0
举报原因:
原因补充:

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