EJB支持的客户端类型:
- 本地客户端 (必须与企业Bean运行在同一个JVM中)
- 远程客户端
- Web service客户端
创建一个EJB项目:
1. 创建接口
public interface FirstEjb {
public String saySomething(String name);
}
2. 实现接口并加注解
@Stateless
@Remote <a>/*@Local</a> @Webservice*/
public class FirstEjbBean implements FirstEjb {
public String saySomething(String name) {
return name;
}
}
3. 将EJB项目部署到JBoss
创建客户端
一、 远程客户端
1. 创建一个java项目
2. 配置客户端环境
将EJB项目的接口打成jar包(如果有EntityBean,连同EntityBean一起打包),将这个jar包加入到客户端项目的类路径中。
将Jboss_home/client中的所有jar包加到客户端项目中。
3. 在客户端创建EJB对象(通过InitialContext得到EJB对象,InitialContext是JNDI的一个对象,JNDI是JBoss应用服务器提供的一种服务)
private static Context context;
If(context==null){
Hashtable props = new Hashtable();
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
props.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
props.put(Context.PROVIDER_URL,"jnp://EJB所在的IP:1099");
Context=new InitialContext(props);
}
FirstEjb firstEjb = (FirstEjb)context.lookup("FirstEjbBean/remote");
firstEjb.saySomething("liusong");
二、 本地客户端
1. 创建一个java Web项目
2. 配置客户端环境
将EJB项目的接口打成jar包(如果有EntityBean,连同EntityBean一起打包),将这个jar包加入到客户端项目的类路径中。
3. 在客户端创建EJB对象
<%@ page import="javax.naming.*,com.tgb.ejb.*" %>
<html>
<body>
<%
InitialContext context= new InitialContext();
FirstEjb firstEjb = (FirstEjb)context.lookup("FirstEjbBean/local");
firstEjb.saySomething("liusong");
%>
</body>
</html>
三、 Web service客户端
暂时略
Web Service客户端可以访问Stateless Session Bean的接口,业务逻辑方法需要用@WebMethod标识。
远程调用和本地调用比较:
@Remote | @Local |
客户端需要ejb接口jar包 | 需要 |
需要jndi配置 | 不需要 |
客户端需要Jboss客户端jar包 | 不需要 |
EntityBena需要实现序列化接口 | 不需要 |
客户端不需要在EJB服务器中运行 | 需要在服务器中运行 |
参数通过传值方式传递 | 参数通过传地址方式传递 |
只能Remote方式访问 | 可以Remote和Local方式访问 |
如果Bean中没有注明@Remote或者@Local,默认为@Local接口。
如果在本机调用EJB,采用Local接口访问要优于Remote接口。Remote接口访问EJB需要经过远程方法调用(RPCS)环节,而Local接口访问EJB直接从JVM中返回EJB的引用。
由于远程调用的速度比较慢,所以在设计的时候,尽量使用粗粒度的接口,以减少方法的调用,并尽可能在一次方法调用中传输完毕所需要的数据。