理解:
1.当ejb的服务器端和客户端不再一个jvm上的时候,也就是部署在不同的机器上的时候,我们必须使用远程接口调用ejb,这时候我们就需要使用iiop协议,socket完成ejb客户端和ej服务器的通讯。
2.当ejb的服务器和ejb的客户端在同一个jvm的时候,也就是不数载相同的机器上的时候,我们可以使用ejb的本地接口来调用ejb,不需要走网络通信,直接在jvm级别完成ejb的调用。
3.我们在实际的开发过程中,要根据情况选择是通过本地接口调用ejb还是使用远程接口来调用ejb
实验:
我们现在模拟一个ejb,它有远程接口,也有本地接口,使用两个客户端调用这个ejb,一个在eclipse中写一个main方法,让它充当ejb的客户端,则他和ejb是不在一个jvm里,我们使用远程接口调用ejb,在写一个web工程,吧她部署在jboss中,她和ejb在一个jvm,或者容器中,我们使用 远程接口来调用ejb。
步骤:
1.ejb远程接口
package cn.com.xinli.ejb3; public interface HelloWorld { public String sayHello(String name); }
2.ejb本地接口 只需要继承远程接口即可
package cn.com.xinli.ejb3; public interface HelloWorldLocal extends HelloWorld { }
3.实现
package cn.com.xinli.ejb3.impl; import javax.ejb.Local; import javax.ejb.Remote; import javax.ejb.Stateful; import cn.com.xinli.ejb3.HelloWorld; import cn.com.xinli.ejb3.HelloWorldLocal; /*表明这个ejb是无状态的会话bean*/ @Stateful /*声明这个ejb的远程接口是HelloWorld,必须要写这个注解,否则调用的时候会报错*/ /*声明这个ejb的本地接口是HelloWorldLocal,必须要写这个注解,否则调用的时候会报错*/ @Local(HelloWorldLocal.class) @Remote(HelloWorld.class) public class HelloWorldBean implements HelloWorld,HelloWorldLocal { public String sayHello(String name) { return name+",你好,世界!我的ejb3的第一个例子!"; } }
4.不再一个jvm的客户端
package cn.com.xinli.ejb3.test; import java.util.Hashtable; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import cn.com.xinli.ejb3.HelloWorld; public class EjbClient { public static void main(String[] args) { Hashtable evn = new Hashtable(); evn.put(Context.PROVIDER_URL, "127.0.0.1:1099"); evn.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); // Properties properties=new Properties(); // properties.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); // properties.setProperty("java.naming.provider.url", "localhost:1099"); try { InitialContext context=new InitialContext(evn); /** * ejb3比ejb2有可地方比较好,就是在jndi查找的时候不用我们在写ejb-jar.xml * 只要我们按照jndi名字的查找规范就可以找到远程接口了 * */ HelloWorld helloword=(HelloWorld)context.lookup("HelloWorldBean/remote"); System.out.println(helloword.sayHello("huxl")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
5.和ejb在一个jvm的客户端,主要是建立一个web项目,然后他引用 ejb那个项目。部署在jboss里,写一个jsp页面,里面用<%%>的形式写一个客户端,完成本地接口的调用
test.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@page import="javax.naming.InitialContext"%> <%@page import="cn.com.xinli.ejb3.HelloWorldLocal"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert titlsse here</title> </head> <body> <% try { //由于是本地调用,不需要在设置本地的属性配置,它会从上下文中找jndi信息 //这样做也体现了跨平台,比如从jbss->websphere 属性配置是不一样的 InitialContext context=new InitialContext(); HelloWorldLocal helloword=(HelloWorldLocal)context.lookup("HelloWorldBean/local"); out.println(helloword.sayHello("huxl")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } %> </body> </html>
6.打包ejb,然后通过main方法调用远程接口成功,使用test.jsp调用本地接口也成功!