什么是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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值