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帮我引入的,所以要注意.