EJB作为J2EE标准的一部分,与Spring struts2等轻量级框架不同,EJB天生就是为了分布式而设计的重量级企业框架,说到EJB,自然会想到的是:分布式!如果如果一个应用要进行分布式部署,需要分布式事务的支持,需要支持不同的客户端,那么EJB是一个不错的选择.
EJB根据bean的类型,将它们分为有一种类型,关于下面三种类型,在以后的章节中将会一一讲到.
- 会话bean
- 消息驱动bean(MDB)
- 实体
接下来简单认识一下如何搭建一个EJB环境.
首先我使用的的jboss-as-7.1.1.Final ,这里在可以在jboss那里下载,开发环境使用EJB3.1,基于MyEclipse 10
第一步:下载 jboss服务器
第二步
创建一个EJB项目:指定项目名称EJBTest , 选择使用EJB3.1 , 选择不使用JPA,点击完成
新建一个接口:
package gd.hz.ejb;
public interface HelloEJB {
public String say(String name) ;
}
实现HelloEJB这个接口
package gd.hz.ejb.bean;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import gd.hz.ejb.HelloEJB;
@Stateless
@Remote
public class HelloEjbBean implements HelloEJB {
@Override
public String say(String name) {
return "你好啊" + name ;
}
}
关于@Stateless 和@Remote在以后的章节会介绍到,将EJB项目部署到JBOSS中,可以看到其部署时的类名称为HelloEjbBean(一般为类的名称).这样我们在其它客户端可以通过这个名称查找.
将接口HelloEJB打包为jar文件,注意只要导出接口就可以了
选择导出jar文件:
选择需要导出的接口和存放的位置,点击完成:
第三步:新建一个普通java客户端:
引入之前导出的HelloEJB接口:
新建一个EJBTestClient普通java类,生成main方法:
package gd.hz.ejb.client;
import java.util.Hashtable;
import gd.hz.ejb.HelloEJB;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class EJBTestClient {
/**
* @param args
*/
public static void main(String[] args) {
Hashtable<String , String> jndiProperties = new Hashtable<String, String>();
//让JNDI API知道是由谁来管理我们用来查找JNDI 名字的命名空间的。
jndiProperties.put(Context.URL_PKG_PREFIXES , "org.jboss.ejb.client.naming");
try {
/*
JNDI: ejb:appName/moduleName/distinctName/beanName!viewClassName
appName:这里是.EAR包的名称,如果你打包成JAR发布的话,这里则留空
moduleName:表示模块名,也就是ejb包名,但不包括后缀.jar,如admin_ejb.jar。moduleName为admin_ejb
distinctName:如果没有定义其更详细的名称,则这里留空
beanName:这里为实现类的名称
viewClassName:为接口全路径名称
*/
Context context = new InitialContext(jndiProperties);
HelloEJB hello = (HelloEJB)context.lookup("ejb:/EJBTest//HelloEjbBean!gd.hz.ejb.HelloEJB");
System.out.println(hello.say("lfd"));
} catch (NamingException e) {
e.printStackTrace();
}
}
}
引入%JBOSS_HOME%\bin\client/jboss-client.jar到classpath路径下.
在classPath下增加“jboss-ejb-client.properties”文件 ,用于jndi查找.
endpoint.name=client-endpoint remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default remote.connection.default.host=127.0.0.1 remote.connection.default.port=4447 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
运行客户端,输出:你好啊lfd
下面是整个例子,这里我没有引入J2EE的jar包.是由MyEclipse帮我引入的,所以要注意.