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

java认证
软件工程之Java实现策略
讲述java语言中内部类的研究
简单介绍log4j一般的使用步骤
入门:Java语言中常见的十大误解
入门:Java代码编写的一般性指导
编写跨平台Java程序注意事项
java语言的网络功能与编程
java语言的文件操作方法
Java程序性能和速度优化实例
异常问题在Java编程中处理的优劣
处理Java及其相关字符集编码的问题
解读Java语言灵巧指针与垃圾回收
用于Java的SCA客户机和实现模型
开发中对于Java中文问题的几条分析原则
JAVA深入了解:JavaBeans 增加XPath功能
网络方式安装Linux(CentOS)系统的方法
一篇介绍 Java Socket 编程的经典文章
Java程序中用Servlet容器实现程序监听
使用Java进行图像处理 图像编码输出
JAVA认证:SCJP310-055中文考纲

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-04   浏览: 62 ::
收藏到网摘: 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;
}