posts - 63,comments - 71,trackbacks - 0
          隨著Java 5.0的發(fā)布,Java的一些新的語(yǔ)言特點(diǎn)也開(kāi)始被大家所關(guān)注,如Annotation、GenericType等。由于現(xiàn)在Java在企業(yè)級(jí)軟件應(yīng)用市場(chǎng)里面占據(jù)統(tǒng)治地位,所以新的語(yǔ)言特征對(duì)于原來(lái)的J2EE的也有一些非常大的變化。相對(duì)于原來(lái)的EJB2的一些批評(píng),如開(kāi)發(fā)速度緩慢,難以測(cè)試等,一些優(yōu)秀的公司也開(kāi)始利用Java語(yǔ)言的新特征來(lái)解決。其中Annotation對(duì)于Ejb的促進(jìn)作用還是比較顯著的。接觸過(guò)原來(lái)的EJB2開(kāi)發(fā)的人來(lái)說(shuō),對(duì)于那些復(fù)雜的Xml描述文件和復(fù)雜的類別關(guān)系相比都印象非常的深刻。
          ? 作為現(xiàn)在市場(chǎng)占有率最高的Java EE的應(yīng)用服務(wù)器JBoss,對(duì)于最新的EJB3提出了自己的實(shí)現(xiàn),試用了一下,感覺(jué)只有一個(gè)字:爽。同時(shí)JBoss還對(duì)于原來(lái)沒(méi)有提高EJB容器的 Web服務(wù)器,如Tomcat,還提供了自己的嵌入式的實(shí)現(xiàn),也就是說(shuō),Tomcat也可以用EJB了。看來(lái)自從JBoss轉(zhuǎn)業(yè)為一個(gè)商業(yè)公司以后,其技術(shù)水平也已經(jīng)成為一個(gè)世界級(jí)的Java開(kāi)發(fā)公司了。同時(shí)JBoss的EJB除了可以利用Annotation來(lái)實(shí)現(xiàn)EJB以外,還可以利用deloy- descriptor把一個(gè)普通的Bean來(lái)轉(zhuǎn)化為一個(gè)EJB,而不需要在源程序里面加入Annotation,這個(gè)功能還是比較厲害的。其利用Jacc 來(lái)改變你的class功能,自動(dòng)在部屬階段加入了Annotation來(lái)實(shí)現(xiàn)EJB3。到這里,不禁佩服Java現(xiàn)在的發(fā)展程度,可以有很多種方法來(lái)改變已經(jīng)編譯的class文件,如cgilib、jasssit,aspectJ、SpringAOP等,同時(shí)不禁想起那幾天研究的antlr(一個(gè)類似與 YACC的語(yǔ)言開(kāi)發(fā)工具),唉,看來(lái)國(guó)外對(duì)于Java的應(yīng)用真是太出神入化了。
          ?? 用JBoss來(lái)開(kāi)發(fā)EJB3,必須下載JBoss的EJB3開(kāi)發(fā)工具,把他加入到JBoss里面(最好是最新版本,現(xiàn)在(2006-2-7)是JBoss4.0.3SP1.
          (一)安裝步驟如下:
          ?? 1、下載JBoss-ejb-3.0
          ?? 2、解壓文件。
          ?? 3、拷貝lib目錄下面的xml文件和jboss-aop-jdk50.deployer目錄到j(luò)boss-4.0.x/server/all/deploy下面
          ?? 4、拷貝lib目錄下面的jboss-xb.jar到j(luò)boss-4.0.x/server/all/lib。
          ?? 5、刪除jboss-4.0.x/server/all/deploy下面的jboss-hibernate.deployer和jboss-aop.deployer目錄。
          ?? 6、用run.bat -c all來(lái)啟動(dòng)就可以了。
          ?? 由于JBoss良好的微內(nèi)核結(jié)構(gòu),所以對(duì)于EJB3的支持還是比較方便的。
          (二)實(shí)際開(kāi)發(fā)
          ?? 同原來(lái)的開(kāi)發(fā)Web程序一樣,把開(kāi)發(fā)完成的東西拷貝到j(luò)boss-4.0.x/server/all/deploy下面,是一個(gè)jar文件,不過(guò)后綴名必須是.ejb3,這樣
          JBoss會(huì)自動(dòng)發(fā)現(xiàn)并加載,如果沒(méi)有出現(xiàn)錯(cuò)誤提示,一般就是成功的。
          ?? 下面,開(kāi)發(fā)一個(gè)Stateless類型的EJB吧
          ?? 在所有的EJB3.0規(guī)范中定義的EJB,都不必實(shí)現(xiàn)Home接口。
          ?? 1、定義接口:
          ?? package com.gm.ejb3;
          ? import javax.ejb.Remote;
          ?
          ?? @Remote????
          ?? public interface ICounter
          ?? {
          ??? public int add(int i);
          ??? public int getNumber();
          ?? }
          ?? 注意@Remote這個(gè)Annotation,它表明這是一個(gè)遠(yuǎn)程接口,同意@Local表明是一個(gè)本地接口。
          ?? 2、定義實(shí)現(xiàn):
          ?? package com.gm.ejb3;
          ? import javax.ejb.Stateless;
          ?
          ?? @Stateless????
          ?? public class GCounter implements ICounter
          ?? {
          ?? ?private int num=0;
          ??? public int add(int i)
          ??? {
          ??? ?num+=i;
          ??? }
          ??? public int getNumber()
          ??? {
          ??? ?return num;
          ??? }
          ?? }
          ?? 3、Ant文件build.xml
          ?? ?<?xml version="1.0"?>
          ??<!-- ======================================================================
          ???? 2006-2-7 8:53:16???????????????????????????????????????????????????????

          ???? ejb3???
          ???? A JBoss ejb3
          ??????????????????
          ???? Administrator???????????????????????????????????????????????????????????????
          ???? ====================================================================== -->
          ??<project name="ejb3" default="ejbjar">
          ???? <description>
          ???????????? A JBoss ejb3
          ???? </description>
          ??? <property name="jboss.home" value="jboss目錄"/>
          ???<property name="src.dir" value="src"/>
          ???<property name="build.dir" value="build"/>
          ???<property name="build.class.dir" value="${build.dir}/classes"/>
          ??
          ???<path id="project.class.path">??
          ???? <fileset dir="${jboss.home}/lib">
          ?????????? <include name="**/*.jar"/>
          ??????? </fileset>
          ??
          ??????? <fileset dir="${jboss.home}/server/all/lib">
          ?????????? <include name="**/*.jar"/>
          ??????? </fileset>
          ??
          ??????? <fileset dir="${jboss.home}/server/all/deploy/ejb3.deployer">
          ?????????? <include name="*.jar"/>
          ??????? </fileset>
          ??
          ??????? <fileset dir="${jboss.home}/server/all/deploy/jboss-aop-jdk50.deployer">
          ?????????? <include name="*.jar"/>
          ??????? </fileset>
          ??
          ??????? <pathelement location="${build.class.dir}"/>
          ???</path>
          ??
          ??
          ????? <!-- =================================
          ??????????? target: init?????????????
          ?????????? ================================= -->
          ????? <target name="init" description="--> description">
          ????? ?<mkdir dir="${build.dir}"/>???
          ????? ?<mkdir dir="${build.class.dir}"/>
          ????? </target>
          ??
          ??
          ????? <!-- =================================
          ??????????? target: compile?????????????
          ?????????? ================================= -->
          ????? <target name="compile" depends="init" description="--> description">
          ????? ?<javac srcdir="${src.dir}"
          ?????????? destdir="${build.class.dir}"
          ?????????? debug="on">
          ????? ?<classpath refid="project.class.path"/>
          ????</javac>???
          ????? </target>
          ??
          ??
          ????? <!-- =================================
          ??????????? target: ejbjar?????????????
          ?????????? ================================= -->
          ????? <target name="ejbjar" depends="compile" description="--> A JBoss ejb3">
          ?????? ?<jar jarfile="${build.dir}/GCounter.ejb3">
          ?????<fileset dir="${build.class.dir}" id="allclass">
          ???????? <include name="**/**.class"/>
          ??????<exclude name="**/**Client.class"/>
          ?????</fileset>
          ?????? ??
          ?????? ?? <fileset dir=".">
          ?????????????? <include name="META-INF/*.xml"/>
          ??????????? </fileset>
          ?????? ?</jar>
          ????? ?<copy file="${build.dir}/GCounter.ejb3" todir="${jboss.home}/server/all/deploy"/>
          ????? </target>
          ???
          ???
          ????? <!-- =================================
          ??????????? target: runClient?????????????
          ?????????? ================================= -->
          ????? <target name="runClient" description="--> description">
          ????????? <java classname="com.gm.ejb3.Client" fork="yes" dir=".">
          ????????? ?<classpath refid="project.class.path"/>
          ????????? </java>
          ????? </target>
          ??
          ????? <!-- - - - - - - - - - - - - - - - - -
          ??????????? target: depends?????????????????????
          ?????????? - - - - - - - - - - - - - - - - - -->
          ????? <target name="depends">
          ????? </target>
          ?
          ???</project>
          ???
          ???4、寫一個(gè)Client來(lái)調(diào)用:
          ???需要一個(gè)jndi.properties文件,放在根目錄下面
          ????java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
          ????java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
          ????java.naming.provider.url=localhost
          ????? client文件的內(nèi)容:
          ???package com.gm.ejb3;


          ???import javax.naming.Context;
          ???import javax.naming.InitialContext;
          ???import javax.naming.NamingException;
          ???
          ???public class Client {
          ???
          ????/**
          ???? * @param args
          ???? */
          ????public static void main(String[] args) {
          ?????// TODO Auto-generated method stub
          ?????try {???
          ??????Context ctx=new InitialContext();
          ??????ICounter counter=(ICounter) ctx.lookup(ICounter.class.getName()); //缺省情況下,JNDI名稱就是你的接口名
          ??????
          ??????counter.Add(100);
          ??????System.out.println("Now Count is "+counter.getNumber());
          ??????
          ??????counter.Add(50);
          ??????System.out.println("Now Count is "+counter.getNumber());
          ?????} catch (NamingException e) {
          ??????// TODO Auto-generated catch block
          ??????e.printStackTrace();
          ?????}
          ????}
          ???
          ???}
          ???5、測(cè)試一下,用ant runClient。
          ???感覺(jué)還是比較輕松吧。以前開(kāi)發(fā)過(guò)EJB的,一定有一種非常放松的感覺(jué),太爽了。世界本來(lái)就是應(yīng)該就是這么簡(jiǎn)單啊!
          ???同時(shí)JBoss的EJB3開(kāi)發(fā)包里面有教學(xué)文件,非常的全面,可以從那里開(kāi)始EJB3的開(kāi)發(fā)旅程。

          posted on 2006-11-13 11:34 還沒(méi)想好名 閱讀(421) 評(píng)論(1)  編輯  收藏

          FeedBack:
          # mfmzgdsm
          2008-04-06 05:53 | mfmzgdsm
          gcirlvnl http://akeuwmec.com iblajyik wjdsqjqb  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 遂昌县| 石台县| 专栏| 天柱县| 连山| 岳池县| 横峰县| 吴堡县| 惠来县| 三江| 丰镇市| 阳春市| 石景山区| 高青县| 武定县| 绥阳县| 阿坝| 承德市| 高平市| 视频| 花莲市| 临潭县| 汕头市| 赤水市| 江北区| 始兴县| 汤原县| 尉犁县| 通许县| 鹤岗市| 偏关县| 德保县| 临汾市| 大冶市| 共和县| 泗洪县| 南充市| 石渠县| 尼勒克县| 儋州市| 临洮县|