dev2dev.bea.com.cn
首页 资源中心 dev2dev学堂 在线技术论坛 专家Blog User Group CodeShare

EJB3.0中的stateless session bean 的试用

2007-11-09 15:22:16 | 评论 (0) | 被访问(685)次

魏振达
  一直使用java建立系统,兴趣在于系统集成、系统健壮性、系统严密性验证。


原来学习过EJB3.0,但是没有用过,如今忘了,再重新试用一下,为下一步准备一下。

stateless session bean的生命周期是这样的:一般是在第一次调用时创建,直到应用服务器关闭时销毁,当然,也可以设置服务器,让他超时销毁。

下面我们看一段代码:

package org.jboss.tutorial.stateless.bean;

import javax.ejb.Stateless;

@Stateless
public class CalculatorBean implements CalculatorRemote, CalculatorLocal
{

int =0;
   public int add(int x)
   {
      return e+=x;
   }

   public int subtract(int x)
   {
      return e-=x;
   }
}

注意到标记@Stateless了吗?就是他指明了是Stateless,比起原来在配置文件中写是不是明了很多?同样还有import javax.ejb.Stateless,这一句可是至关重要的,仔细看看会发现程序中没有别的地方用到这个包,唯一可能用到的就是@Stateless,明白了吗?

标记@Stateless并不是那么简单,它是一个接口的实现描述,也就是说和implements Stateless效果雷同,但是这样醒目方便多了。

stateless一定要实现至少一个接口(local或remote),本例中Both。

来看看借口文件:

package org.jboss.tutorial.stateless.bean;

import javax.ejb.Remote;

@Remote
public interface CalculatorRemote extends Calculator
{

}

-----------------------------------------------------------

package org.jboss.tutorial.stateless.bean;

import javax.ejb.Local;

@Local
public interface CalculatorLocal extends Calculator
{
}

一个远程,一个本地,两个接口, 分别用标记@Remote和@Local来标注!什么?你不知道远程和本地有什么作用?我的天!你该找本书看看,而不是在这看这篇文章。

下面是业务接口:

package org.jboss.tutorial.stateless.bean;

public interface Calculator
{
   int add(int x);

   int subtract(int x);
}

等一会儿在client中会用到。

下面我们看一看client :

package org.jboss.tutorial.stateless.client;

import org.jboss.tutorial.stateless.bean.Calculator;
import org.jboss.tutorial.stateless.bean.CalculatorRemote;

import javax.naming.InitialContext;

public class Client
{
   public static void main(String[] args) throws Exception
   {
      InitialContext ctx = new InitialContext();
      Calculator calculator = (Calculator) ctx.lookup(CalculatorRemote.class.getName());

      System.out.println("e + 1 = " + calculator.add(1));

    System.out.println("e - 1 = " + calculator.subtract(1));
   }
}

我们先解释一下,因为后面的客户端和这个结构基本相同,一劳永逸,何乐而不为呢?

     InitialContext ctx = new InitialContext();

这一句是设置环境变量,可以看到没有初始化参数,这是因为默认的参数是本机,可以不设置,以后会有需要设置的地方,我们再讲。

Calculator calculator = (Calculator) ctx.lookup(CalculatorRemote.class.getName());

这一句通过环境变量得到操作句柄。ctx.lookup(CalculatorRemote.class.getName())返回的是一个object对象,需要强制转换。

System.out.println("e + 1 = " + calculator.add(1));

调用并输出!

OK!

That's all!

下面要编译打包:(使用ANT)

<?xml version="1.0"?>

<!-- ======================================================================= -->
<!-- JBoss build file                                                       -->
<!-- ======================================================================= -->

<project name="JBoss" default="ejbjar" basedir=".">

   <property environment="env"/>
   <property name="src.dir" value="${basedir}/src"/>
   <property name="jboss.home" value="${env.JBOSS_HOME}"/>   <property name="jboss.server.config" value="all"/>
   <property name="build.dir" value="${basedir}/build"/>
   <property name="build.classes.dir" value="${build.dir}/classes"/>

   <!-- Build classpath -->
   <path id="classpath">
      <!-- So that we can get jndi.properties for InitialContext -->
      <pathelement location="${basedir}"/>
      <fileset dir="${jboss.home}/lib">
         <include name="**/*.jar"/>
      </fileset>
      <fileset dir="${jboss.home}/server/${jboss.server.config}/lib">
         <include name="**/*.jar"/>
      </fileset>
      <fileset dir="${jboss.home}/server/${jboss.server.config}/deploy/ejb3.deployer">
         <include name="*.jar"/>
      </fileset>
      <fileset dir="${jboss.home}/server/${jboss.server.config}/deploy/jboss-aop-jdk50.deployer">
         <include name="*.jar"/>
      </fileset>
      <pathelement location="${build.classes.dir}"/>
   </path>

   <property name="build.classpath" refid="classpath"/>

   <!-- =================================================================== -->
   <!-- Prepares the build directory                                        -->
   <!-- =================================================================== -->
   <target name="prepare">
      <mkdir dir="${build.dir}"/>
      <mkdir dir="${build.classes.dir}"/>
   </target>

   <!-- =================================================================== -->
   <!-- Compiles the source code                                            -->
   <!-- =================================================================== -->
   <target name="compile" depends="prepare">
      <javac srcdir="${src.dir}"
         destdir="${build.classes.dir}"
         debug="on"
         deprecation="on"
         optimize="off"
         includes="**">
         <classpath refid="classpath"/>
      </javac>
   </target>

   <target name="ejbjar" depends="compile">
      <jar jarfile="build/tutorial.ejb3">
         <fileset dir="${build.classes.dir}">
            <include name="**/*.class"/>
         </fileset>
      </jar>
      <copy file="build/tutorial.ejb3" todir="${jboss.home}/server/${jboss.server.config}/deploy"/>
   </target>

   <target name="run" depends="ejbjar">
      <java classname="org.jboss.tutorial.stateless.client.Client" fork="yes" dir=".">
         <classpath refid="classpath"/>
      </java>
   </target>

   <!-- =================================================================== -->
   <!-- Cleans up generated stuff                                           -->
   <!-- =================================================================== -->
   <target name="clean.db">
      <delete dir="${jboss.home}/server/${jboss.server.config}/data/hypersonic"/>
   </target>

   <target name="clean">
      <delete dir="${build.dir}"/>
      <delete file="${jboss.home}/server/${jboss.server.config}/deploy/tutorial.ejb3"/>
   </target>


</project>

哈哈!这是ant的build.xml文件,讲解一下:

我们输入指令ANT时,ant会在当前目录下找build.xml,然后根据文件内容运行。

如果输入的仅仅是ant,则会执行default="ejbjar" 任务,depends="compile"是递归调用,必须在本任务执行之前完成的。

如果输入的是ant run ,则会执行run任务,即上面蓝色的部分。

上面的文件中,还有<copy file="build/tutorial.ejb3" todir="${jboss.home}/server/${jboss.server.config}/deploy"/>

这已经属于部署了,它把文件拷到jboss的部署目录下。jboss只要把文件拷过去,自己可以完成所有部署任务。

ok!

Let's ant!

And then ant run!

what do you see?

error?

要注意上面文件的路径,我忘了讲,自己看看吧!说不定会豁然开朗的!!哈哈!!



Tags: Java go deep into java
文章评论:(以下网友留言只代表个人观点,不代表BEA观点和立场)
暂时没有评论!

2007年11月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
             
RSS订阅

魏振达's Blog搜索