上篇对EJB进行了简单的介绍:EJB系列(一)---简介
本篇,我们来做一个小demo简单介绍EJB开发的步骤。
开发环境:eclipse +Jboss 6.2 + jdk 1.8
开发环境搭建好之后,进入正式的编程阶段。
服务器端
(1)新建一个EJB Project项目
(2)定义一个远程接口
可以在接口上,加上@Remote。也可以在接口的实现类上加上这个注解。(@Local表示本地)
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">package com.tgb.ejb;
public interface FirstEjb {
public String saySomething(String name);
}</span></span>
(3)定义一个接口的实现类
@Stateless表示的是无状态会话bean,@Statefull表示的是有状态会话bean,区别是前者比后者效率高,但是不能保留后者那种在会话中的数据。
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">package com.tgb.ejb;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
@Stateless
@Remote
public class FirstEjbBean implements FirstEjb {
@Override
public String saySomething(String name) {
return "你好, " + name;
}
}
</span></span>
(4)将其部署到jboss上。
客户端
(1) 新建一个Java Project项目
(2)引入%jboss_home%/client/下的jar包
(3)编写测试类
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">package com.tgb.ejb;
import javax.naming.InitialContext;
public class FirstEjbClient {
//测试类
public static void main(String[] args) throws Exception {
//初始化上下文-----不同的应用服务器初始化上下文的工厂类是不同的,协议也可能不一样。
InitialContext ctx = new InitialContext();
FirstEjb ejb = (FirstEjb)ctx.lookup("FirstEjbBean/remote");
String s = ejb.saySomething("baby");
System.out.println(s);
}
}
</span></span>
InitialContext主要方法的使用:
void bind(String name,Object object); //将名称绑定到对象。如果已经存在,则抛出异常。
void rebind(String name,Object object); //将名称绑定到对象。如果对象存在,则重写所有绑定
void rename(String oldName,String newName); //把某一个已经绑定的旧名称改成新名称
void unbind(String name); //取消指定对象的绑定
Object lookup(String name); //查找指定对象
Jboss下配置JNDI名称
当EJB发布到Jboss时,如果没有为它指定全局的JNDI名称或修改过其默认EJB名称,Jboss就会按照默认的命名规则为EJB生成全局JNDI名称,默认的命名规则如下:
如果把EJB作为模块打包进后缀为*.ear的JavaEE企业应用文件,默认的全局JNDI名称是
本地接口:ear-file-base-name/ejb-class-name/local
远程接口:ear-file-base-name/ejb-class-name/remote
ear-file-base-name为ear文件的名称,ejb-class-name为EJB的非限定类名。
例如:把HelloWorld应用作为EJB模块打包进名为HelloWorld.ear的企业应用文件,它的远程接口的JNDI名称是:HelloWorld/HelloWorldBean/remote
如果把EJB应用打包成后缀为*.jar的模块文件,默认的全局JNDI名称是
本地接口:ejb-class-name/local
远程接口:ejb-class-name/remote
例如:把HelloWorld应用打包成HelloWorld.jar文件,它的远程接口的JNDI名称是:HelloWorldBean/remote
(4)设置JNDI访问环境信息
JNDI为JavaEE平台提供了一个通过名字查找网络中一切对象的标准机制,是一套为开发者提供通过名字方便查找用户、机器、网络、对象和服务的Java API,JNDI实现了EJB对象位置的透明性,客户端只要能方位JNDI服务,便可以调用EJB服务。设置JNDI访问环境信息,主要是设置JNDI驱动的类名(java.naming.factory.initial)和命名服务提供者的URL(java.naming.provider.url):
方式一:设置系统属性,此部分需要写在测试类中。
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">Properties props=new Properties();
props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
//可以将"java.naming.factory.initial"替换成Context.INITIAL_CONTEXT_FACTORY,环境属性名,用于指定InitialContext工厂(JNDI驱动),
//它雷速与JDBC指定数据库驱动类,因为本例子连接的是JbossNS,所以使用Jboss提供的驱动类:org.jnp.interfaces.NamingContextFactory
props.setProperty("java.naming.provider.url","localhost:1009"); //”localhost:1009”也可以写成”jnp://127.0.0.1:1009”
//可以将"java.naming.provider.url"替换成Context.PROVIDER_URL,环境属性名,包含提供命名服务的主机地址和端口号。它类似于JDBC指定数据库的连接URL。
//连接到JbossNS的URL格式为:jnp://host:port,改URL的“jnp”部分是指使用的协议,Jboss使用的是基于Socket/RMI的协议。
//Host为主机的地址,port为JNDI服务的端口。除了host之外,其他部分都是可以选择写的。
props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");</span></span>
方式二:src下添加jndi.properties
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://localhost:1009</span></span>
方式三:通过命令行设置。
服务器端与客户端交互
(1)将服务器端的接口导出成jar包。选中接口---右键----选择“Export....”
(2)将服务器端导出的jar包,引入到客户端。
运行测试,客户端就可以成功调用服务器端了。