內容摘要:
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。
新聞熱點
疑難解答