什么是EJB?

                                 Ejb3.0学习笔记(在Jobss下运行Ejb)
什么是EJB?
  全称是Enterprice JavaBeans是一个用于分布式业务应用的标准服务端组件模型。采用Enterprice JavaBeans架构编写的应用是可伸的,事务性的,多用户安全的。采用Ejb编写的这些应用,可以部署在任何支持Enterprice  JavaBeans 规范的服务器平台,如Jboss,WebLojic等。

Ejb是用来干什么的?
  EJB 实际上是用来编写业务层的代码。

EJB的好处
EBJ为我们提供了很多在企业开发中需要使用到的服务,如事务管理/安全/持久化/分布式,它大大减少了我门的开发工作量。

有关EJB的书籍:1.EJB3.0入门经典 2.EJB3.0实例教程 电子版 :http://www.foshanshop.net

5.JavaEE 中的主流服务器
      1.Jboss:是一个成熟的开源的准JavaEE应用服务器,在开源JavaEE应用服务器中所占的市场份额第一。如果你打算选用开源的JavaEE应用服务器,那么JBoss是最值得选择的。(4.2以上的版本)
        2.Glassfish:是一个开源的JavaEE应用服务器,对JavaEE规范支持非常好,其运行性能比较高。因为发展时间相对较短,和JBoss有的一拼。
       3.Weblogic:是市场占有率第一的商业JavaEE应用服务器,他具有出色的稳定性,并提供人性化的管理界面。但在EJB3.0的领域里,它比JBOSS差些,bug比较多。(10以上的版本)
      4.Sun Application Server:商业JavaEE应用服务器,如果打算用商业应用服务器运行EJB3.0的话,这个很好的。
      5.Oracle Application Server:商业JavaEE应用服务器,如果你的数据库是Oracle,要想兼容性更好,这个是不错的选择。
      6.apusic应用服务器:这是国内的商业JavaEE应用服务器,主要在政府中占有份额。但开发文档太少。
     注意:Tomcat目前只是Web容器,它不能运行EJB应用。

6.sping+hibernate同样提供了事务管理/持久化服务,好像没有必要使用EJB,这中说法对吗?
不对的。因为Ejb 设计的初衷是用于分布式场合,而Sping—开始就没有打算提供分布式功能。所以两者看似有竞争的关系,
但两者的实际上偏重点布同,像EJB比较适合用于大型的企业。为了避免业务功能的重复开发,有必要把业务独立处来,让多个信息系统共享一个业务中心,这样应用就需要具备分布式能力。

7.EJB3.0的运行环境(1.EJB3.应用需要运行在JDK1.5以上的版本)
   1.安装JBoss之前要安装JAVA_HOME.
        步骤:1.我的电脑》》属性》》高级》》环境变量,在‘在系统变量’里添加JAVA_HOME变量,值为JDK的安装路径,如   C:\java\jdk1.5.0_16
             2.在“在系统变量”在添加CLASSPATH变量,值为:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
             3.在系统变量栏里找到变量名为Path的选项,点’编辑’在变量值的末尾加:;%JAVA_HOME%\bin;

8.如何下载并安装Jobss
步骤:1.在Http://www.jboss.org/jbossas/downloads/ 官方网站下载最新版本的jboss.
               2. 下载4.2.3最新版的Jobss,5.0还是适用版,打开连
               3.Jdk1.6下载这个版本。Jdk1.5下载这个版   本的
               4.解压后就将Jobss安装好了。 然后启动run.bat 就可以启动Jobss (如果没有错误信息表示启动成功)
               5.在浏览器中敲Http://localhost:8080就可以进入管理后台了
               6.给Jobss添加系统变量  在我的电脑---》属性—》高级—》》设置》》》变量名写:JBOSS_HOME >>>路径写JBOSSde
                 安装路径,
               7.添加Bin  在变量值的末尾中写

9.Ejb3.0中的Bean
会话Bean(Session Bean)
分为:有状态的会话Bean;一个用户只能对一个实例
无状态会话Bean;性能好,bean的实例可以共多个用户使用
    负责与客户端交互,是编写业务逻辑的地方,在会话Bean中可以通过JDBC直接操作数据库,大多数情况下都是通过实体bean来完成对数据库的操作。
实体bean(entity bean)
它实际属于Java持久回规范(简称JPA)里的技术,JPA的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在的Hibernate,TopLink等ORM框架各自为营的局面。
消息驱动Bean(Message-driven bean)
         它是专门用于异处理Java消息的组件,具有处理大量并法消息的能力。

10.如何开发一个无状态的会话Bean
开发工具:Eclipse IDE for Java EE
下载地址:Http://www.eclipse.org/downloads
开发EJB依赖的jar文件
可以在Jboss安装路径的client目录下找到通常会把client目录下所有的jar文件添加到项目的类路径下。
创建一个EJB项目
给项目导入Jar包 
点击在Libraires中 Add External JARS添加Client的所有jar文件
开始开发一个无状态的的会话Bean

    10.1.开始开发无状态的会话Bean
            1.首先New一个接口
                           Public  interface HelloWord{
                                  Public String SayHello(String  name);
                           }
                     import javax.ejb.Stateless;
                     import javax.ejb.Remote;
                 2.再创建一个实现类
                          @Stateless(实现EJB)
                          @Remote(HelloWorld.CLass)代表远程接口
                          Public class HelloWordBean  implements HelloWord{
                                 Public String SayHello(String name){
                                  Return name+”你好,世界!”;
                               }}
                               在实现类中加入以上两句话就可以实现一个无状态的会话Bean
开发完成后对EJB进行打包,
通过集成工具进行打包
导出----》》选择Jar文件----》》下一步-选择文件—》》完成
生成一个jar文件

发布EJB
启动JBoss
在EJB的Default/Depoly目录下发布,将EJB的jar文件拷贝到Jboss的Depoly目录下完成EJB的部署,发布成功

11.开发EJB的客户端
        public class EjbClient {
        public static void main(String[] args) {
   Properties props=new Properties();
   props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
   props.setProperty("java.naming,provider,url", "localhost:1099");
   try{
   InitialContext ctx=new InitialContext(props);
   HelloWorld helloworld=(HelloWorld)ctx.lookup("HelloWorldBean/remote");
   System.out.println(helloworld.SayHello("老头?"));
   }catch(NamingException e){
   System.out.println(e.getMessage());
   }
     }
}
Jboss 默认生成的JNDI名称
当EJB 发布到Jboss上时,如果我们没有为它指定全局JNDI名称或修改过其默认EJB名称,Jboss就会按照规则默认的命名规侧为EJB生成全局的JNDI名称,默认为
本地接口:EAR-File-BASE—NAME/EJB-CLASS-NAME/LOCAL
远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
EAR-FILE-BASE为ear文件名,EJB—CLASS-NAME为EJB的非限定类名。
把HelloWorld 应用作为EJB模块打包进名为HelloWorld.ear的企业应用文件,它的远程接口的JNDI名称是:HelloWorldBean/remote

如果把EJB应用打包成后缀为.jar的模块文件,默认的全局JNDI名称是
 本地接口:EJB-CLASS-NAME/local
  远程接口:EJB-CLASS-NAME/remote
例:把HelloWorld  应用打包成HelloWrld.jar 文件,它的远程接口的JDNI名称是:
HelloWorldBean/remote
12.把Jboss集成进Eclipse
  1.操作步骤:
    在控制台中:1.右键 New->Server
                2.选中你说需要的服务器版本
                    3.在JRE 中选中JDK的版本,Application ServerDirectory  中选中你jboss 的安装路径 
                    4.下一步,然后完成。(Ctrl+C)可以关闭Jboss。
13.通过ANT提高EJB应用的开发效率
        源码:<project name="HelloWorld" basedir=".">
          <property  name="src.dir" value="${basedir}\src" />
          <property environment="env"/>
         <property name="jboss.home" value="${env.JBOSS_HOME}"></property>
        <property name="jboss.server.config" value="default"></property>
       <property name="build.dir" value="{basedir}\build"/>
    
       <path id="build.classpath">
              <fileset dir="${jboss.home}\client">
                   <include name="*.jar"/>
              </fileset>
     </path>
   
    <target name="prepare">
              <delete dir="${build.dir}"/>
              <mkdir dir="${build.dir}"/>
    </target>
    
     <target name="compile" depends="prepare" description="编译">
            <javac srcdir="${src.dir}" destdir="${build.dir}">
                    <classpath refid="build.classpath"/>
            </javac>  
     </target>
    
    <target name="ejbjar" depends="compile" description="创建EJB发布包">
           <jar jarfile="${basedir}\{ant.project.name}.jar">
                  <fileset dir="${build.dir}">
                       <include name="**/*.class"/>
                  </fileset>
           </jar>
    </target>
    
     <target name="deploy" depends="ejbjar" description="发布EJB包">
           <copy file="${basedir}\${ant.project.name}.jar"     todir="${jboss.home}\server\${jboss.server.config}\deploy"/>
     </target>
    
     <target name="undeploy" description="卸载ejb">
           <delete file="${jboss.home}\server\${jboss.server.config}\deploy\${ant.project.name}.jar"/>
     </target>
</project>
14.开发具有本地接口的无状态BEAN
      1.开发具有Local接口的 Session Bean 
通过远程接口调用EJB的过程,首先客户端需要与EJB建立起Socket通讯,在通信管道上他们之间需要来回发送IIOP协议消息,因为数据要在网络进行传输,存数据的Java对象必须要进行序列化。
Socket通讯
IIOP消息
              在这个过程中,有网络通信的开销,协议解析的开销,对象序列化的开销。因为EJB是分布式技术,它允许客户端与ejb应用在
不同的机器上,所以这些性能开销也是必然的。但是在实际生产中,我门不可能避免这种情况:客户端与EJB应用运行在同一台机器上的同一个JBoss中。那么,这个时候客户端和EJB是否还进行网络通讯呢?不需要。这个时候客户端和EJB在同一个Jvm中,他们完全可以通过内存进行交互,可以避免上面的性能开销。于是,可以通过引入本地接口。通过本地接口调用EJB 直接在内存中交互。这样就可以避免因网络通信所造成的各种性能的开销。但是,只有客户端和EJB应用都在同一个Jvm内运行的时候,我们才能调用本地的接口,否则只能调用远程接口。只要客户端与ejb发布在同一个jboss中,我们就认为他们在同一个Jvm中。
2开发一个Local接口
   步骤:1.建立一个动态的Java Web 项目,并创建一个Jsp也页面.
         2.在页面中调用EJB应用
         3.再在Web项目中右键 属性》》Java Build Path>>Project >>添加包含EJB接口的项目》》然后在再页面中导入包即可
                   4.再在Web项目中右键 Export>>War file>>保存在一个盘中
                   5.然后将刚才的war包粘贴到Jboss的发布目录下
            6.然后启动Jboss,就可以运行了
15.开发有状态BEAN
     1.在类的前面用 @Stateful (内--->磁盘较钝化,磁盘---->内存叫激活)
        2.无状态Bean使用实例池技术管理Bean。
        3.有状态Bean使用激活(activation)管理bean。(是要为每个用户创建一个BEAN实例,这个实例只能为这个用户服务,他是不能被其他的用户访问的)
        开发完后部署到EJB容器中
16.通过注解方式并使用其他EJB或者服务
   1在一个EJB中调用另外一个EJB
     方法1;通过JNDI查找的方法
         Eg:  InitialContext ctx=new InitialContext();
              Other other=(Other)ctx.lookup(“OtherBean/local”);
               Other.XXX();
               Other 是被调的EJB接口,OtherBean是被调EJB的实现类,
     方法2:通过注解的方法调用另外一个EJB
         在要调另外一个EJB的EJB中写上
           @EJB  Other other;
               Other.XXXX();
注意:注解的工作原理:EJB容器解析到类的字段发现@后就去找是否有实现这个接口的EJB,然后将其注入进来。如果被两个EJB实现,将会抱个错,但是我们注入时可以这样注入
  Eg; @EJB(beanName=”OtherBean”)  Other   other;   Statefull(name=””)可以修改EJB名称
                          EJB的名称,即类名
2.如何注入定时服务
     1>>.注入数据源:@Resource  TImerService  timerervice;
     2>>.@Resource(mappedName=”java:XXX”) DataSource  dataSource;
                  “ ”中用于指定数据源的JDNI名称;
17.配置JBOSS数据源
       1.首先找到JBOSS的数据源配置模板,在JBOSS的安装目录下的Docs/examples/jca
        2.修改JNDI名称 <jndi-name>itcastDS</jndi-name>          写自己创建的数据源的名称
                      <connection-url>jdbc:mysql://localhost:3306/数据库名称 </connection-url>
                      <driver-class>com.mysql.jdbc.Driver</driver-class>
                     <user-name>x</user-name>   数据库的用户名和密码
                     <password>y</password>    
2数据源的文件必须为XXX—ds.xml为结尾
3.将MySql的驱动文件拷贝到JBOSS目录下的Server/Default/lib目录下 
4.重启JBoss,然后发布配置文件,将数据文件拷贝到JBOSS安装目录的Server/default/deploy下就可以了。
注意: 在Java:XXX后面的JDNI所绑定的资源,只能被JBoss的内部服务访问,不能被外部访问。
http://localhost:8080/jmx-console可以进行访问,然后找到Jboss.Jca 就可以找到我们刚才发布的数据源信息然后点击ManagedConnectionPool就可以进入数据源的连接属性  
<min-pool-size>3</min-pool-size>
   <max-pool-size>100</max-pool-size> 
设置最大的连接数和最小的连接数,InUse ConnectionCount 正在使用的连接数量,如过和Max相等代表不够用要设大一些。
17.实体Bean 的开发
     它属于Java持久化规范(简称JPA)里的技术,实体bean 通过元数据在javaBean和数据库表之间建立起映射关系,然后Java程序员就可以随心所欲的使用面向对象的编程来操纵数据库。JPA的出现主要是为了简化现有的持久化开发工作和整合ORM技术,目前实现的JPA规范的主流产品有Hibernate,TopLink和OpenJPA,在jboss中采用了Hibernate作为其持久化实现产品。
根据JPA规范的要求,在实体bean应用中,我们需要在应用的类路径下的META-INF目录加入持久化配置文件persistence.xml.
  

你可能感兴趣的:(应用服务器,bean,javaee,jboss,ejb)