城市猎人

在一网情深的日子里,谁能说得清是苦是甜,只知道确定了就义无反顾
posts - 1, comments - 7, trackbacks - 0, articles - 89
        
        在所有的EJB3.0规范中定义的EJB,都不必实现Home接口。

  一个会话Bean必须有一个业务接口,这个接口由会话Bean来实现,或者也可以由会话Bean来产生。这样,你可以只写一个文件,就可以生成业务逻辑实现类、远程接口、本地接口等。

  …
  @Remote
  @Local
  @Stateless

  public class CounterBean
  {
  ……
  }

  在目前jboss的实现中,必须要有一个独立的业务接口。

  这个接口不必实现EJBObject或者EJBLocalObject。

  一个无状态会话Bean 必须使用Stateless注释,以表明它是一个无状态的会话Bean。EJB容器将根据这个注释来判定它的类型。或者实现javax.ejb.SessionBean接口

  一个无状态的会话Bean可以实现setSessionContext方法,也可以不实现。

  一个无状态的会话Bean可以实现ejbCreate/ejbRemove方法。

  一个无状态的会话Bean可以通过依赖注入(Dependency Injection)也就是现在吵得挺火的IOC获取容器的资源和环境属性。详细介绍请看后面的章节。

  在Eclipse中导入本文提供的例子Stateless。

  这个例子是一个计数器的例子,它实现了两个业务方法add和getNumber,add方法就是给计数器加上一个整数值,getNumber方法将得到计数器的当前值。

            这个例子主要有5个文件:

   Counter.java:业务接口。

   CounterBean.java:业务实现类。将来我们开发的EJB也都是这样命名(在接口名上加上Bean)。

   Client.java:测试EJB的客户端类。
  
   jndi.properties:jndi属性文件,提供访问jdni的基本配置属性。

   Build.xml:ant 配置文件,用以编译、发布、测试、清除EJB。 

            Counter.java
    
 1        package com.kuaff.ejb3.stateless; 
 2
 3  import javax.ejb.Remote; 
 4
 5  @Remote 
 6
 7  public interface Counter 
 8  
 9  public int add(int i); 
10  public int getNumber(); 
11  }
 
12

            这个接口很简单,定义了上面介绍的两个业务方法,同时,我们为这个接口加上了Remote注释,这样我们的远程客户端就可以通过JNDI名称查找到它,并调用它的业务方法。


  它的JNDI名称怎么配置呢?

  你不必配置它的JNDI名称,也不必写它的配置文件。在JBOSS实现的EJB3.0中,你不必写任何的EJB部署文件和jboss部署文件。JBOSS默认使用接口的全称作为它的JNDI名。在上面的例子中,它的全称就是: 

        com.kuaff.ejb3.stateless.Counter,你也可以通过Counter.class.forName()得到。 (glassfish也同理)

        CounterBean.java

 1    package com.kuaff.ejb3.stateless; 
 2
 3  import javax.ejb.Stateless; 
 4
 5  @Stateless 
 6
 7  public class CounterBean implements Counter 
 8  
 9  private int number = 0
10  //给计数器加上i 
11  public int add(int i) 
12  
13  number += i; 
14  return number; 
15  }
 
16
17  //得到当前的计数 
18
19  public int getNumber() 
20  
21  return number; 
22  }
 
23
24  }
 
25

        这个是计数器的实现类。注意这个类使用Stateless做了注释,这是必须的。

  Client.java

 1package com.kuaff.ejb3.stateless; 
 2  import javax.naming.InitialContext; 
 3  import javax.naming.NamingException; 
 4
 5  public class Client 
 6  
 7  public static void main(String[] args) 
 8  
 9   InitialContext ctx; 
10   try 
11    ctx = new InitialContext(); 
12    Counter counter = (Counter) ctx.lookup(Counter.class.getName()); 
13    counter.add(10); 
14    System.out.println("当前的number:" + counter.getNumber()); 
15    counter.add(10); 
16    System.out.println("当前的number:" + counter.getNumber()); 
17    Counter counter2 = (Counter) ctx.lookup(Counter.class.getName()); 
18    counter2.add(10); 
19    System.out.println("当前的number:" + counter2.getNumber()); 
20    catch (NamingException e) 
21    
22     e.printStackTrace(); 
23    }
 
24    
25   }
 
26  }
 


  这个类用来测试我们发布的计数器EJB。首先通过ctx = new InitialContext();得到上下文,然后通过lookup查找计数器,然后给计数器加10,显示当前的计数器信息。

 jndi.properties

1java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory 
2
3  java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces 
4
5java.naming.provider.url=localhost 
6
7

这个文件配置了JNDI操作所需的属性,因为我们是测试本机的EJB服务,所以不必修改上面的属性。

 1Build.xml 
 2
 3  <project name="kuaff_ejb3_tutorial" default="ejbjar" basedir="."> 
 4
 5  <property environment="env"/> 
 6
 7  <property name="src.dir" value="${basedir}/src"/> 
 8
 9  <property name="jboss.home" value="${env.JBOSS_HOME}"/> 
10
11  <property name="build.dir" value="${basedir}/build"/> 
12
13  <property name="build.classes.dir" value="${build.dir}/classes"/> 
14
15
16  <path id="classpath"> 
17
18  <fileset dir="${jboss.home}/lib"> 
19
20  <include name="**/*.jar"/> 
21
22  </fileset> 
23
24  <fileset dir="${jboss.home}/server/all/lib"> 
25
26  <include name="**/*.jar"/> 
27
28  </fileset> 
29
30  <fileset dir="${jboss.home}/server/all/deploy/ejb3.deployer"> 
31
32  <include name="*.jar"/> 
33
34  </fileset> 
35
36  <fileset dir="${jboss.home}/server/all/deploy/jboss-aop.deployer"> 
37
38  <include name="*.jar"/> 
39
40  </fileset> 
41  <pathelement location="${build.classes.dir}"/> 
42  <pathelement location="${basedir}"/> 
43  </path> 
44  <property name="build.classpath" refid="classpath"/> 
45  <target name="prepare"> 
46  <mkdir dir="${build.dir}"/> 
47  <mkdir dir="${build.classes.dir}"/> 
48  </target> 
49  <target name="compile" depends="prepare"> 
50  <javac srcdir="${src.dir}" 
51  destdir="${build.classes.dir}" 
52  debug="on" 
53  deprecation="on" 
54  optimize="off" 
55  includes="**"> 
56  <classpath refid="classpath"/> 
57  </javac> 
58  </target> 
59  <target name="ejbjar" depends="compile"> 
60  <jar jarfile="build/StatelessSample.ejb3"> 
61  <fileset dir="${build.classes.dir}"> 
62  <include name="**/*.class"/> 
63  </fileset> 
64  </jar> 
65  <copy file="build/StatelessSample.ejb3" todir="${jboss.home}/server/all/deploy"/> 
66  </target> 
67  <target name="run" depends="ejbjar"> 
68  <java classname="com.kuaff.ejb3.stateless.Client" fork="yes" dir="."> 
69  <classpath refid="classpath"/> 
70  </java> 
71  </target> 
72  <target name="clean.db"> 
73  <delete dir="${jboss.home}/server/all/data/hypersonic"/> 
74  </target> 
75  <target name="clean"> 
76  <delete dir="${build.dir}"/> 
77  <delete file="${jboss.home}/server/all/deploy/StatelessSample.ejb3"/> 
78  </target> 
79  </project> 
80


  请运行{$JBOSS_HOME}/bin目录下的run.bat: run –c all,启动JBOSS。

只有注册用户登录后才能发表评论。


网站导航: