WEB开发网
开发学院WEB开发Jsp 使用Eclipse开发CMP 阅读

使用Eclipse开发CMP

 2008-01-05 18:47:20 来源:WEB开发网   
核心提示:内容摘要:Eclipse作为目前成功的开源IDE之一受众多java开发人员的喜爱,但是其内部并不直接支持EJB的开发一直为广大开发人员所诟病,使用Eclipse开发CMP,并且大大增加了EJB初学者使用Eclipse开发EJB的难度;JBoss作为目前最为成功的EJB容器,由于文档的缺乏,用鼠标右键单击左下方的空白区域

内容摘要:

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

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

假如操作正确,将出现“确认文件夹替换窗口”,点击“全部”即可。等到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目录中的文件如下图所示:

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

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

二:开发篇

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

数据库建立脚本如下:

#

# 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…,出现对话框,如图所示:

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

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

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

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

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

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

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

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

(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快速完成标签的编写了。修改完成后如下图所示:

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

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

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

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

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

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

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

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

Tags:使用 Eclipse 开发

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接