?
?
理解:
?
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調用本地接口也成功!
?
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

