Posted on 2007-12-05 15:39 
G_G 阅读(1396) 
评论(1)  编辑  收藏  所属分类: 
EJB 
			
			
		 
		EJB原理,有幸在 Q群上‘☆蓝蓝心情★’ 得以一教;
特在次郑重的道一声 
谢谢了.大哥
在次我就分享给大家,本人语言组织能力有限,说的不好可别怪我大哥啊。(呵呵)
EJB技术对传输上进行封装,使程序员不需要关心太多网络问题。服务器都基于统一javabean操作的 
在这就是基于 rmic 命令,和 rmiregistry 端口 来实现的。
rmic 和 rmiregistry 这些都在%JAVA_HOME%/bin下可以找到。
下面我就用大哥给写的一段 没用EJB容器 的代码来和大家分享EJB原理:
1.rmic命令介绍:
引用:  http://www.iplab.cs.tsukuba.ac.jp/liuxj/jdk1.2/zh/docs/tooldocs/solaris/rmic.html
rmic 编译器根据编译后的 Java 类(含有远程对象实现)名,为远程对象生成 stub 和 skeleton(远程对象是指实现 
java.rmi.Remote 接口的对象)。
在 
rmic 命令中所给的类必须是经 
javac 命令成功编译且是完全包限定的类。例如,按如下所示对类文件名 
HelloImpl 运行 
rmic:
2.EJB组建(服务器端)接口:
package org.rmi.test;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IHello extends Remote {
    public String sayHello(String name) throws RemoteException;
}
实现类:
package org.rmi.test;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
//取消显示指定的编译器警告!
//参考 : http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/lang/SuppressWarnings.html
@SuppressWarnings("serial") 
public class Hello extends UnicastRemoteObject implements IHello {
    public Hello() throws RemoteException {
        super();
    }
    
    public void rebind(String name) { 
        try {
            Naming.rebind(name,this);
            System.out.println("Server is running
");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    public String sayHello(String name) throws RemoteException {
        return "Hello "+name+" This is processed by RMI";
    }
}
 
上面的继承 java.rmi.Remote 和可序列化的感觉是一样的;在网络中转成流格式后,便与传输。
3. jdk1.5编译和 rmic 编译后
 1)javac .....
 2)rmic  rmic org.rmi.test.Hello(后得到 Hello_Stub.class)
4.服务器开启:
在项目根目录下加 rmi.policy
grant {
  Permission java.security.AllPermission "","connect,listen,accept";
};
后运行:
package org.rmi.test;
import java.rmi.RMISecurityManager;
public class Start {
    public static void main(String[] args) {
        try {
            System.setSecurityManager(new RMISecurityManager());
            //这里还不太明白
            new Hello().rebind("RMI/Mclaren"); 
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}
5.开端口:
rmiregistry 1099  (开 端口)
客户端:(另台电脑也可以了)
import java.rmi.Naming;
import org.rmi.test.IHello;
public final class Client {
    public static void main(String[] args) {
        try {
            IHello hello = (IHello)Naming.lookup("rmi://localhost:1099/RMI/Mclaren");
            System.out.println(hello.sayHello("Mclaren"));
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}
结果是:
Hello Mclaren This is processed by RMI