`

学习EJB3基础知识笔记

    博客分类:
  • EJB
阅读更多

最近项目进入系统测试阶段,全赖袁大虾领导有力,保持一周零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, "微博");
	}
	
}

 

1
1
分享到:
评论

相关推荐

    ejb学习笔记

    在深入探讨《ejb学习笔记》这一主题之前,我们首先需要理解什么是EJB(Enterprise JavaBeans)。EJB是Java平台为企业级应用开发...对于希望深入了解并掌握EJB3开发技术的开发者而言,这些知识点构成了不可或缺的基础。

    Weblogic EJB 学习笔记

    Weblogic EJB 学习笔记主要涵盖了EJB(Enterprise JavaBeans)的基础知识,包括无状态会话bean、有状态会话bean和实体bean这三种主要的EJB类型,以及EJB在Weblogic服务器中的配置和事务管理。 1. **无状态会话bean*...

    EJB学习笔记.doc

    【EJB学习笔记】 EJB,全称为Enterprise Java Beans,是Java平台上的一个标准,用于开发和部署服务器端的分布式组件。它基于Java语言,为创建高效能、安全且可扩展的企业级应用提供了框架。EJB规范由Java ...

    JavaEE5学习笔记05-EJB之会话Bean总结

    了解EJB的基础知识对于理解Java EE体系结构和企业级应用程序的开发是非常有帮助的。同时,结合Spring框架等现代技术栈,可以进一步提升开发效率和应用性能。 通过上述介绍可以看出,EJB不仅是一个强大的企业级开发...

    ejb 学习笔记

    ### EJB学习笔记知识点梳理 #### 一、EJB概览 **EJB**(Enterprise JavaBeans)是一种Java EE技术,用于开发、部署服务器端的分布式应用组件。它旨在简化企业级应用程序的开发过程,通过将复杂的底层服务(如事务...

    EJB 知识与运行环境设置(笔记)

    ### EJB知识与运行环境设置 #### EJB概述 企业JavaBeans (EJB) 是Java平台对企业...这些知识点涵盖了EJB的基础概念、不同类型的Bean、如何实现会话Bean以及如何配置和部署EJB应用等内容。希望这些信息对你有所帮助!

    基于Weblogic 的ejb 学习笔记

    #### EJB基础知识概览 ##### 1. 无状态会话Bean (Stateless Session Bean) 无状态会话Bean是一种不保存客户端会话状态的EJB组件。这意味着每个客户端的请求都不依赖于前一个请求的状态。 - **优点**: - **高效...

    EJB学习笔记

    ### EJB学习笔记知识点详述 #### EJB概念与架构 EJB(Enterprise Java Beans)是一种企业级Java组件模型,用于构建复杂的企业级应用程序。它提供了面向服务的架构(SOA),使开发者能够构建可扩展、健壮且安全的...

    EJB笔记,但愿对喜欢EJB的朋友有所帮助

    本笔记旨在为热衷于EJB技术的开发者提供全面的基础知识,帮助理解EJB的基本概念、架构以及在实际项目中的应用。 首先,我们从EJB(day01).txt开始,第一天的笔记主要介绍了EJB的基本概念。EJB是Java EE(Java ...

    AnyFo - EJB 3葵花宝典.doc

    总之,《AnyFo - EJB 3葵花宝典》是一份宝贵的资源,它不仅涵盖了EJB 3.0的基础知识,还提供了实践指导,帮助开发者快速上手并精通EJB开发。对于想要深入理解Java EE平台和企业级应用开发的人来说,这是一份...

    EJB笔记--介绍了EJB的用处以及编程方法

    ### EJB基础知识与编程方法详解 #### 一、EJB概念与原理 ##### 1. 什么是EJB EJB(Enterprise JavaBeans)是Java平台的一种企业级组件模型标准,用于构建可重用的企业级应用组件。它由Sun Microsystems制定,并...

    程祖红达内EJB课堂笔记完全版.doc

    【EJB概述】 EJB(Enterprise JavaBean)是Java平台上的企业级组件,用于开发和部署在服务器端的...学习EJB涵盖了从基本概念到实际编程、部署和高级特性的全面知识,是成为一名合格的企业级Java开发者不可或缺的部分。

    EJB笔记

    ### EJB笔记精炼知识点 #### 什么是EJB? EJB(Enterprise Java Beans)是一种标准规范,由Sun Microsystems制定,用于构建和部署企业级、分布式应用程序的组件模型。EJB框架为企业应用程序提供了一种模块化的组件...

    韩顺平java从入门到精通视频教程(全94讲)学习笔记整理(齐全).docx

    本资源是韩顺平 Java 从入门到精通视频教程的学习笔记,涵盖了 Java 基础知识、面向对象编程、图形界面开发、数据库编程、文件IO流编程、网络编程、多线程编程等方面的知识点。 Java 基础知识 * Java 开发平台标准...

    web基础笔记

    Web 基础知识 Web 应用通过浏览器访问,运行在远程的服务器上,访问网站。浏览器是通用的客户端,B/S 结构的客户端。服务器端内容更新客户端不要更新,更新对用户影响不大。 客户端和服务器端 客户端是通用的...

    java学习笔记---从入门到精通之路.pdf

    本笔记涵盖了Java基础知识、J2EE框架、Web开发、数据库操作、图形游戏开发等方面的知识点,旨在帮助学习者从基础开始逐步学习和掌握Java技术。 Java基础知识 Java基础知识是学习Java的基础,包括基本数据类型、...

Global site tag (gtag.js) - Google Analytics