一:远程定义:
接口:
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里运行的。