远程客户端和本地客户端
远程客户端:客户端与其调用的JEB对象不再同一个JVM进程中。为了创建一个能够被远程访问的企业Bean,你必须用@Remote注解来定义这些Bean。
本地客户端:客户端与其调用的EJB对象在同一个JVM进程中。为了创建一个能够被本地访问的企业Bean,你必须用@Local注解来定义这些Bean。
远程调用方式和本地调用方式
远程调用:JNDI lookup以remote方式进行调用,远程调用客户端与服务器之间通信的时候,数据需序列化之后用传值的方式传输。
本地调用:JNDI lookup以local方式进行调用,本地调用客户端与服务器之间通信的时候,数据不需序列化,用传址的方式传输。
客户端与访问方式
本地客户端可以用remote方式也可以用local方式访问企业Bean。远程客户端只可以用remote方式。
Demo
创建一个EJBProject
实体类:
[java] view plain copy
/**
* 要在 远程客户端和EJB之间传输对象,这些对象必须是可序列化的!如果是本地客户端就不用序列化
* @author 宋笑
*
*/
public class User implements Serializable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
实现类Bean:
[java] view plain copy
@Stateless
@Remote(UserManager.class)//远程调用
@Local(UserManager.class) //本地调用
public class UserManagerBean implements UserManager {
public void saveUser(User user) {
System.out.println("User[name = " + user.getName() + "]已经被保存");
user.setId(10);
}
}
1.远程客户端远程调用测试
[java] view plain copy
public class RemoteEjbClient {
/**
* @param
*/
public static void main(String[] args) throws Exception {
InitialContext ctx = new InitialContext();
//远程客户端只能调用远程接口
UserManager ejb = (UserManager)ctx.lookup("UserManagerBean/remote");
User user = new User();
user.setName("张三");
ejb.saveUser(user);
System.out.println("用户 " + user.getName() + "已经保存 ID = " +user.getId() );
}
}
结果:
2.本地客户端本地调用测试
创建一个JavaProject项目,并把项目部署到同一个JBOSS下。这样的话就属于本地客户端了。
<%
InitialContext context=newInitialContext();
UserManageruserManager=(UserManager)context.lookup("UserManagerBean/local");
User use=new User();
use.setName("张三");
userManager.saveUser(use);
out.print("张三用户ID为"+use.getId());
%>
结果:
这样很好的证明了,如果是远程调用,客户端操纵的Bean的参数,其实是一份参数值的拷贝,因此,对参数的修改,不会影响到Bean。但是对于本地调用来说,客户端操纵的Bean的参数,就是一个引用,它对参数的修改,将会影响到Bean。