最近项目进入系统测试阶段,全赖袁大虾领导有力,保持一周零bug记录,这也让自己腾出不少时间补充知识。花了两天时间把“传智播客EJB3.0”看完了,EJB基本的知识也有些了解,在这记录下EJB的部分知识,以供自己以后复习使用。
EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序。EJB (Enterprise JavaBean)是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。EJB依赖Web服务器,通常入门级推荐使用Jboss服务器,并且Jboss服务器提供了Ejb必备的jar包。
EJB中包含三种bean:
①会话bean:负责与客户端交互的bean,主要完成业务逻辑操作,类似于J2EE三层架构(表现层、业务层、持久层)中的业务逻辑层。
②实体bean:java持久化规范(JPA)中的技术,类似于三层架构的持久层,与数据库打交道,Hibernate等经典ORM框架实现了JPA技术。
③消息驱动bean:用户异步处理java消息的组件,具有处理大量并发消息的能力,比如转发短信功能。
bean分两种状态:
①有状态bean:一个实例仅供一个用户使用,性能开发较大。
有状态bean管理对象使用的是激活技术:
用户初次调用bean时,首先实例化bean
用户调用结束,垃圾回收器会回收bean,在回收前EJB会将该bean对象通过序列化放入硬盘中(此为钝化)
当用户再次调用该bean时,EJB又从硬盘反序列对象到内存中形成实例供用户使用(此为激活)
@Stateful //指定当前Bean为有状态Bean
@Remote(StatefulRemote.class)
@Local(StatefulLocal.class)
public class StatefulImpl implements StatefulLocal,StatefulRemote{
@Override
public String say(String s) {
return "有状态Bean :"+s;
}
}
②无状态bean:一个实例可供多个用户使用,性能高,但线程可能不安全。
无状态bean使用实例池技术管理:类似于数据库连接池,预先创建几个bean实例,用户请求来之后EJB给用户分配空闲的bean实例,如果都不空闲则等待,直到有空闲实例或超时为止。
@Stateless //指定当前bean为无状态bean
@Remote(StatelessRemote.class)
@Local(StatelessLocal.class)
public class StatelessImpl implements StatelessLocal,StatelessRemote{
@Override
public String say(String s) {
return "无状态Bean :"+s;
}
}
EJB的分布式技术决定了EJB可以远程调用,所以EJB的bean又分两种类型:远程和本地
①远程接口:客户端与EJB可以不在同一台电脑或者同一个服务器,只要网络畅通,可以通过远程调用即可获得客户需要的信息。客户远程访问EJB是通过Socket通信实现,具体的实现方法已经写好,用户只需要指定该接口为远程即可。
②本地接口:如果客户端与EJB在同一部署服务器下,客户端即可调用本地接口的EJB。此时因为在同一台电脑下,EJB不会通过Socket的方式通信,所以本地接口的运行速度是比远程接口要快的。
用户通过注解可以很方便的定义哪些接口为远程,哪些接口为本地(不是说所有bean都必须要有远程和本地两接口,这是根据项目需要来定,你也可以只做一个本地接口或一个远程接口)。
@Remote(StatelessRemote.class)
@Local(StatelessLocal.class)
【部署EJB】
通常用户需要把EJB打成jar包,然后放入Jboss服务器(可以是启动状态)server下的指定目录deploy文件夹下即可,具体的部署方式建议大家看视频或百度谷歌学习。
【调用EJB】
如果EJB部署成功,用户可以通过JNDI调用指定bean来测试。前面已经说了,本地接口类型的bean是需要新建一个j2ee项目并且部署到同一jboss下测试;而远程接口的bean则只要客户端不在jboss服务器下均可测试。
远程接口测试方法:
public class EjbClient {
public static void main(String[] args) throws NamingException {
//获取创建EJB JNDI
InitialContext ctx = new InitialContext();
//有状态bean使用激活管理bean
StatefulRemote stateful = (StatefulRemote) ctx.lookup("StatefulImpl/remote");
System.out.println(stateful.say("xxoo"));
System.out.println("---------------------");
//无状态bean使用 实例池技术管理bean
StatelessRemote stateless = (StatelessRemote) ctx.lookup("StatelessImpl/remote");
System.out.println(stateless.say("ooxx"));
}
}
注意InitialContext会默认读取名为“jndi.properties”文件的信息以获得JNDI上下文环境。
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:1099
本地接口的测试方法:
首先新建一个web项目,进入时默认访问一个jsp页面,在jsp页面中写如下代码:
<body>
<%
//获取创建EJB JNDI
InitialContext ctx = new InitialContext();
//调用本地接口
StatefulLocal stateful = (StatefulLocal) ctx.lookup("StatefulImpl/local");
%>
<%=stateful.say("only") %>
<br/>------------------------------------<br/>
<%
//调用本地接口
StatelessLocal stateless = (StatelessLocal) ctx.lookup("StatelessImpl/local");
%>
<%=stateless.say("nani") %>
<br/>------------------------------------<br/>
<%
//ejb调用ejb
IocBean ioc = (IocBean)ctx.lookup("IocBeanImpl/local");
%>
<%=ioc.say() %>
</body>
最后将web项目部署到同一jboss服务器,再访问web项目即可。
【EJB注入】
在开发中,我们难免会遇到bean调用bean对象的情况,注意:通过new xxBean的方式是不正确的,那不是一个EJB正确的调用方式。通常通过注解能非常轻松的注入bean:
@Stateless
public class IocBeanImpl implements IocBean{
//指定输入名为StatelessImpl的会话bean
@EJB(beanName="StatelessImpl") StatelessLocal stateless;
@Override
public String say() {
return "注入Bean :" + stateless.say("注入者");
}
【JPA技术实现实体bean】
首先我们必须配置数据源:确定使用什么数据库,帐号密码等。如果文件名以-ds结尾会被认定为数据源:
<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/mtjdbc?characterEncoding=utf-8</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>sa</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
将数据源xml文件放入deploy目下即可。
然后是在EJB项目中定义persistence.xml文件,该文件必须在META-INF目录下,功能等同于平常hibernate的config文件,定义数据源的JNDI、指定映射文件以及数据库框架的额外设置:
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<!-- 定义持久化单元 -->
<persistence-unit name="jpademo" transaction-type="JTA">
<!-- 指定数据源的JNDI名 -->
<jta-data-source>java:MySqlDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update" />
<!-- 打印sql语句 -->
<property name="hibernate.show_sql" value="true" />
<!-- 格式化sql语句 -->
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
了解hibernate的应该知道javabean是orm的关键,用户可以写一个xml+一个javabean实现orm映射,也可以使用单纯的javabean再通过注解定义orm关系:
@Entity
@Table(name = "userinfo")
public class Userinfo implements Serializable {
private static final long serialVersionUID = -1983888820266030468L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "code")
private String code;
@Column(name = "name")
private String name;
@Column(name = "sex")
private Integer sex;
@Column(name = "phone")
private String phone;
@Column(name = "money")
private double money;
...........
编写增删改查bean,JPA标准定义了增删改查方法接口,hibernate也很好的完成了接口的实现。
@Stateless
@Remote(UserinfoService.class)
public class UserinfoServiceImpl implements UserinfoService{
//unitName指定persistence.xml持久化单元名
@PersistenceContext(unitName="jpademo") EntityManager em;
@Override
public void delete(int user) {
//getReference类似于load
em.remove(em.getReference(Userinfo.class, user));
}
@Override
public Userinfo get(int user) {
return em.find(Userinfo.class, user);
}
@Override
public void save(Userinfo user) {
em.persist(user);
}
@Override
public void update(Userinfo user) {
em.merge(user);
}
@SuppressWarnings("unchecked")
@Override
public List<Userinfo> getAll() {
return em.createQuery("SELECT user FROM Userinfo user").getResultList();
}
}
【JMS消息服务】
java消息服务用于实现两个客户端消息通信,但两客户端不是直接通过Socket或URL通信,而是通过中间服务器控制转发消息:
客户端一----消息---->Jboss服务器-----消息---->客户端二
通过服务器控制转发可以保证消息稳定、安全、效率。
消息传递系统的中心就是Message,一条Message由三个部分组成:
头(header)、属性(property)和主体(body)
Message接口有多种实现:StreamMessage流消息、MapMessage键值对消息、TextMessage文本字符串消息、ObjectMessage序列化对象消息和ByteMessage字节流消息。
JMS支持两种消息传递模型:点对点模型和发布/订阅模型
点对点模型指定了一条消息只能从一个客户端传递到一个接收方(Queue模式)
发布/订阅模型指定一条消息可以被多个订阅的客户接收(Topick模式)
【EJB的Webservice】
Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务。
JavaEE为WebService提供了两种编程模型:EJB容器模型以及Web容器模型。
注意普通的EJB bean并非web service,这些bean只能被java代码调用,而实现web service标准的bean会被java以及其它编程语言调用。
其实EJB实现webservice非常简单,只需要配置一个注解,定义好相应属性即可。
@javax.jws.WebService( //让整个类成为webservice
targetNamespace="http://com.ejb.webservice", //指定命名空间名
name="WebService", //修改端点接口名
serviceName="WebServiceImpl" //服务的名称
)
@Stateless
@Remote(WebService.class)
public class WebServiceImpl implements WebService{
//@WebService 如果只让某个方法成为webservice可以在该方法头设置
@Override
public List<User> findUsers() {
List<User> lst = new ArrayList<User>();
for(int i=0;i<10;i++){
lst.add(new User(i, "微博"+i));
}
return lst;
}
@Override
public String getName(String name) {
return "name:"+name;
}
@Override
public User getUser(int id) {
return new User(id, "微博");
}
}
分享到:
相关推荐
在深入探讨《ejb学习笔记》这一主题之前,我们首先需要理解什么是EJB(Enterprise JavaBeans)。EJB是Java平台为企业级应用开发...对于希望深入了解并掌握EJB3开发技术的开发者而言,这些知识点构成了不可或缺的基础。
Weblogic EJB 学习笔记主要涵盖了EJB(Enterprise JavaBeans)的基础知识,包括无状态会话bean、有状态会话bean和实体bean这三种主要的EJB类型,以及EJB在Weblogic服务器中的配置和事务管理。 1. **无状态会话bean*...
【EJB学习笔记】 EJB,全称为Enterprise Java Beans,是Java平台上的一个标准,用于开发和部署服务器端的分布式组件。它基于Java语言,为创建高效能、安全且可扩展的企业级应用提供了框架。EJB规范由Java ...
了解EJB的基础知识对于理解Java EE体系结构和企业级应用程序的开发是非常有帮助的。同时,结合Spring框架等现代技术栈,可以进一步提升开发效率和应用性能。 通过上述介绍可以看出,EJB不仅是一个强大的企业级开发...
### EJB学习笔记知识点梳理 #### 一、EJB概览 **EJB**(Enterprise JavaBeans)是一种Java EE技术,用于开发、部署服务器端的分布式应用组件。它旨在简化企业级应用程序的开发过程,通过将复杂的底层服务(如事务...
### EJB知识与运行环境设置 #### EJB概述 企业JavaBeans (EJB) 是Java平台对企业...这些知识点涵盖了EJB的基础概念、不同类型的Bean、如何实现会话Bean以及如何配置和部署EJB应用等内容。希望这些信息对你有所帮助!
#### EJB基础知识概览 ##### 1. 无状态会话Bean (Stateless Session Bean) 无状态会话Bean是一种不保存客户端会话状态的EJB组件。这意味着每个客户端的请求都不依赖于前一个请求的状态。 - **优点**: - **高效...
### EJB学习笔记知识点详述 #### EJB概念与架构 EJB(Enterprise Java Beans)是一种企业级Java组件模型,用于构建复杂的企业级应用程序。它提供了面向服务的架构(SOA),使开发者能够构建可扩展、健壮且安全的...
本笔记旨在为热衷于EJB技术的开发者提供全面的基础知识,帮助理解EJB的基本概念、架构以及在实际项目中的应用。 首先,我们从EJB(day01).txt开始,第一天的笔记主要介绍了EJB的基本概念。EJB是Java EE(Java ...
总之,《AnyFo - EJB 3葵花宝典》是一份宝贵的资源,它不仅涵盖了EJB 3.0的基础知识,还提供了实践指导,帮助开发者快速上手并精通EJB开发。对于想要深入理解Java EE平台和企业级应用开发的人来说,这是一份...
### EJB基础知识与编程方法详解 #### 一、EJB概念与原理 ##### 1. 什么是EJB EJB(Enterprise JavaBeans)是Java平台的一种企业级组件模型标准,用于构建可重用的企业级应用组件。它由Sun Microsystems制定,并...
【EJB概述】 EJB(Enterprise JavaBean)是Java平台上的企业级组件,用于开发和部署在服务器端的...学习EJB涵盖了从基本概念到实际编程、部署和高级特性的全面知识,是成为一名合格的企业级Java开发者不可或缺的部分。
### EJB笔记精炼知识点 #### 什么是EJB? EJB(Enterprise Java Beans)是一种标准规范,由Sun Microsystems制定,用于构建和部署企业级、分布式应用程序的组件模型。EJB框架为企业应用程序提供了一种模块化的组件...
本资源是韩顺平 Java 从入门到精通视频教程的学习笔记,涵盖了 Java 基础知识、面向对象编程、图形界面开发、数据库编程、文件IO流编程、网络编程、多线程编程等方面的知识点。 Java 基础知识 * Java 开发平台标准...
Web 基础知识 Web 应用通过浏览器访问,运行在远程的服务器上,访问网站。浏览器是通用的客户端,B/S 结构的客户端。服务器端内容更新客户端不要更新,更新对用户影响不大。 客户端和服务器端 客户端是通用的...
本笔记涵盖了Java基础知识、J2EE框架、Web开发、数据库操作、图形游戏开发等方面的知识点,旨在帮助学习者从基础开始逐步学习和掌握Java技术。 Java基础知识 Java基础知识是学习Java的基础,包括基本数据类型、...