开发第一个无状态会话bean

EJB中的三中bean:

会话Bean(Session Bean)

负责与客户端交互,是编写业务逻辑的地方,在会话bean中可以通过JDBC直接操作数据库,但大多数情况下都是通过实体bean来完成对数据库的操作。

实体Bean(Entity Bean)

它实际上属于java持久化规范(JPA)里的技术,JPA的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、TopLink等ORM框架各自为营的局面。

消息驱动Bean(MessageDriven
Bean)

它是专门用于异步处理Java消息的组件。具有处理大量并发消息的能力。

会话bean:

无状态会话bean

平常我们使用最多的是无状态bean,因为它的bean实例可供多个用户使用,所以它的性能比有状态bean高。正因为一个bean实例被多个用户使用,那么前一个用户设置的值可能被后一个用户所修改,所以它无法正确保存某个用户设置的值,因此是无状态的。

有状态会话bean

有状态会话bean平常使用的并不多,因为它的一个bean实例只供一个用户使用,所以性能开销比较大,正因为它的实例只被一个用户使用,那么用户设置的值是不会被其他用户所修改的,所以可以正确保存用户设置的值,因此是有状态的。

开发一个无状态会话bean

开发工具:MyEclipse。

开发EJB依赖的jar文件:Jboss安装路径下的client下,通常把所以的jar添加到项目。

结构:

接口(可以是远程接口或本地接口)

实现类

步骤:

1.新建一个JavaProject:HelloWorld

2.导入所有的client的jar包

3.新建一个接口HelloWorld在cn.hqu.ejb3下

添加方法 String sayHello(String name);

4.创建实现类:

新建一个类HelloWorldBean,实现HelloWorld接口,在包 cn.hqu.ejb3.impl;

实现方法里面:

return name+"说:你好!";

5.把这两个类变成ejb3

HelloWorldBean加入注解 @Stateless

指定这个ejb是一个无状态会话bean;

指定这个接口是一个远程接口:(默认是本地接口)

在HelloWorldBean加入注解@Remote(HelloWorld.class) 。

Ejb开发完成

@Stateless

@Remote(HelloWorld.class)

public
class
HelloWorldBean implements HelloWorld {

@Override

public
String
sayHello(String name) {

// TODO Auto-generated method stub

return name+"说:你好!";

}

}

6.进行发布:

打成jar包,可以通过eclipse打包或者通过ant打包。

这里使用MyEclipse,右击项目选择Export→jar file 。

发布:先启动JBoss,复制打包好的jar拷贝到JBoss的server/default/deploy下,这样就完成ejb的部署;这样就发布成功了;会话bean开发完了

开发EJB的客户端

Ejb在软件分层结构上,属于业务层,通常要被客户端调用,这里用Java类做ejb客户端。

新建EJBClient 在包cn.hqu.test,在main里面编写EJB的调用代码:

package cn.hqu.test;

import java.util.Properties;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import cn.hqu.ejb3.HelloWorld;

public class EJBClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Properties pros = new Properties();
		pros.setProperty("java.naming.factory.initial",
				"org.jnp.interfaces.NamingContextFactory");
		pros.setProperty("java.naming.provider.url", "localhost:1099");

		try {
			InitialContext ctx = new InitialContext(pros);
			HelloWorld helloworld = (HelloWorld) ctx
					.lookup("HelloWorldBean/remote");
			System.out.println(helloworld.sayHello("苏志达"));
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}

}

执行客户端(main方法);调用成功;

代码含义:客户端要调用ejb,要通过JNDI去寻找EJB的xx代理对象,JNDI是一套用来访问命名服务器的API,也是JavaEE里面的规范。

设置JNDI访问环境信息

如同数据库一样,根据访问命名服务器不同,为上下文设置的驱动类和URL也是不同的,如下面是访问Sun应用服务器的上下文信息:

如果客户端运行在应用服务器内,我们不需要为InitlalContext设置应用服务器的上下文信息,也不建议设置。因为应用服务器启动时会把JNDI驱动类等上下文信息添加进系统属性,创建InitialContext对象时如果没有指定Properties参数,InitialContext内部会调用System.getProperty()方法从系统属性里获得必要的上下文信息。对本例子而言,可以省略传入的props参数,在实际应用中如果给InitialContext设置了参数,反而会带来不可移植的问题。

注:创建InitialContext对象时如果没有指定Properties参数,InitialContext还会在classpath下寻找jndi.properties文件,并从该文件中加载应用服务器的上下文信息,这样避免了硬编码为InitialContext设置Properties参数。

InitialContext ctx = newInitialContext();

jndi.properties的配置如下:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory

java.naming.provider.url=localhost\:1099

提示:这里编写的客户端程序完全可以部署在另外一台计算机上,只需要修改其中的连接服务器IP地址和启动Jboss时绑定相应IP地址即可。这正是EJB的远程调用特性。在第19行返回的helloworld实例对象并不是我们在服务器编写的HelloWorldBean,而是一个也实现了HelloWorld接口的代理对象,这个代理对象最终远程调用我们自己编写的HelloWorldBean,在19后加入如下代码,即可看到这个代理对象的类名:

System.out.println(helloworld.getClass().getName())

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-NAME为ear文件的名称,EJB-CLASS-NAME为EJB的非限定类名。

例:把HelloWorld应用作为EJB模块打包进名为HelloWorld.ear的企业应用文件,它的远程接口的JNDI名称是:HelloWorld/HelloWorldBean/remote

如果把EJB应用打包成后缀为*.jar的模块文件,默认全局JNDI名称是

本地接口:EJB-CLASS-NAME/local

远程接口:EJB-CLASS-NAME/remote

例:把HelloWorld应用打包成HelloWorld.jar文件,它的远程接口的JNDI名称是:

HelloWorldBean/remote

代码:http://pan.baidu.com/s/1dDckCXN

EJB开发第一个无状态会话bean、开发EJB客户端的更多相关文章

  1. EJB开发第一个无状态会话bean、开发EJBclient

    开发第一个无状态会话bean EJB中的三中bean: 会话Bean(Session Bean) 负责与client交互,是编写业务逻辑的地方.在会话bean中能够通过JDBC直接操作数据库.但大多数 ...

  2. 无状态会话bean(1)---定义

    无状态会话bean用于完毕在单个方法的生命周期内的操作.无状态bean能够实现很多业务操作,可是每一个方法都不能假定不论什么其它的方法会在它之前调用.后半句的意思是如今的你可能不是刚才的你.明天的你可 ...

  3. JBoss+Ant实现EJB无状态会话bean实例

    EJB分为session bean.entity bean.message-driven bean,session bean又分为无状态会话bean和有状态会话bean. session bean负责 ...

  4. 无状态会话Bean、有状态会话Bean、CMP与BMP中,哪一种Bean不需要自己书写连接数据库的代码?

    无状态会话Bean.有状态会话Bean.CMP与BMP中,哪一种Bean不需要自己书写连接数据库的代码? A.无状态会话Bean B.有状态会话Bean C.CMP D.BMP 解答:C

  5. 无状态会话bean(3)---远程业务接口(没有排版)

    迄今为止,我们仅仅讨论了使用一个本地业务接口的会话bean.在这样的情况下.本地意味着仅仅能由执行在同一个应用程序server实例的JavaEE组件声明会话bean的依赖性.比如.远程client不可 ...

  6. (转)Spring Bean Scope 有状态的Bean 无状态的Bean

    有状态会话bean   :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”:一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束.即每个用户最初都会得到一 ...

  7. 有状态的bean和无状态的bean的区别

    有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”:一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束.即每个用户最初都会得到一个初 ...

  8. 有状态无状态回话bean

    1.有状态(Stateful) 可以在不同的方法调用间保持针对各个客户端的状态 与客户端的联系必须被维持,这样做开销要大一些 有状态也可以这样理解,它存在存储能力,也就是说至少有一个属性来标识它目前的 ...

  9. Ejb in action(四)——购物车实例演示有状态会话Bean

    前面.我们介绍了一个入门实例.事实上那就是无状态回话Bean的经常使用情况. 上一篇文章中.我们介绍了无状态会话Bean和有状态会话Bean的相关概念.为了加深大家对它们的理解,我们一起来实现一个有状 ...

随机推荐

  1. IOS开发---视频录制

    今天研究了一下使用app录制视频的功能,感觉还是挺简单的.使用了AVFoundation框架,代码比较死,按步骤调用就行. 分享一下今天做的Demo的步骤 一,初始化输入设备,这里涉及到前,后摄像头: ...

  2. 关于装双系统Ubantu16.04+Win10引导问题

    1.装完双系统,必定会遇到时间不一致的问题解决问题如下 sudo apt-get install ntpdate sudo ntpdate time.windows.com sudo hwclock ...

  3. 机器学习技法:02 Dual Support Vector Machine

    Roadmap Motivation of Dual SVM Lagrange Dual SVM Solving Dual SVM Messages behind Dual SVM Summary

  4. Spring Boot简单应用——会员管理系统

    简介 本项目是使用Spring Boot编写的一个简单的会员管理系统. 提供了会员的解决方案,主要有会员模块,管理员模块,礼品模块,商品模块,会员等级模块,生日提醒模块,积分模块,详细模块如下图 准备 ...

  5. JS 变量类型互相转换

    转载自:http://zhaizhiyuan.blog.163.com/blog/static/1897672632009093147268/ Java中几种常用的数据类型之间转换方法:  1. sh ...

  6. [BZOJ]1050 旅行comf(HAOI2006)

    图论一直是小C的弱项,相比其它题型,图论的花样通常会更多一点,套路也更难捉摸. Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权 ...

  7. Java后缀数组-求sa数组

    后缀数组的一些基本概念请自行百度,简单来说后缀数组就是一个字符串所有后缀大小排序后的一个集合,然后我们根据后缀数组的一些性质就可以实现各种需求. public class MySuffixArrayT ...

  8. 关闭默认共享,禁止ipc$空连接

    关闭默认共享,禁止ipc$空连接 要防止别人用ipc$和默认共享入侵,需要禁止ipc$空连接,避免入侵者取得用户列表,并取消默认共享 禁止ipc$空连接进行枚举运行regedit,找到如下组键[HKE ...

  9. vue-router实现登录和跳转到指定页面,vue-router 传参

    定义路由的时候可以配置 meta 字段: const router = new VueRouter({ routes: [ { path: '/foo', component: Foo, childr ...

  10. numpy的初探

    # data = numpy.genfromtxt("C:\\Users\\Admin\Desktop\\111.txt", delimiter='\t', dtype='str' ...