« Java开源GIS项目OpenJUMP | Main | JavaFX博客大赛 »
http://developers.sun.com.cn/blog/functionalca/date/20090621 星期日 2009年06月21日

EJB简介

作者:曹祺
Blog: http://blogs.sun.com/greysh
Web: http://www.greysh.com
Email: Qi.Cao@Sun.com
本文链接:
http://developers.sun.com.cn/blog/functionalca/entry/ejb%E7%AE%80%E4%BB%8B
源代码下载:
http://developers.sun.com.cn/blog/functionalca/resource/Greysh/FCA_Greysh_Ejb.zip  
难度:入门

EJB作为JavaEE的核心规范,然而大部分程序员使用的Spring,Struts,Hibernate都不是JCP的标准规范。但是作为规范,还是有很多厂家支持的.Hibernate支持者的一片呼声中,Ejb3Ejb2修改了很多.200956日,JCP委员会通过了JSR 318Proposed Final Draft,详情见http://jcp.org/en/jsr/detail?id=318

EJB简介
EJB Session Bean HelloWorld

EJB简介
 
Ejb作为一种规范,而不是一种产品。包含很多内容,有很多产品去实现,比如Sunglassfishjbossjboss asbea(已经被Oracle收购)的weblogicIBMWebSphere.
   
Ejb 3hibernate很多相似的地方,当然EJB 3.0Entity bean specification的实际领导人是Hibenate创始人Gavin King.比如EJB 3EJB QLHibernateHQL很类似.Ejb也支持类似Spring的依赖注入(DI),然而和传统的技术相比,Ejb有一些明显特性 (当然,传统技术也在不断提升和相互整合新的开发思想).
 
  
分布式负载均衡
 
Ejb作为企业级Javabean,考虑到企业信息的复杂性,开始便考虑到分布式,比如Ejb RemoteLocal接口分别用来为远程JVM和本地JVM的客户端设计的。使用的时候只要在实现Bean中加上@Remote或者@Local即可。远程接口是为了分布式,但是本地接口资源开销要好一些.
   
当然,和web service相比,ejb使用的时候需要占用服务器的特定端口,比如Jboss使用的1099Sun应用服务器使用的3700.web service只要告诉客户端wsdl的地址既可,传的SOAP都是用HTTP协议和80端口。而web service传输的是XML的文本流。Ejb传输的是二进制。EJB可以整合Web Service
  
   
Enterprise Java Beans
   
   
Ejb有三种Bean,分别是Session BeanEntity BeanMessageDriven Bean
   
Session Bean分为StatelessStateful,两者的区别在于前者由EJB容器 管理时候的声明周期无状态,取决于容器。而后者是有状态的,当与用户的交互结束后也销毁了。

     Entity Bean是实体bean,是一个POJO
   
        
MessageDriven BeanJMS中用于消息驱动的,因为异步消息很节省资源,因此也使用很多.

 ORMEJB QL
       
EJB的JPQLHibernateHQL很类似,是一种面向对象的查询语句,但是EJB本身也支持Native SQL语句。对于JavaEE的事务处理是JTA,JavaSE的事务处理RESOURCE_LOCAL.
        这一模块详情可以查阅JPAJava持久化API

        安全
    
EJB提供了Java Authentication and Authorization Service(JAAS),只需要简单的修改下配置即可。当然JAAS也可以的权限和用户也可以整合到数据库

EJB Session Bean HelloWorld
以下代码运行环境为
JDK 1.6 Update 14
JbossAS 4.2社区版
测试用Junit 4 

本例为无状态session bean,仅仅其抛砖引玉作用,是一个helloworld程序
采用remote接口
package com.greysh.ejb;
import javax.ejb.Remote;
@Remote
public interface HelloEjb {
    public String say(String msg);
} 

实现代码
package com.greysh.ejb;
import javax.ejb.Stateless;
import com.greysh.ejb.HelloEjb;
public @Stateless class HelloEjbBean implements HelloEjb {
public String say(String msg) {
       return msg;
    }
}
jar命令打包后放在jbossASjboss\server\default\deploy即可,jboss会自动部署
21:56:20,656 INFO 
[EJB3Deployer] Deployed: file:/D:/jboss/server/default/deploy/FCA_Greysh_Ejb.jar
如果部署成功,则可以在Global JNDI Namespace中查到
+- HelloEjbBean (class: org.jnp.interfaces.NamingContext)
  |   +- remote (proxy: $Proxy323 implements interface com.greysh.ejb.HelloEjb,interface org.jboss.ejb3.JBossProxy) 

然后编写客户端,编写的时候需要将jbossclient目录的jar加到build path
        
@BeforeClass
            
 public static void setUpBeforeClass() throws Exception {
           
  Properties props = new Properties();        
               
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
               props.setProperty("java.naming.provider.url", "localhost:1099");
               InitialContext ctx = new InitialContext(props);
 
             setHelloEjb((HelloEjb)ctx.lookup("HelloEjbBean/remote"));
         }

       @Test
    
      public final void testSay() {
     
        assertEquals("HiEjb", getHelloEjb().say("HiEjb"))
         
 }
       
}

 

 



发表于 Sun Functional 校园大使 [JavaEE] ( 六月 21, 2009 10:53 下午 ) Permalink | 评论[0]
评论:

发表一条评论:
  • HTML语法: 禁用