查看全文
查看全文
ZT
大跃进时代,菜鸟也能玩转EJB
曾在一个论坛上看到一个帖子“国内有些程序员拿着吓人的工资,使用吓人的技术,做着吓人的项目--得出的结果也很吓人!”。对于J2EE开发而言,所谓的吓人的技术指的就是EJB。学会EJB就可以拿着吓人的工资,你是否也动心了呢?
EJB包括实体Bean、会话Bean、消息驱动Bean。实体Bean现在被称为ORM(对象关系映射),是对象关系映射。会话Bean一般对应系统的一个功能模块,分为有状态Bean和无状态Bean两种;有状态bean是指在bean不同的调用方法中能保存bean状态,无状态bean不保存状态。现在一般非常建议使用无状态Bean,因为这样效率最高。
EJB的学习成本非常高,高得足以把很多人吓跑。所以会EJB的人可以拿吓人的工资,但随着Hibernate等轻量级的ORM技术的流行、Spring等轻量级的容器的兴起,这些情况正在悄悄的发生改变。特别是Spring的缔造者对EJB发表了猛烈的抨击后,EJB专家组终于被逼疯,于是吸取了Hibernate和Spring思想,制定了EJB3的规范。
如果你学过Hibernate,或懂得ORM,EntityBean就不难看懂;假如有XDoclet的基础,学EJB3真是小菜一碟。如果你是一个初学者也没关系,EJB3好简单,只要把开发环境搭建起来,你就可以进入EJB的殿堂里徜徉,欣赏其优美的ORM,慢慢地掉入沉思,也会有所悟。
环境搭建(Eclipse3.1M4+JBoss4)
1.下载并安装JDK5.0:http://java.sun.com.自己找并安装。(我安装在:C:Java)。
2.下载Eclipse3.1M4: [url]
http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/S-3.1M4-200412162000/eclipse-SDK-3.1M4-win32.zip&url=ftp://gd.tuwien.ac.at/softeng/eclipse/S-3.1M4-200412162000/eclipse-SDK-3.1M4-win32.zip&mirror_id=7[/url]
。安装完JDK,Eclipse下载完解压缩就能用了。(我的是E:Eclipse)
3.下载JBoss4:http://optusnet.dl.sourceforge.net/sourceforge/jboss/jboss-4.0.0.zip。下载完解压缩就能用。(我安装在:d:JBoss4)
4.下载JBoss的EJB3插件:http://belnet.dl.sourceforge.net/sourceforge/jboss/jboss-EJB-3.0_Preview_2.zip。安装该插件的方法请参考:http://docs.jboss.org/ejb3/tutorial/installing.html。安装很简单的,把jboss-EJB-3.0_Preview_2.zip解压后,把lib下面的所有东西拷贝到{JBoss_Home}serveralldeploy下面就OK了。(我的是:D:JBoss4serveralldeploy)。
5.设置环境变量:JAVA_HOME和JBOSS_HOME。我的是:JAVA_HOME=C:Javajdk1.5.0和JBOSS_HOME=D:JBoss4
6.启动JBoss,从命令行运行:d:JBoss4binrun.bat -c all
7.打开Eclipse,新建一个project(我建的是ejb_test),如果你看到工程下面的JRE System Library有jre1.5的字样,那就恭喜你,你的Eclipse能认出JDK5了。如果看不到,您还得按右键configure。
8.在你的工程下新建一个名为lib的目录,找到开发EJB所需要的jar,分别是:D:JBoss4lib的所有jar;D:JBoss4serveralllib的所有jar;D:JBoss4serveralldeployejb3.deployer的所有jar;把D:JBoss4serveralldeployjboss-aop.deployer这个文件用WinRAR打开解压后得的所有jar。把这些jar拷贝到新建的lib目录。
9.为了享受Eclipse自动编译的好处,你还需要把Eclipse编译java生成的class存放在如下指定的目录:在你的工程下创建一个名为build的目录,在该目录下创建名为classes的目录,然后右键选中你的工程,选中properties,把Default Output folder设置为:你的工程名字/build/classes
10.把我贴出来的ejb_test.rar解压,把所有的东东拷贝覆盖到你的工程,再刷新Eclipse。
11.环境配置完毕,为了照顾很多不会的人,配置是烦了点--高手看了我写的东西肯定会笑死的^_^。
开发模板
EJB2下的开发我没经历过,只是看过几个EJB的Demo,我这里所贴出来的开发模板是我仿照我在Spring+Hibernate+XDoclet下的开发方法做的(对错否望指正)。
我贴出来的开发模板可以将其划分成三层:ORM层、Dao层、Service层。
ORM层是为对象关系映射层,是EntityBean的定义,和Hibernate差不了哪去,就是把XDoclet改成Annotation而已。
Dao层是Data Access Object层,Dao是对单个表(或Entity)的增删查改,按照惯例,使用了接口。
Service层是通过调用Dao层来对多个表(或Entity)的的负责操作。这一层我是从Spring+Hibernate移植过来的,感觉有好多问题--总觉得通过调用Dao层这种方法的远程调用代价太高,而且怎样给SessionBean配置另一个SessionBean的实例我还没配置成功。
运行方法
1.先启动JBoss4,JBoss4的配置采用默认的设置.
2.本工程要用到junit,如果没有junit的包,你的工程出现了红色的错误提示信息。出现该错误信息时,把鼠标放在错误信息的那一行,按CTRL+1,eclipse会提示你把junit的包import进来的。保证无语法错误后,就可以运行junit测试了。
3.运行工程下的ant脚本build.xml:右键点击该文件->Run As->Ant Build。这样会打包和部署ejb到jboss服务器。
4.运行junit测试套件org.ggyy.test.AllTests.java,(右键->Run As->Junit Test),如果能看到绿线,就恭喜你,测试通过。
调试EJB
不知道是我的孤陋寡闻,还是IDE技术本身的落后,我以前好像记得EJB无法调试的,也就是无法一步一步的调试跟踪,这是EJB饱受批评的地方。
今天我到JBoss的网站看一下,JBoss IDE 出来新版本(测试版),能够Debug EJB3.0!
JBoss IDE 的下载地址是:http://voxel.dl.sourceforge.net/sourceforge/jboss/JBossIDE-1.5-Preview-jre1.5-ALL.zip
下载后,解压,从Eclipse的Help->SoftWare Updates->Find and Update->Search New Features to install->New Local Site,然后选择刚才解压的目录进行安装,一直Next下去就OK了。[/url]
调试方法
我们使用Junit测试时,所能调试的都是远程的Bean,而远程Bean在部署的服务器的。为此,我们需要在Eclipse里面启动JBoss服务器。先把JBoss IDE面板显示出来:Windows->Show View->other..->JBoss IDE->Server Navigator。
在JBoss IDE 面板右键->Configuration->JBoss4.0.x,按右键->New,选择JBoss安装路径,进行其它设置就OK。
由于我们调试的都是远程程序,而我们编写的EJB的实现是经过服务器的所谓代理的,所以在Junit外面是无法单步跟踪到我们编写的EJB的实现的(这点和被Spring 拦截代理相似),所以我们必须在自己写的Bean的实现中设置断点才能调试我们的EJB。
简单看了一下 在 lomboz插件的目录下 加入 这个文件
保存为 jboss400.server
<serverDefinition
name="JBOSS 4.0.0"
ejbModules="true"
webModules="true"
earModules="true">
<property id="serverRootDirectory"
label="Application Server Directory:"
type="directory"
default="C:/java/jboss-4.0.0" />
<property id="serverAddress"
label="Address:"
type="string"
default="127.0.0.1" />
<property id="serverPort"
label="Port:"
type="string"
default="8080" />
<property id="serverConfig"
label="Server Configuration (default/standard/all):"
type="string"
default="standard" />
<property id="classPathVariableName"
label="Classpath Variable Name:"
type="string"
default="JBOSS400" />
<property id="classPath"
label="Classpath Variable:"
type="directory"
default="C:/java/jboss-4.0.0" />
<serverHome>${serverRootDirectory}</serverHome>
<webModulesDeployDirectory>${serverRootDirectory}/server/${serverConfig}/deploy</webModulesDeployDirectory>
<ejbModulesDeployDirectory>${serverRootDirectory}/server/${serverConfig}/deploy</ejbModulesDeployDirectory>
<earModulesDeployDirectory>${serverRootDirectory}/server/${serverConfig}/deploy</earModulesDeployDirectory>
<jndiInitialContextFactory>org.jnp.interfaces.NamingContextFactory</jndiInitialContextFactory>
<jndiProviderUrl>jnp://${serverAddress}:1099</jndiProviderUrl>
<startClass>org.jboss.Main</startClass>
<startWorkingDirectory>${serverRootDirectory}/bin</startWorkingDirectory>
<startVmParameters></startVmParameters>
<startProgramArguments>-c ${serverConfig}</startProgramArguments>
<stopClass>org.jboss.Shutdown</stopClass>
<stopWorkingDirectory>${serverRootDirectory}/bin</stopWorkingDirectory>
<stopVmParameters></stopVmParameters>
<stopProgramArguments>-S</stopProgramArguments>
<serverClassPath>
<jar type="variable">JDK_TOOLS</jar>
<jar type="variable">${classPathVariableName}/bin/run.jar</jar>
<jar type="variable">${classPathVariableName}/bin/shutdown.jar</jar>
<jar type="variable">${classPathVariableName}/client/jboss-j2ee.jar</jar>
<jar type="variable">${classPathVariableName}/lib/jboss-common.jar</jar>
<jar type="variable">${classPathVariableName}/lib/namespace.jar</jar>
<jar type="variable">${classPathVariableName}/lib/commons-httpclient.jar</jar>
<jar type="variable">${classPathVariableName}/lib/commons-logging.jar</jar>
<jar type="variable">${classPathVariableName}/lib/webdavlib.jar</jar>
<jar type="variable">${classPathVariableName}/lib/concurrent.jar</jar>
<jar type="variable">${classPathVariableName}/lib/dom4j.jar</jar>
<jar type="variable">${classPathVariableName}/lib/jboss-jmx.jar</jar>
<jar type="variable">${classPathVariableName}/lib/getopt.jar</jar>
<jar type="variable">${classPathVariableName}/lib/gnu-regexp.jar</jar>
<jar type="variable">${classPathVariableName}/lib/jboss-system.jar</jar>
<jar type="variable">${classPathVariableName}/lib/log4j-boot.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/activation.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/bcel.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/bsh-deployer.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/cglib-full-2.0.1.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/hibernate2.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/hsqldb.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/hsqldb-plugin.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/javax.servlet.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/javax.servlet.jsp.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jboss.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jboss-common-jdbc-wrapper.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jboss-hibernate.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jboss-j2ee.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jboss-jaxrpc.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jboss-jca.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jboss-jsr77.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jboss-management.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jboss-monitoring.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jbossmq.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jboss-saaj.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jbosssx.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jboss-transaction.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jmx-adaptor-plugin.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jnpserver.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jpl-pattern.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jpl-util.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/log4j.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/mail.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/mail-plugin.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/odmg-3.0.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/properties-plugin.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/scheduler-plugin.jar</jar>
<jar type="variable">${classPathVariableName}/client/wsdl4j.jar</jar>
</serverClassPath>
<clientClassPath>
<jar type="variable">${classPathVariableName}/client/avalon-framework.jar</jar>
<jar type="variable">${classPathVariableName}/client/axis-ws4ee.jar</jar>
<jar type="variable">${classPathVariableName}/client/commons-discovery.jar</jar>
<jar type="variable">${classPathVariableName}/client/commons-logging.jar</jar>
<jar type="variable">${classPathVariableName}/client/concurrent.jar</jar>
<jar type="variable">${classPathVariableName}/client/getopt.jar</jar>
<jar type="variable">${classPathVariableName}/client/jacorb.jar</jar>
<jar type="variable">${classPathVariableName}/client/jaxr-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jbossall-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jboss-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jboss-common-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jbosscx-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jboss-deployment.jar</jar>
<jar type="variable">${classPathVariableName}/client/jbossha-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jboss-iiop-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jboss-j2ee.jar</jar>
<jar type="variable">${classPathVariableName}/client/jboss-jaxrpc.jar</jar>
<jar type="variable">${classPathVariableName}/client/jbossjmx-ant.jar</jar>
<jar type="variable">${classPathVariableName}/client/jboss-jsr77-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jbossmq-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jboss-saaj.jar</jar>
<jar type="variable">${classPathVariableName}/client/jbosssx-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jboss-system-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jboss-transaction-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jboss-ws4ee-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jmx-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jmx-invoker-adaptor-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/jnp-client.jar</jar>
<jar type="variable">${classPathVariableName}/client/log4j.jar</jar>
<jar type="variable">${classPathVariableName}/client/logkit.jar</jar>
<jar type="variable">${classPathVariableName}/client/namespace.jar</jar>
<jar type="variable">${classPathVariableName}/client/wsdl4j.jar</jar>
</clientClassPath>
<projectClassPath>
<jar type="variable">JDK_TOOLS</jar>
<jar type="variable">${classPathVariableName}/bin/run.jar</jar>
<jar type="variable">${classPathVariableName}/bin/shutdown.jar</jar>
<jar type="variable">${classPathVariableName}/client/jboss-j2ee.jar</jar>
<jar type="variable">${classPathVariableName}/lib/concurrent.jar</jar>
<jar type="variable">${classPathVariableName}/lib/jboss-system.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/bcel.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jboss.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jboss-transaction.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jnpserver.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jpl-pattern.jar</jar>
<jar type="variable">${classPathVariableName}/server/${serverConfig}/lib/jpl-util.jar</jar>
</projectClassPath>
<adminTool>
<web><deploy /><undeploy />
</web>
<ejb><deploy /><undeploy />
</ejb>
<ear><deploy /><undeploy />
<webModule><deploy /><undeploy />
</webModule>
<ejbModule><deploy /><undeploy />
</ejbModule>
</ear>
</adminTool>
<adminToolPath>
</adminToolPath>
</serverDefinition>
然后lomboz的服务器选项里就会有 jboss400, 默认配置除了改 两个路径为 jboss的路径以外,还有把 standard改为 default. 当然也可以 把jbossserver目录下的 default目录复制为一个standard目录。(据 jboss的文档介绍,这里完全可以用自己的配置,不过我是不懂的啦)











