- 论坛徽章:
- 0
|
我们 一起 开始 接触 EJB 3.0的 学习过程
EJB 是 基于组件开发的 一个 平台 : 全称 Enterprise Java Bean 企业级的 JAVA baen
EJB 有三种BEAN 组成:会话BEAN,消息驱动BEAN,实体BEAN
开发工具:MyEclipse+JBoss 4.0.2
下面 我们通过实例来讲解:
会话bean, 我们在了解 会话bean的时候 必须 弄清楚的一个 概念 就是 :本地和远程
本地 你 所运行的程序和 EJB部署服务器 运行在一个 JVM下面,比如 一个 WEB 工程 你要部署到 JBOSS 下面,你的 EJB也是部署到 JBOSS下面 所以 这样 就 是 使用的 一个 JVM 属于本地 ,其他则是 属于 远程(Remote)的
使用 本地 的使用 设置 attribute name="UseJBossWebLoader">trueattribute> 意思 是 不使用 tomcat来启动 WEB加载 而使用 jboss 这个时候 就保证了 EJB 和 WEB工程 都 在 JBOSS下面 保证了本地调用的正确
编写会话BEAN 的 步骤:
第一:开发接口
第二:开发BEAN
第三:发布到 服务器
第四:开发客户端 (需要加入JAR包 在 jboss/client目录下面的全部JAR包都拷贝进去)
第五:开启服务 调用
会话bean分类 :
有状态的(stateful)和 无状态的(stateless)
有状态是指每一次 取得的bean都保存了自己的状态 对应与 spring的 原型bean,而无状态的不保存自己的状态 对应于spring的单态bean
下面 开发第一个 EJB:
第一步:
package com.ly;
import javax.ejb.Remote;
@Remote
public interface RemoteInterface_1 {
public void setName(String name);
public String getName();
}
package com.ly;
import javax.ejb.Local;
@Local
public interface LocalInterface_2 {
public int getAge();
}
把接口开发号拉
第二:
开发bean
package com.ly.impl;
import javax.ejb.Stateless;
import com.ly.LocalInterface_2;
import com.ly.RemoteInterface_1;
@Stateless(name="HE") //指定JNDI 名字 默认的是 HelloImpl/remote 和HelloImpl/local
public class HelloImpl implements RemoteInterface_1,LocalInterface_2{
String name;
int age;
public String getName() {
return this.name;
}
public int getAge() {
return 20;
}
public void setName(String name){
this.name=name;
}
}
第三步:
部署 到jboss
第四步:
jndi.properties 拷贝到 工程的 classpath里面
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.ly.RemoteInterface_1;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Context context = new InitialContext(); //创建 JNDI 上下文
RemoteInterface_1 remote=(RemoteInterface_1)context.lookup("HE/remote");
remote.setName("今天 是个好日子");
System.out.println(remote.getName());
RemoteInterface_1 remote_1=(RemoteInterface_1)context.lookup("HE/remote");
System.out.println(remote.getName());
//这个 就是 无状态的 会话BEAN 它不记录 状态 也就相当与 spring 的 单例bean
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
第五步:
运行结果是:
DEBUG [main] (SecurityAssociation.java:143) - Using ThreadLocal: false
DEBUG [main] (MicroSocketClientInvoker.java:243) - SocketClientInvoker[14a55f2, socket://127.0.0.1:3873] constructed
DEBUG [main] (MicroRemoteClientInvoker.java:240) - SocketClientInvoker[14a55f2, socket://127.0.0.1:3873] connecting
DEBUG [main] (MicroRemoteClientInvoker.java:245) - SocketClientInvoker[14a55f2, socket://127.0.0.1:3873] connected
DEBUG [main] (ClientSocketWrapper.java:169) - reset timeout: 0
DEBUG [main] (InvokerRegistry.java:595) - removed SocketClientInvoker[14a55f2, socket://127.0.0.1:3873] from registry
DEBUG [main] (MicroSocketClientInvoker.java:276) - SocketClientInvoker[14a55f2, socket://127.0.0.1:3873] disconnecting ...
DEBUG [main] (SocketWrapper.java:123) - ClientSocketWrapper[Socket[addr=/127.0.0.1,port=3873,localport=1125].19e15c] closing
DEBUG [main] (MicroSocketClientInvoker.java:243) - SocketClientInvoker[11a75a2, socket://127.0.0.1:3873] constructed
DEBUG [main] (MicroRemoteClientInvoker.java:240) - SocketClientInvoker[11a75a2, socket://127.0.0.1:3873] connecting
DEBUG [main] (MicroRemoteClientInvoker.java:245) - SocketClientInvoker[11a75a2, socket://127.0.0.1:3873] connected
DEBUG [main] (ClientSocketWrapper.java:169) - reset timeout: 0
DEBUG [main] (InvokerRegistry.java:595) - removed SocketClientInvoker[11a75a2, socket://127.0.0.1:3873] from registry
DEBUG [main] (MicroSocketClientInvoker.java:276) - SocketClientInvoker[11a75a2, socket://127.0.0.1:3873] disconnecting ...
DEBUG [main] (SocketWrapper.java:123) - ClientSocketWrapper[Socket[addr=/127.0.0.1,port=3873,localport=1126].1d62270] closing
今天 是个好日子
DEBUG [main] (MicroSocketClientInvoker.java:243) - SocketClientInvoker[e1899b, socket://127.0.0.1:3873] constructed
DEBUG [main] (MicroRemoteClientInvoker.java:240) - SocketClientInvoker[e1899b, socket://127.0.0.1:3873] connecting
DEBUG [Finalizer] (MicroSocketClientInvoker.java:276) - SocketClientInvoker[11a75a2, socket://127.0.0.1:3873] disconnecting ...
DEBUG [main] (MicroRemoteClientInvoker.java:245) - SocketClientInvoker[e1899b, socket://127.0.0.1:3873] connected
DEBUG [Finalizer] (MicroSocketClientInvoker.java:276) - SocketClientInvoker[11a75a2, socket://127.0.0.1:3873] disconnecting ...
DEBUG [main] (ClientSocketWrapper.java:169) - reset timeout: 0
DEBUG [main] (InvokerRegistry.java:595) - removed SocketClientInvoker[e1899b, socket://127.0.0.1:3873] from registry
DEBUG [main] (MicroSocketClientInvoker.java:276) - SocketClientInvoker[e1899b, socket://127.0.0.1:3873] disconnecting ...
DEBUG [main] (SocketWrapper.java:123) - ClientSocketWrapper[Socket[addr=/127.0.0.1,port=3873,localport=1127].c39a20] closing
今天 是个好日子
我们开发的是一个 无状态的 会话BEAN 所以 第二次 从EJB容器 取出 BEAN的时候 得到的结果也是 “今天 是个好日子”
错误 提示:
注意 如果 EJB没有指定 JNDI名字 则为 EJB名字/remote|local
如果 指定 stateless(name="HE") 就是 HE/remote 这样用的 远程bean
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93826/showart_1903258.html |
|