jboss中远程(remote)和本地(local)的区别

一:远程定义:

接口:

HelloWorld.java

 

package com.itcast.ejb3;

public interface HelloWorld {
 public String say(String name);

}

实现类:

package com.itcast.ejb3.impl;

import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;

import com.itcast.ejb3.HelloWorld;

@Stateless
@Remote(HelloWorld.class)
public class HelloWorldBean implements HelloWorld {

 public String say(String name) {
  return name + "说,hello world";
 }

}

 

这两个类写完以后,打包成.jar,发布到jboss的相应目录中去.

 

客户端测试类:

 

package com.itcast.ejb.client;

import java.util.Properties;

import javax.naming.InitialContext;

import com.itcast.ejb3.HelloWorld;

public class EJBClient {

 /**
  * @param args
  */
 public static void main(String[] args) {
  
  try {
   InitialContext context = new InitialContext();
   HelloWorld hello = (HelloWorld)context.lookup("HelloWorldBean/remote");//这里的hello并不是一个接口,而是一个代理对象,可以通过System.out.println(hello.getClass().getName());来看一下hello的类名称,显示是$Proxy0
   System.out.println(hello.say("高歌对EJB"));
  } catch (Exception e) {
   System.out.println(e.getMessage());
  }
  

 }

}

 

jndi.properties文件内容如下:

 

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:1099

 

这时候是可以正常运行显示的,显示的结果是:

高歌对EJB说,hello world

 

二:Local定义

接口:

HelloWorld.java

 

package com.itcast.ejb3;

public interface HelloWorld {
 public String say(String name);

}

实现类:

package com.itcast.ejb3.impl;

import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;

import com.itcast.ejb3.HelloWorld;

@Stateless
@Local(HelloWorld.class)
public class HelloWorldBean implements HelloWorld {

 public String say(String name) {
  return name + "说,hello world";
 }

}

 

这两个类写完以后,打包成.jar,发布到jboss的相应目录中去.

 

客户端测试类:

 

package com.itcast.ejb.client;

import java.util.Properties;

import javax.naming.InitialContext;

import com.itcast.ejb3.HelloWorld;

public class EJBClient {

 /**
  * @param args
  */
 public static void main(String[] args) {
  
  try {
   InitialContext context = new InitialContext();
   HelloWorld hello = (HelloWorld)context.lookup("HelloWorldBean/local   System.out.println(hello.say("高歌对EJB"));
  } catch (Exception e) {
   System.out.println(e.getMessage());
  }
  

 }

}

 

这时候是会报错的,报的错是:

Invalid (i.e. remote) invocation of local interface (null container)

原因是因为客户端和发布的HelloWorld.jar不是在一个jvm里造成的。

 

 

 

下面再新建一个web项目EJBWebClient,这个项目要导入上面的那个项目(因为要在index.jsp文件中使用到Hello接口)

index.jsp文件如下:

<%@ page language="java" import="javax.naming.*,com.itcast.ejb3.*" pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
   
    <title>My JSP 'index.jsp' starting page</title>
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css">
 -->
  </head>
 
  <body>
   <%
 try {
  InitialContext context = new InitialContext();//Web客户端就不需要jndi.properties这个属性文件了,因为当前客户端是和jboss中的,所以就会自动的去查找相关的上下文信息。
  HelloWorld hello = (HelloWorld)context.lookup("HelloWorldBean/local");
  //System.out.println(hello.getClass().getName());
  out.println(hello.say("高歌对EJB"));
 } catch (Exception e) {
  out.println(e.getMessage());
 }
 


   %>
  </body>
</html>

 

 

 

 

这样的话在设计服务的时候,就可以让该服务既提供本地接口,又提供远程接口
远程接口:

HelloWorldRemote.java

package com.itcast.ejb3;

public interface HelloWorldRemote {
 public String say(String name);

}
本地接口:
HelloWorldLocal.java
package com.itcast.ejb3;

public interface HelloWorldLocal extends HelloWorldRemote {

}


实现类:

package com.itcast.ejb3.impl;

import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;

import com.itcast.ejb3.HelloWorldLocal;
import com.itcast.ejb3.HelloWorldRemote;

@Stateless
@Remote(HelloWorldRemote.class)
@Local(HelloWorldLocal.class)
public class HelloWorldBean implements

HelloWorldRemote,HelloWorldLocal {

 public String say(String name) {
  return name + "说,hello world";
 }

}

然后将这个打包,并发布到Jboss里去。

然后将两个客户端测试类(一个是java Project,另一个是web project)
java project:

package com.itcast.ejb.client;

import javax.naming.InitialContext;

import com.itcast.ejb3.HelloWorldRemote;

public class EJBClient {

 /**
  * @param args
  */
 public static void main(String[] args) {
  
  try {
   InitialContext context = new InitialContext();
   HelloWorldRemote hello = (HelloWorldRemote)

context.lookup("HelloWorldBean/remote");
   //System.out.println(hello.getClass().getName

());
   System.out.println(hello.say("高歌对EJB"));
  } catch (Exception e) {
   System.out.println(e.getMessage());
  }
  

 }

}


web project

<%@ page language="java" import="javax.naming.*,com.itcast.ejb3.*"

pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()

+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
   
    <title>My JSP 'index.jsp' starting page</title>
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
 <meta http-equiv="keywords"

content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css">
 -->
  </head>
 
  <body>
   <%
 try {
  InitialContext context = new InitialContext();
  HelloWorldLocal hello = (HelloWorldLocal)

context.lookup("HelloWorldBean/local");
  //System.out.println(hello.getClass().getName());
  out.println(hello.say("高歌对EJB"));
 } catch (Exception e) {
  out.println(e.getMessage());
 }
 


   %>

这样,这两个客户端都可以测试通过,其中 java project是调用了远程接口,

web project是调用了本地接口
  </body>
</html>

 

然后将这个项目打包成EJBWebClient.war,将这个文件放到jboss的相应目录,然后打开浏览器,输入http://localhost:8080/EJBWebClient/

就可以看到正常的运行结果了,这是因为当前的这个客户端的.war文件和上面创建的HelloWorld.jar服务都是在jboss里运行的。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值