1、 EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序[当然,还有许多方式可以实现分布式应用],类似微软的.net技术。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。
2、 在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。
3、 jboss不支持中文文件名,只能使用英文文件名。
4、 Session Bean用于实现业务逻辑,它可以是有状态的,也可以是无状态的。每当客户端请求时,容器就会选择一个Session Bean来为客户端服务。Session Bean可以直接访问数据库,但更多时候,它会通过Entity Bean实现数据访问。
5、 无状态bean:
1) 无状态会话Bean的含义
a) 通过方法调用,实现一定的功能
2) 无状态会话Bean的特性
b) 执行方法调用,直接返回结果
c) 不保存客户的状态
d) 需要的系统资源更少
e) 执行速度更快
3) 用途:
任何的单一功能的实现
a) 登陆的验证
b) 完成单一的算法
6、 编写无状态会话Bean需要三个部分
1) Home interface (主接口)
- 创建EJB的实例
- 提供生命周期管理方法,管理EJB实例
a) 无状态homeInterface主接口的书写规范
- 必须extend javax.ejb.EJBHome 接口
EJBHome 提供一些有用的方法,getHomeHandle(),getEJBMetaData()和remove()
- 必须有一个create 方法
- 必须返回会话Bean的远程接口的类型
- 必须throw CreateException
- 所有定义的方法,包括create方法,必须throw RemoteException
- 在Home interface定义的方法,应该在Bean class中有相应的方法
– 名称要对应
– 举例:create( )方法对应ejbCreate( )
– 方法参数的数目和类型要一致
例如:
public interface HomeInterface extends EJBHome {
public RemoteInterface create() throws CreateException, RemoteException;
}
2) Remote interface(远程接口)
- 定义自己的商务方法
- 提供一些辅助的方法,例如:getHandle()
a)远程接口的书写规范
- 必须 extend javax.ejb.EJBObject 接口,提供方法有:
getEJBHome()
getHandle()
getPrimaryKey()
isIdentical()
remove()
- 所有的方法必须throws RemoteException
例如:
public interface RemoteInterface extends EJBObject{
public int getInt(int i)throws RemoteException;
}
3) Bean class(Bean类)
- 实施所有的在Home interface和Remote interface定义的方法
- 实施自己定义的商务方法
* 必须实现 javax.ejb.SessionBean 接口
* SessionBean接口提供一些callback(回调)方法
- ejbActivate( )
- ejbPassivate()
- setSessionContext(…)
- ejbRemove()
- Class必须为public
* 必须有一个public 构造方法而且没有参数
* 必须实现远程接口中定义的每个方法
* ejbCreate()方法和home接口中定义的方法一致
* 必须实现在SessionBean interface 中定义的每个方法
例如:
public class SessionBean implements javax.ejb.SessionBean {
/** The session context */
private SessionContext context;
private int number=10;
public SessionBean() {
// TODO Auto-generated constructor stub
}
//创建
public void ejbCreate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
//激活
public void ejbActivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
//钝化
public void ejbPassivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
//移除
public void ejbRemove() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void setSessionContext(SessionContext newContext)
throws EJBException {
context = newContext;
}
public int getInt(int i)throws RemoteException{
return i+number;
}
}
7、 EJB的生成和部署:
1) 编写EJB的Java源文件:Remote接口,Home接口,EJB的Bean类
2) 将源文件编译成class文件
3) 编写部署描述文件
4) 使用jar工具,创建一个包含部署描述和类文件的ejb-Jar文件
5) 将新生成Ejb-Jar文件部署到容器中.
8、 客户端如果调用EJB
1) 寻找Home对象
2) 利用Home对象创建EJB对象
3) 调用EJB对象的商业方法
4) 清除EJB对象
实例:
public static void main(String[] args) throws NamingException, RemoteException, CreateException {
// TODO Auto-generated method stub
//配置上下文环境
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
p.put(Context.URL_PKG_PREFIXES, "jboss.nameing:org.jnp.interfaces");
p.put(Context.PROVIDER_URL, "127.0.0.1:1099");
// 根据Properties对象对上下文环境进行设置
Context jndiContext = new InitialContext(p);
// 根据EJB的名称寻找服务
Object ref = jndiContext.lookup("stateless");
HomeInterface home =(HomeInterface)PortableRemoteObject.narrow(ref,
HomeInterface.class);
RemoteInterface remote = home.create();
System.out.println(remote.getInt(10));
}
}
9、 部署描述文件ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd" >
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>stateless</ejb-name>
<home>com.lovo.stateless.HomeInterface</home>
<remote>com.lovo.stateless.RemoteInterface</remote>
<ejb-class>com.lovo.stateless.SessionBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<session>
<ejb-name>stateful</ejb-name>
<home>com.lovo.stateful.HomeInterfaceful</home>
<remote>com.lovo.stateful.RemoteInterfaceful</remote>
<ejb-class>com.lovo.stateful.SessionBeanful</ejb-class>
<session-type>Stateful</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
10、 整个EJB的执行过程
a)客户端通过JNDI检索Home对象的引用;
b)JNDI返回Home对象的引用;
c)请求创建一个新的EJB对象;
d)创建EJB对象;
e)返回EJB对象;
f)调用商务方法;
11、 有状态的bean
主接口中可以有多个create()方法,主接口有几个create()方法,sessionbean里面就要写几个ejbCreate()方法。
12、 Entity Bean是域模型对象,用于实现O/R映射,负责将数据库中的表记录映射为内存中的Entity对象,事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。
13、 Entity Bean分两种:
1) BMP 书写一个Bean去管理实体Bean;好处:灵活性增加,效率有所提升;
2) CMP 容器去管理实体Bean;好处:简单,自动,但灵活性相当要低。
14、 .MessageDriven Bean是EJB2.0中引入的新的企业Bean,它基于JMS消息,只能接收客户端发送的JMS消息然后处理。MDB实际上是一个异步的无状态Session Bean,客户端调用MDB后无需等待,立刻返回,MDB将异步处理客户请求。这适合于需要异步处理请求的场合,比如订单处理,这样就能避免客户端长时间的等待一个方法调用直到返回结果。
15、