EJB30学习笔记.docx
《EJB30学习笔记.docx》由会员分享,可在线阅读,更多相关《EJB30学习笔记.docx(10页珍藏版)》请在冰点文库上搜索。
EJB30学习笔记
1,EJB中有三种bean:
1)会话bean(sessionbean):
负责与客户端交互,是编写业务逻辑的地方,在会话bean中可以通过jdbc直接操作数据库,但大多数情况下都是通过尸体bean来完成对数据库的操作;
2)实体bean(entitybean):
它实际上属于java持久化规范(简称JPA)里的技术,JPA的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink等ORM框架各自为营的局面;
3)消息驱动(message-drivenbean):
它是专门用于异步处理java消息的组件,具有处理大量并发消息的能力;
2,会话bean分为无状态会话bean和有状态会话bean:
1)无状态会话bean:
平常,我们使用最多的是无状态bean,因为它的bean示例可供多个用户使用,所以它的性能比有状态bean高【正因为一个bean示例被多个用户使用,那么,前一个用户设置的值有可能被后一个用户所修改,所以它无法正确保存某个用户设置的值,因此是无状态的;
2)有状态会话bean:
有状态bean平常使用的并不多,因为它的一个bean实例只供一个用户使用,所以性能开销比较大,正因为它的实例只被一个用户使用,那么用户设置的值是不会被其他用户所修改的,所以可以正确保存用户设置的值,因此是有状态的;
3,开发EJB的工具:
EclipseIDEforJavaEE
开发EJB依赖的jar文件:
可以在jboss安装路径下的client目录下找到,通常会把client目录下的所有jar文件添加到项目的类路径下;
4,EJB的发布过程就是一个拷贝的过程:
将jar文件拷贝到:
jboss安装目录-server-default-deploy下面;就ok了;
第三讲:
开发EJB的客户端
1,因为EJB在软件分层结构上属于业务层,通常它需要被客户端所调用:
常用的客户端有j2se,web应用,j2me;
2,我们可以通过一个属性文件来设置JNDI的上下文信息;在项目的类路径下简历jndi的属性文件,jndi.properties;也可以在src目录下建立,也同样可以编译到类路径下面;
3,jndi文件的内容如下:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:
1099
...
4,当写完jndi.properties文件后,客户端下面代码:
InitialContextctx=newInitialContext();构造函数就会在类路径下找相应的属性配置文件;自动加载;
第四讲:
把jboss集成到eclipse中
1,window-showview-other-Server-servers然后再控制台上出现了servers视图,我们点击server,空白处右键new-server-...
第五讲:
通过ANT提高EJB应用的开发效率
1,为了提高开发效率,大部分企业在ejb开发中引入ant,来进行操作;
2,通过ant完成项目的编译,打包,发布,解发布;在eclipse中已经集成了ant工具;
3,在项目根目录底下新建ant的配置文件build.xml;
4,ant配置详解:
//----这句话表示定义一个属性变量;value为属性值
//---这句话的意思是引入系统的环境变量,即系统环境变量-系统变量;
//--这里env指向系统变量,去里面的jboss配置项JBOSS_HOME;
上面和在java中定义变量是一样的;
//----------包含所有的jboss的jar包
//---这项工作的目的是创建路径
//refid表示引用id;
//---卸载EJB就是直接将jar文件给删除就行了;
第六讲:
开发具有本地接口的无状态bean
1,之前,我们介绍过远程接口,在这里,我们需要了解一下通过远程接口调用ejb的过程,首先,客户端与ejb之间建立socket通信,在通信管道上它们之间需要来回发送IIOP协议消息,因为数据要在网络上进行传输,存放数据的java对象必须要进行序列化;
客户端<_socket通信IIOP____>EJB
在这个过程中我们看到,有网络通信协议的开销,协议解析的开销,对象序列化的开销,因为ejb是分布式技术,它允许客户端与ejb应用不在同一台机器上,所以这些性能开销是必然的,但是在实际生产中,我们不可避免这种客户端情况:
客户端和ejb在同一个jboss中;为了解决这个问题,ejb采用如下方案:
当客户端和ejb在同一个JVM内运行的时候,我们调用本地接口,否则只能调用远程接口。
谈到这里,有同学会问什么情况下客户端与EJB应用是在同一个JVM的呢?
我们可以这样简单的理解,只要客户端与ejb发布在同一个jboss内,我们就认为他们在同一个JVM内;
第七讲:
开发有状态bean
1,bean实例的两种管理技术:
1)无状态bean使用实例池技术管理bean;所有用户共用一个bean;如果用户在实例池中取得一个对象的时候,那么这个对象是不能被其他对象所用的,只有等该用户用完了,才可以用;实例池就是里面初始化的几个对象而已;用最小的对象数,来为用户提供服务;
2)有状态bean使用激活(activation)管理bean---当一个bean超过一段时间不用时,系统将这个bean序列化到磁盘上,当在真个会话时间内,用户再次访问该bean,则将该bean加载到内存中,如果超过会话时间,则清楚该序列化bean;其中序列化到磁盘上的过程叫做钝化,从磁盘加载到内存中的过程被称为激活;给每个用户创建一个新的bean;
第八讲:
通过注解方式注入并使用其他EJB或者服务
1,EJB之间的互相调用:
如果要在一个ejb中调用另一个ejb的话,有两种方法:
第一种采用jndi查找法,另一种方法就是依赖注入,即注解;
通过第一种方法例子:
@Stateless
@Remote(HelloWorld.class)
@Local(HelloWorld.class)
publicclassHelloWorldBeanimplementsHelloWorld,HelloWorldLocal{
publicStringsayHello(Stringname){
try{
InitialContextctx=newInitialContext();
Otherother=(Other)ctx.lookup("OtherBean/local");
returnname+"说:
你好,"+other.sayMe();
}catch(NamingExceptione){
e.printStackTrace();
}
returnnull;
}
}
通过第二种方法例子:
publicclassHelloWorldBeanimplementsHelloWorld,HelloWorldLocal{
@EJBOtherother;
publicStringsayHello(Stringname){
returnname+"说:
您好,"+other.sayMe();
}
}
//如果多个EJB实现了同一个接口,那么我们可以采用如下方式制定具体调用哪一个EJB;
@EJB(beanName="OtherBean")Otherother;//beanName为具体的接口实现类名称;
也可以注入数据源:
@Resource(mappedName="java:
xxx")DataSourcedataSource;//mappedName对应于数据源的jndi名称;
第九讲:
配置jboss数据源
1,数据源可以减少数据库连接对象的创建数量;
2,数据源配置文件必须以-ds包含在配置文件名中:
例如:
mysql-ds.xml;-ds时jboss才认为它是一个数据源;jboss的数据源配置模板在jboss安装目录下的sample-jca-找...
第十讲:
开发单表映射的实体bean
1,实体bean--它属于java持久化规范(简称JPA)里的技术,实体bean通过元数据在javabean和数据库表之间建立起映射关系,然后java程序员就可以随心所欲的使用面向对象的编程思想来操纵数据库。
JPA的出现主要是为了简化现有的持久化开发工作和整合ORM技术,目前实现的JPA规范的主流产品有Hibernate,TopLink和OpenJPA,在jboss中采用了Hibernate作为其持久化实现产品;
2,添加JPA的配置文件persistence.xml--根据JPA规范的要求:
在实体bean应用中,我们需要在应用的类路径下的META-INF目录加入持久化配置文件persistence.xml
xmlversion="1.0"?
>
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
version="1.0">
3,实体bean必须要保留一个无参的构造函数,这是JPA规范所规定的;
publicPerson(){}
publicPerson(Stringname){
this.name=name;
}
4,数据传输过程中,是需要序列化的;
5,实体bean:
......
@Entity
@Table(name="person")
publicclassPersonimplementsSerializable{
privateIntegerid;
privateStringname;
@Id@Column(name="id")@GeneratedValue(strategy=GenerationType.AUTO)
publicIntegergetId(){
returnid;
}
publicvoidsetId(Integerid){
this.id=id;
}
@Column(name="name",length=20,nullable=false)
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
}
第十一讲:
开发消息驱动
1,java中如果一个对象需要通过网络传输,则必须实现序列化接口,否则是错误的;
2,java消息服务(JavaMessageService,简称JMS)是用于访问企业消息系统的开发商中立的API。
企业消息系统可以协助应用软件通过网络进行消息交互;JMS的编程过程很简单,概括为:
应用程序A发送一条消息到消息服务器的某个目的地(Destination),然后消息服务器把消息转发给应用程序B。
因为应用程序A和应用程序B没有直接的代码关联,所以两者实现了解耦;
3,消息传递系统的中心就是消息。
一条消息由三个部分组成:
头(header),属性(property)和主题(body)。
消息有下面几种类型,它们都是派生自Message接口。
StreamMessage:
一种主体中包含Java基元值流的消息。
其填充和读取均按顺序进行;
MapMessage:
一种主体中包含一组名-值对的消息,没有定义条目顺序;
TextMessage:
一种主体中包含Java字符串的消息(例如,XML消息);
ObjectMessage:
一种主体中包含序列化Java对象的消息;
BytesMessage:
一种主体中包含连续字节流的消息;
4,消息的传递模型:
JMS支持两种消息传递模型:
点对点(point-to-point,简称PTP)和发布/订阅(publish/subscribe,简称pub/sub).这两种消息传递模型非常相似,但有以下区别:
PTP消息传递模型规定了一条消息只能传递给一个接收方。
采用javax.jms.Queue表示;
pub/sub消息传递模型允许一条消息传递给多个接收方。
采用javax.jms.Topic表示,这两种模型都通过扩展公共基类来实现。
5,配置目标地址:
开始JMS编程前,我们需要先配置消息到达的目标地址(Destination),因为只有目标地址存在了,我们才能发送消息到这个地址。
由于每个应用服务器关于目标地址的配置方式都有所不同,下面以jboss为例,配置一个queue类型的目标地址。
xmlversion="1.0"encoding="UTF-8"?
>
service=Queue,name="foshanshop"">
queue/foshanshop
jboss.mq.service=DestionManager
jboss使用一个XML文件配置队列地址,文件的取名格式遵守"-service.xml"
属性指定了该目标地址的全局JNDI名称,如果你不指定JNDIName属性,jboss会为你生成一个默认的全局JNDI,其名称由queue+"/"+目标地址名称组成,另外在任何队列或主题被部署之前,应用服务器必须先部署DestinationManagerMbean,所以我们通过节点声明这一依赖;
第十二讲:
开发EJB容器模型的WEB服务
1,Web服务也是一种分布式技术,它与EJB最大的不同是,Web服务属于行业规范,可以跨平台及语言,而EJB属于Java平台的规范尽管理论上可以跨平台,但实现起来还是比较复杂的,所以其应用范围局限于java平台,看上去两者好像是互相竞争的关系,其实不是,它们两者的偏重点不一样,Web服务偏重的是这个系统对外能提供什么功能,这是web服务的关注点,对于怎样组装这个硬盘,怎样构造这些小零件,web服务并不关心但这些却是EJB所关注的。
JavaEE为Webservice提供了两种不同的编程模型;EJB容器模型及Web容器模型,这里将以最新的JAX-WS2.X规范(JavaAPIforXML-basedWebService)介绍webservice的开发;
@WebService(targetNamespace="",
name="HelloWorld",
serviceName="HelloWorldService")