当前位置: 首页 > 图文教程 > 认证考试 > java认证 > JAVA基础:Enterprise JavaBeans 入门

java认证
JAVA里字符编码的探索与理解
Java基本数据类型与流的操作方法
Web应用中Java的速度真相探讨
区分JAVA引用类型和原始类型
Java程序开发过程中异常处理的特殊情况
共享内存在Java中的实现和应用
Java复杂数据类型用法
漫谈Java程序设计中的接口应用
Java数据库编程中的几个常用技巧
Java中对HashMap的深度分析与比较
JavaBean与EJB的不同
Java技术 关于EJB调用原理分析
JAVA基础:Enterprise JavaBeans 入门
JAVA:EJB 的异常处理的最佳做法
JAVA:使用Axis开发Web Service程序
Java 中对文件的读写操作之比较
深入解析Java的新特性assertion
Java基础知识:你是否了解KVM的常量池
Static和Final修饰类属性变量及初始化
什么是基于Java的责任链模式

java认证 中的 JAVA基础:Enterprise JavaBeans 入门


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-04   浏览: 59 ::
收藏到网摘: n/a

一个客户端应用的构成?
JNDI 是如何工作的
使用 home 接口
使用会话 bean
EJB 客户端
看起来很特殊的 EJB 客户端应用实质上一点也不特殊
可以是 applet, 应用程序, servlet, 或其它 bean
没有过高的 overhead
编程模式简单
JNDI
使用 JNDI (Java Naming and Directory Interface) 来查找一个 EJB home 接口
JNDI 是将名称与对象匹配的服务(类似电话黄页)
一个 "naming service"
一个服务器将对象添加到目录树上:Known as "binding" a name to an object
任何一种对象可以被加到目录树中
JNDI Context

一个 Context 是一个将名称与对象绑定好的对象
Context 可以是嵌套的 (构成一个目录结构):顶级的 context 对象是一个 InitialContext
Context 可以被 "列出" 来查看其中的内容
Binding

Context 接口定义了下列方法
void bind(String name, Object obj)
Object lookup(String name)
一个容器当 Bean 启动后自动将 Bean 的名称绑定到它的 home 对象上
一个客户端通过名称就可查找到 home 接口
为何使用 JNDI?

服务器和客户端需要知道:
如何定位名称服务器
在名称服务器上对象的正确名称
客户端不知道如何定位 EJB 服务器:客户端必需知道如何找到名称服务器
通过名称服务器存取的对象可以来自多方面:多个服务器可以构成命名空间
获得您的 Bean

一旦您获得一个 home 接口,您可以使用 create() 方法来获得一个 bean 的引用:一旦您获得对该 bean 的引用,您可以开始调用它的方法
不需要任何扫尾工作;只需简单地"停止引用" bean
try {
MyBean bean = findMyBeanHome().create();
bean.computeSomethingOrOther(42);
...
} catch (NamingException e) {
// Handle the naming exception
}

找到回 Home 的路

每个 EJB 都有一个 home 接口
客户端可从一个 JNDI context 获得 home 接口
使用一个 helper 类将它 "narrow" 成正确类型
public MyBeanHome findMyBeanHome()
throws NamingException {
Context context = getInitialContext();
Object object = context.lookup("MyBean");
context.close();
return (MyBeanHome)PortableRemoteObject
.narrow(object, MyBeanHome.class);
}

创建一个 InitialContext

INITIAL_CONTEXT_FACTORY
创建初始 context 的类
与各厂商的实现相关
PROVIDER_URL
名称服务器的位置 (URL 格式)
"IIOP://localhost:6543/" == 本地机器,端口 6543
public Context getInitialContext()
throws NamingException {
Hashtable properties = new Hashtable(2);
properties.put(Context.PROVIDER_URL, "iiop://localhost:6543/");
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.ejs.ns.jndi.CNInitialContextFactory");
return new InitialContext(properties);
}

注意这些 "魔术" 值

这些 "常量" 不应该写死在您的方法中
应该从一个 properties 文件中获得,或为 servlet "init" 参数,...
public Context getInitialContext()
throws NamingException {
Hashtable properties = new Hashtable(2);
properties.put(Context.PROVIDER_URL, getNameServerURL());
properties.put(Context.INITIAL_CONTEXT_FACTORY,
getInitialContextFactoryClassName());
return new InitialContext(properties);
}

要及时关闭 Context

Context 不是线程安全的 (thread-safe):当您要共享它们时要当心
一旦您获得了对象的引用,您不再需要 context; 可以关闭它
...
Context context = getInitialContext();
Information info = null;
try {
info = (Information)context.lookup("information");
} catch (NamingException e) {
throw e;
} finally {
context.close();
}
...

引用 Bean

您可以不确定地引用一个 home 或 bean 类
实际上,我们建议您保存 home 接口如果您还将使用它们时:JNDI 的查找是开销很大的
但要注意,home/bean 的引用不是 serializable 的
...
MyBean bean = findMyBeanHome().create();
bean.computeSomethingOrOther(42);
...

Servlet 示例

public void doGet(...) throws ... {
PrintWriter out = response.getWriter();
out.println("");
try {
BankAccount account = getBankAccountHome().findById(42);
double balance = account.getBalance();
out.print("Balance is: ");
out.println(balance);
} catch (Exception e) {
out.println("A problem has occurred with the server.");
}
out.println("");
}

public synchronized BankAccountHome getBankAccountHome()
throws NamingException{
if (bankAccountHome == null)
bankAccountHome = findBankAccountHome();
return bankAccountHome;
}