天地不仁,以万物为刍狗!

EJB 的学习

上一篇 / 下一篇  2007-06-19 00:00:00 / 个人分类:java

EJB是什么呢?
l#wuz{Nb t1RqUK0EJB是一个J2EE体系中的组件.再简单的说它是一个能够远程调用的javaBean.
:Vr'i]T~?s0它同普通的javaBean有两点不同.ITPUB个人空间0[D7})~8H:b
第一点,就是远程调用.
EyK(CT8T1zM Z\B0第二点,就是事务的功能,我们在EJB中声明的事务会通过容器帮助我们来处理.
nV*bu IT`0支持EJB的SERVER有以下几个:ITPUB个人空间*n Vo*]q_tGCf9y
Weblogic
3f?&K$v }Z d0Webspere
ICzy[%s0Appserver
pk}Bk4g'}0Jboss

我选用的是weblogic+JBuilder9开发.

回过来我们继续说这个EJB的原理.
:N"kv&r Y#af0它是分布式的.这个的意思其实很简单不需要想太复杂.ITPUB个人空间6~)tE-c)B*K
就是我们把事情不是交给一个人去处理.而是把事情划分一下交给多个人处理,
[o4?:K7n(V {0而多个人处理之后我们让这个分配的人来把最后得到的结合处理.

EJB我们首先要明确它是放在服务器端的组件.ITPUB个人空间L+~!oeQ'M Zx
一共有三种EJB
n3j8Wf#c0D2l01,SessionBean 复杂处理业务逻辑的.
&]'PM/QFjd02,EntityBean 处理数据ITPUB个人空间 XQ[WS$V
3,MessageBean 消息Bean异步,耦合的处理.

那么谁能调用EJB呢?
+` J(k"I;Q-a0也或者说EJB被谁调用呢?
)` M O]u;m,|)G&O0我们说它就是放在server的一个能够远程调用的javaBean.
,N&YU}R@.F5d0B-G0所以它可以被Java的语言调用servlet,jsp等都ok的说.ITPUB个人空间 itB-?[5A@d,J|.[
而且它还可以被C++语言调用.很强大吧.ITPUB个人空间!Z `5b7n"e$s\BbU
EJB的最基本的出发点就是推动Java在服务器端的编程能力.ITPUB个人空间#g0O/@.he yh
所以呢它的功能就我个人来看太强悍了..= =

这个远程调用是通过什么呢.
3_[-X bFI#C(u+E0Java是通过RMI-JRMP(java远程方法调用)协议来调用.EJB就是通过这个来实现的.ITPUB个人空间d\/d|)N~F1n
C++是通过Corba-iiop协议来调用的.这个协议支持两端不同语言的调用.
EidVm0Corba是公共对象请求代理服务
P,P S x)R9Av?#Q0iiop是网络内部对象协议.

下面我们来简单说一下这个分布式的调用。ITPUB个人空间-FA0M9CY{ m
客户端发送一个请求给服务器ITPUB个人空间/@/B/m0A L
首先是传给stub代理类它发送参数给skeleton委托类然后这个类调用我们的实现类取得结果再远路返回。ITPUB个人空间qqO1Y^ A Qe
这样一个分布处理就结束了。ITPUB个人空间h^5y(rv/Sv9W3o
后面会具体的结合代码分析。
j(B!g B,AC8i1ch0先记住这个大致的结构就好。

我们写一个EJB需要做那些工作呢?ITPUB个人空间O.u.H)dg]?$Y%@
1,写一个接口继承EJBObject 这个类作为远程接口ITPUB个人空间sY5S.FJPt\'d
2,写一个接口继承EJBHome 这个类里有一个方法是create()它返回接口类型。ITPUB个人空间:{p3k4uRTF4vc
3,写一个Bean继承SessionBean, 这个类里包含一个create()方法和一个业务方法。
r~g ?*T#r(B04,写一个ejb-jar.xml 这个xml是把上面的三个文件组合起来ITPUB个人空间"Y4cl)`/hSo0~/ew
5,写一个weblogic-ejb-jar.xml 这个xml是连接查找source的作用
d;Ht0s+xC"_2A0 (不同的server会是不同的。这里选用的是weblogic)

上面的两个xml文件需要放在META-INF目录下。
$W c8h4s zUw0而以上这些类都需要打包在一个jar文件中然后在server部署。ITPUB个人空间_iU K.g"ke
这样就完成了EJB的部署
7XH`Dj"xF1s/y\J0例如:
^4P:QUE:C,L:d0我们写个简单的计算吧。ITPUB个人空间"k;WD.C(~$[FV
(先声明下吧本教程的说明都是我自己的理解,ITPUB个人空间|+J&g o'd5E5t1M
也许并不是一些文档上的描述那么正规但是很方便理解的。ITPUB个人空间*p2oAWL
如果有实在无法苟同的地方大家多多包含。这是为了便于理解的讲解)
9Ym5k3Dq0AddCount.java这个就是我们继承EJBObject的类.

import javax.ejb.*;
usR? NO4wsI0import java.rmi.*;

public interface AddCount extends EJBObjectITPUB个人空间&t/Du+ma-FmT.aF
{
VMm(F#C}L-[0 public int addCount(int a,int b) throws RemoteException;ITPUB个人空间CF S QBS#d'JoJ w @
}
6DV~+kts]W0接口的作用.在这里强调一下吧.所有实现这个接口的类都会是这个接口的类型.
)wKy/N2N!ry0同时都包含接口的方法的实现.ITPUB个人空间5|#Bb%BL]
这个接口中的方法也就是在以后会实现的方法.我们这里要做的是一个加法的运算.


3c%eI7i3Ciuu0AddCountHome.java这个是继承EJBHome的类.它里面包含的这个create()返回的是AddCount类型对象.


s$s]Fl-w*x5E0import javax.ejb.*;ITPUB个人空间Gl6Ix-C2NM
import java.rmi.*;

public interface AddCountHome extends EJBHomeITPUB个人空间v'_Y(B0{:k.E5|r
{ITPUB个人空间Y M C k e g.Y bhR:P
public AddCount create() throws RemoteException,CreateException;ITPUB个人空间Ajih5gX[6e
}

下面这个是我们的Bean.这个类继承了SessionBeanITPUB个人空间B D%[r;s/jB!g i
import javax.ejb.*;

public class AddCountBean implements SessionBean
,@*MA-cT Z1}H0{ITPUB个人空间8I'ud^V?2kD
public void ejbCreate()
%q;F7Dp4t&FU0 {ITPUB个人空间.Zc0\"H Yz_)do
}ITPUB个人空间 QQ3|3Fx!]T*NU!m*r
public void setSessionContext(SessionContext ctx)
x/_l!r s V0 throws EJBException,ITPUB个人空间*zX3]i!k5M
java.rmi.RemoteExceptionITPUB个人空间 G%y.I2TA
{ITPUB个人空间8Dl,r}i0Lp%b
}
Kl$K@8z"EV3E5{0 public void ejbRemove()
3?0w6ru'wI'`0 throws EJBException,ITPUB个人空间` b*b3ip2u'{%z
java.rmi.RemoteExceptionITPUB个人空间E"]o8dn4Sn)H|!C
{
M8F4RkZW0 }

public void ejbActivate()
(u R_(s8H?{0 throws EJBException,ITPUB个人空间wBSBr{Rd
java.rmi.RemoteException
B%?8z3} t8Jz0 {
3X Qy,yO)g n0 }ITPUB个人空间!t g$}&} EW
public void ejbPassivate()
J r8z/C(mG0 throws EJBException,ITPUB个人空间3^H6DM@7~G#{
java.rmi.RemoteException
'w(L&gX3K|3x y1y0 {ITPUB个人空间 H&U"JR vg"g6D$i
}
H L$Rp&sHV8t0 public int addCount(double a,double b)ITPUB个人空间 H5hyH%V@e
{
bJW2d:^+`q:A#~J0 return a+b;
6U*lW3a Ce,dN(rH%{r0 }
tO,]{!a5C/s;}-C0}ITPUB个人空间-|l wu2sA~5[
这个里面我们实现了业务的方法addCount(){a+b;}ITPUB个人空间-{2N)U!^g-sN1Y]
同时需要指出一下它的其他方法(这些仅仅简单指出后面的教程有详细说明)ITPUB个人空间?eC$z `(l ?[
首先是ejbCreate()这个方法实际上是对我们的远程接口的实现类的初始化.ITPUB个人空间fPsY(E
setSessionContext(SessionContext ctx)设置context.容器是在这个方法之后产生的实例.ITPUB个人空间4~#E5^2B%c-P+~\
ejbRemove()毫无疑问是一个实例结束移除.
8i%m~3T4@e0ejbActivate()激活方法.它的作用是激活钝化.
"X9{"~%W#imxu0ejbPassivate()钝化方法.当实例的内容长时间不进行处理的时候就会钝化.也就是闲置的意思.
+J r0P-d a gAys;X T,f&]0以上这几个是SessionBean的基本方法.希望大家可以自己慢慢理解.ITPUB个人空间IN,rX1G,m4xv
之后也会反复说到这些的.

ITPUB个人空间7j]2C XfRP&i'?
下面我们写xml文件
8ay3s7D%G,LkS0首先是ejb-jar.xmlITPUB个人空间-b+`7z3n4~dO
<?xml version="1.0" encoding="UTF-8"?>
%_]A Jp$z ZH0<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">ITPUB个人空间1m6D0l{(f!y1]
<ejb-jar>ITPUB个人空间"I6K)Qb mgGt
<enterprise-beans>ITPUB个人空间"Nx.dn6x?o
<session>
/O1K E/qW*k*`7a#u4P^^0 <display-name>first</display-name>
2}*d0Q:n(Vh X7t0 <ejb-name>add</ejb-name>

<home>AddCountHome</home>ITPUB个人空间Qhh-F9B \
<remote>AddCount</remote>
j.`,d5y6|$?l0 <ejb-class>AddCountBean</ejb-class>

<session-type>Stateless</session-type>
5~`4L&b7o0 <transaction-type>Container</transaction-type> ITPUB个人空间 n9CMD&iwL2S
</session>
d Pb!Y8]6?c*l0 </enterprise-beans>
0G\t ruZa7c!Y0 <assembly-descriptor>
m/v4U Q#bLq0 <container-transaction>ITPUB个人空间4?^$HQ,J%\$u d
<method>
[w T&s#Q\/U0 <ejb-name>add</ejb-name>ITPUB个人空间 yY u.e3w6|F
<method-name>*</method-name>ITPUB个人空间w%xZb w
</method>ITPUB个人空间;R |a-p JI
<trans-attribute>Required</trans-attribute>
3r!]x4JF0 </container-transaction>
$l'Xt}j3~6UfK0
6wZT(?(]'e e0 </assembly-descriptor>
4} x}*~ U? I-q.E\0</ejb-jar>

下面这个是weblogic-ejb-jar.xml
-@uF} bF8y J%x:_0<?xml version="1.0" encoding="UTF-8"?>
;]#f^%a$c])_9|0<!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN' 'http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd'>ITPUB个人空间K?.d}}{
<weblogic-ejb-jar>ITPUB个人空间|_S Cc u
<weblogic-enterprise-bean>ITPUB个人空间'D$uG2]/Z`| }
<ejb-name>
qm*O3L9lF0 add ITPUB个人空间3qlA5o7a0S:Qy
</ejb-name>ITPUB个人空间.mS] f%iFc

$`z\EB2v!Fg0 <jndi-name>rainnight</jndi-name>

</weblogic-enterprise-bean>ITPUB个人空间3B.wdM {W
</weblogic-ejb-jar>


w4u2a/B?B d0我们接下来写测试类

import java.util.*;
I]PO5c:tr0import java.naming.*;
B"{1AAT EM*t0import java.rim.*;ITPUB个人空间(NToO?'F"^h%z
public class AddTest{
8A'M4xd)GJw0 public static void main(String bb[])throws Exception{ITPUB个人空间,~(m+U|[9P
Hashtable hash = new Hashtable();ITPUB个人空间8j a.@Z#m N
hash.put(Context.INITIAL_COUNTEXT_FACTORY,ITPUB个人空间8Ts"NJf3m(D3[
"weblogic.jndi.WLInitialContextFactory");ITPUB个人空间Z"LQ y,eM%J
hash.put(Context.PROVIDER_URL,ITPUB个人空间 u4AK0wpKWDl
"t3://localhost:7001");
qp v4OlE0 Object obj = context.lookup("rainnight");
q+R"X|3h4A0p0 AddCountHome home = (AddCountHome)PortableRemoteObject(obj,AddCountHome.class);ITPUB个人空间p5bI5p9x:X!My1XMN
AddCount local = home.create();
W2D4D+Al0 System.out.println(local.add(1,1));ITPUB个人空间W^${ Vo
}ITPUB个人空间^2a M_!?h:m(d*M*i
}

测试类的hash是初始化我们的weblogic的xml信息.
\.u5uem:`:BY+n0这里的t3://localhost:7001是weblogic的特殊协议指向的是ip位置.
+h7c r#e6Y4a8M0然后lookup("rainnight")查找jndi,而实际上也就是通过这个jndi找到我们的ejb组件.
9zRl~'Cr9W*u |0通过得到的对象我们对比一下是不是Home类型.ITPUB个人空间4a1GL!hw}!V'~;k1I d{
然后我们执行home.create()产生AddCount的实例
_k,VE KE7NQ3xH0最后调用方法就ok了.


vA ZJ*tHR0下面是如何执行这个的方法.
8f@H+] wv#?0第一步,jdk,weblogic.需要快些下载安装啦..ITPUB个人空间(Rb*x d(D
第二步,配置环境变量.基本的java的环境变量如何配置我就不说了.ITPUB个人空间;P[/b7}kJ|]MV.G
这里需要特别指出要把java目录下的lib中的tools.jar加载到我们的class_path中.
IQ#s!LW"k0 然后我们再把weblogic的目录下的server目录下的lib中的weblogic.jar找到也加载进来.ITPUB个人空间d6V9f;uQ,{zO
这样我们编译需要的东西就ok了.ITPUB个人空间3c[%qf7er(Gx
第三步,编译java类.
]0u:E6|lM$\4L_0第四步,打包.jar cvf AddCount.jar *.class META-INF/*.xmlITPUB个人空间Uu_VBX$lxN
第五步,java weblogic.appc AddCount.jar
0a j*?/d]7{'rY0第六步,部署到weblogic中.
Yx H$L7TE0第七步,运行Test类.


s/\&`\Y XZ A)R0

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-11-24  
      1
2345678
9101112131415
16171819202122
23242526272829
30      

数据统计

  • 访问量: 12228
  • 日志数: 273
  • 图片数: 1
  • 文件数: 2
  • 建立时间: 2007-12-01
  • 更新时间: 2008-11-19

RSS订阅

Open Toolbar