EJB的相关知识点

EJB的相关知识点

《jsp高级编程》的85页,开始很重要
《jsp高级编程》的196页,那个无线应用协议很好,值得研究。是XML的

 

我们在编写Home 接口的时候必须注意到Home 接口
是通过继承javax.ejb.EJBHome 接口来定义的EJBHome 接口包含如下的方法
public void remove(Handle handle) throws java.rmi.RemoteException RemoveException;
public void remove(java.lang.Object primaryKey) throws java.rmi.RemoteException
RemoveException;
public EJBMetaData getEJBMetaData() throws java.rmi.RemoteException;
public HomeHandle getHomeHandle() throws java.rmi.RemoteException;


一个EJB 的Home 接口可以像下面的样子
程序清单2.1
//File Name:TestHome.java
//Date:2001.4.30
//Author:fancy
//Note:create a Home Interface
import java.rmi.*;
import javax.ejb.*;
public interface TestHome extends EJBHome
{
public TestRemote create() throws RemoteException CreateException;
}


EJB 开发者已经创建了一个客户端应用程序可以访问create()方法的Home Interface
在Home Interface 中定义的 create()方法在相应的Bean 中都必须有一个ejbCreate()方法与之
对应同样EJB 开发者必须创建封装了客户端应用程序能够访问的商业方法的Remote
Interface
因为所有的客户端程序调用的方法都必须通过Remote Interface 因此实现这个接口的
是EJB Object 而不是Home Object Remote Interface 中列出的方法名必须和实现Bean 的方
法名相同
我们在编写Remote Interafce 的时候必须注意Remote Interface 必须扩展
javax.ejb.EJBObject 接口EJBObject 接口定义的方法如下所示:
public EJBHome getEJBHome() throws java.rmi.RemoteException;
public java.lang.Object getPrimaryKey() throws java.rmi.RemoteException;
public void remove() throws java.rmi.RemoteException RemoveException;
public Handle getHandle() throws java.rmi.RemoteException;
public boolean isIdentical(EJBObject obj) throws java.rmi.RemoteException;
以下是一个Remote Interface 的例子
程序清单2.2
//File Name:TestRemote.java
//Author:fancy
//Date:2001.4.30
//Note:create a Remote Interface
import java.rmi.*;
import javax.ejb.*;
public interface TestRemote extends EJBObject
{
public java.lang.String getAuthor() throws RemoteException;
}
所有在Remote Interface 中声明的方法都必须抛出一个RemoteException 异常因为EJB
规范要求客户端的stub 类必须是Java RMI 技术兼容的但这并不意味着排除了用其它的传
输方式的stub/skeleton 实现如CORBA/IIOP

 

我们可以通过定义一个实现javax.ejb.SessionBean 接口的类来创建一个会话EJB 该接
口(SessionBean 接口)的定义如下
public void setSessionContext(SessionContext ctx) throws EJBException
java.rmi.RemoteException;
public void ejbRemove() throws EJBException java.rmi.RemoteException;
public void ejbActivate() throws EJBException java.rmi.RemoteException;
public void ejbPassivate() throws EJBException java.rmi.RemoteException;
javax.ejb.EnterpriseBean 是一个空接口是会话EJB 和实体EJB 的超类下

 

EntityBean 接口
实体Bean 类必须继承javax.ejb.EntityBean 接口下面我们应该来看看EntityBean 接口
所定义的方法
public void setEntityContext(EntityContext ctx) throws EJBException java.rmi.Remote
Exception
public void unsetEntityContext() throws EJBException java.rmi.RemoteException
public void ejbRemove() throws RemoveException EJBException java.rmi.Remote
Exception
public void ejbActivate() throws EJBException java.rmi.RemoteException
public void ejbPassivate() throws EJBException java.rmi.RemoteException
public void ejbLoad() throws EJBException java.rmi.RemoteException
public void ejbStore() throws EJBException java.rmi.RemoteException

 

这个ejbCreate()方法的流程如下
首先调用父类的ejbCreate()方法如
super.ejbCreate(goodsname goodstype comment price priceoff id);
判断有没有同样主键存在如果有那么会抛出DuplicateKeyException 异常

获取数据库连接对象如
connection = dataSource.getConnection();
建立SQL 句柄对象如
statement = connection.prepareStatement("INSERT INTO goods (goodsname
goodstype comment price priceoff id) VALUES (? ? ? ? ? ?)");
利用PreparedStatement 对象的setXXX()方法和输入参数组装SQL 语句如
statement.setString(1 goodsname);
statement.setString(2 goodstype);

调用PreparedStatement 对象的executeUpdate()方法执行SQL 语句如
if (statement.executeUpdate() != 1)
{
throw new CreateException("Error adding row");
}
关闭statement connection 等对象如
statement.close();
statement = null;
connection.close();
connection = null;
返回新的EJB 对象的主键(标识符)
return id;
这就是ejbCreate()方法的执行流程剩余的代码都是错误处理代码读者不难发现
ejbCreate()方法就是往数据库里插入新的纪录Entity EJB 就代表一个数据库行纪录Goods
EJB 对象其实就代表了goods 表的一个行纪录

 

RMI应用已经编写好了下面我们应该编译运行这个RMI 应用步骤如下:
1 编译RMI 客户和服务器这将自动编译远程对象的本地接口和远程对象实现
命令行代码如下
javac RemClient.java
javac RemServer.java
2 生成客户存根模块(stub)和服务器框架(skeleton)
rmic RemImpl
这将构造RemImpl_Stub.class 和RemImpl_Skeleton.class
3 请将Rem.class RemClient.class 和RemImpl_Stub.class 拷贝到RMI 客户机将
Rem.class RemImpl.class RemServer.class 和RemImpl_Skeleton.class 拷贝到RMI 服务器
4 启动RMI 注册程序在命令行状态下运行rmiregistry 程序rmiregistry 程序
在JDK 的bin 文件夹内这个程序在服务器上执行不论有多少个RMI 远程对象需要运行
本操作只需做一次
5 运行RMI 服务程序在命令行下执行下面的命令
java RemServer.class
这一步的作用是启动RMI 服务器(在服务器上执行)
在命令行下执行下面的命令
java RemClient.class
这一步的作用是启动RMI 客户程序(在客户端计算机上执行) 输出结果为
Here is a remote message.
fancy

 

OMA定义了组成CORBA 的4 个主要部分分别与上面提到过的
OMA 的4 个部分相对应它们是
  Object Request Broker ORB 作为对象互通讯的软总线
  CORBA Services CORBA 服务定义加入ORB 的系统级服务如安全性命名
和事务处理是开发分布式应用所必需的模块这些服务提供异步事件管理事
务持续并发名字关系和生存周期的管理
  CORBA Facilities CORBA 工具定义应用程序级服务如复合文档等对于开
发分布式应用不是必需的但是在某些情况下是有用的这些工具提供信息管理
系统管理任务管理和用户界面
  Business Objects 或者是Application Objects 商业对象或者应用对象主要用于
定义现实世界的对象和应用如飞机或银行帐户

 

ShowServer 类的main()方法可完成以下任务
1 创建一个ORB 实例(orb) 如下面的代码
ORB orb = ORB.init(args null);
2 创建一个服务对象实例CORBA About 对象的实现并通知ORB 对象如下面
的代码
ShowObject ShowRef = new ShowObject();
orb.connect(ShowRef);
3 获取一个命名上下文的CORBA 对象引用在该命名上下文中注册新的CORBA 对

4 在命名上下文中将新对象注册在“About”名下如下面的代码
NameComponent nc = new NameComponent("About" "");
NameComponent path[] = {nc};
ncRef.rebind(path ShowRef);
5 等待客户端程序对新对象的调用
4 实现客户机 (ShowClient.java)
请看程序清单4.14(ShowClient.java)
程序清单4.14(ShowClient.java)
import About.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
public class ShowClient
{
public static void main(String args[])
{
try
{
// 创建和初始化 ORB
ORB orb = ORB.init(args null);
// 获取根命名上下文
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
//解析命名中的对象引用
NameComponent nc = new NameComponent("About" "");
NameComponent path[] = {nc};
About.Show ShowRef = ShowHelper.narrow(ncRef.resolve(path));
// 调用 Show 服务对象并打印结果
String show = ShowRef.ShowName();
System.out.println(show);
}
catch (Exception e)
{
System.out.println("ERROR : " + e) ;
e.printStackTrace(System.out);
}
}
}
在ShowClient 类中完成了以下任务;
1 创建一个ORB 如下面的代码
ORB orb = ORB.init(args null);
2 获取一个指向命名上下文的引用如下面的代码
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
3 在命名上下文中查找“Show”并获得指向该 CORBA 对象的引用如下面的代码
NameComponent nc = new NameComponent("About" "");
NameComponent path[] = {nc};
About.Show ShowRef = ShowHelper.narrow(ncRef.resolve(path));
4 调用对象的 ShowName() 操作并打印结果如下面的代码
String show = ShowRef.ShowName();
System.out.println(show);
5 构建和运行ShowName 程序
1 编译所有的java 文件包括在About 目录中CORBA 支持文件(stub 和skeleton)
javac *.java
2 启动一个MS-DOS 窗口输入以下命令确保JNDI 命名服务器处于运行状态
tnameserv -ORBInitialPort 1050
3 启动另一个MS-DOS 窗口输入以下命令启动ShowServer 服务程序
java ShowServer -ORBInitialPort 1050
4 再启动一个MS-DOS 窗口运行客户机的ShowClient 应用程序
java ShowClient -ORBInitialPort 1050
ShowClient.java 程序的输出为
My name is fancy!
这说明CORBA 服务已经测试成功了.

 

4.3.5 使用JSP 编写CORBA 应用客户端
和RMI 技术一样我们同样可以使用JSP 编写CORBA 应用的客户端程序就以上文
编写的ShowServer CORBA 服务为例我们编写一个基于JSP 的客户端程序请看程序清
单4.15
程序清单4.15
<%--
File Name:show.jsp
Author:fancy
Date:2001.5
Note:jsp client for corba
--%>
<%@ page import=”About.*” %>
<%@ page import=”org.omg.CosNaming.* ”%>
<%@ page import=”org.omg.CORBA.*”%>
<%
try
{
// 创建和初始化 ORB
ORB orb = ORB.init(args null);
// 获取根命名上下文
org.omg.CORBA.Object objRef =orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
//解析命名中的对象引用
NameComponent nc = new NameComponent("About" "");
NameComponent path[] = {nc};
About.Show ShowRef = ShowHelper.narrow(ncRef.resolve(path));
// 调用 Show 服务对象并打印结果
String show = ShowRef.ShowName();
out.println(show);
}
catch (Exception e)
{
out.println("ERROR : " + e) ;
e.printStackTrace(System.out);
}
%>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Files contained in javax.ejb.jar: META-INF/MANIFEST.MF javax.ejb.AccessLocalException.class javax.ejb.AccessTimeout.class javax.ejb.ActivationConfigProperty.class javax.ejb.AfterBegin.class javax.ejb.AfterCompletion.class javax.ejb.ApplicationException.class javax.ejb.Asynchronous.class javax.ejb.AsyncResult.class javax.ejb.BeforeCompletion.class javax.ejb.ConcurrencyManagement.class javax.ejb.ConcurrencyManagementType.class javax.ejb.ConcurrentAccessException.class javax.ejb.ConcurrentAccessTimeoutException.class javax.ejb.CreateException.class javax.ejb.DependsOn.class javax.ejb.DuplicateKeyException.class javax.ejb.EJB.class javax.ejb.EJBAccessException.class javax.ejb.EJBContext.class javax.ejb.EJBException.class javax.ejb.EJBHome.class javax.ejb.EJBLocalHome.class javax.ejb.EJBLocalObject.class javax.ejb.EJBMetaData.class javax.ejb.EJBObject.class javax.ejb.EJBs.class javax.ejb.EJBTransactionRequiredException.class javax.ejb.EJBTransactionRolledbackException.class javax.ejb.embeddable.EJBContainer.class javax.ejb.EnterpriseBean.class javax.ejb.EntityBean.class javax.ejb.EntityContext.class javax.ejb.FinderException.class javax.ejb.Handle.class javax.ejb.HomeHandle.class javax.ejb.IllegalLoopbackException.class javax.ejb.Init.class javax.ejb.Local.class javax.ejb.LocalBean.class javax.ejb.LocalHome.class javax.ejb.Lock.class javax.ejb.LockType.class javax.ejb.MessageDriven.class javax.ejb.MessageDrivenBean.class javax.ejb.MessageDrivenContext.class javax.ejb.NoMoreTimeoutsException.class javax.ejb.NoSuchEJBException.class javax.ejb.NoSuchEntityException.class javax.ejb.NoSuchObjectLocalException.class javax.ejb.ObjectNotFoundException.class javax.ejb.PostActivate.class javax.ejb.PrePassivate.class javax.ejb.Remote.class javax.ejb.RemoteHome.class javax.ejb.Remove.class javax.ejb.RemoveException.class javax.ejb.Schedule.class javax.ejb.ScheduleExpression.class javax.ejb.Schedules.class javax.ejb.SessionBean.class javax.ejb.SessionContext.class javax.ejb.Session

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值