EJB开发第一个无状态会话bean、开发EJBclient
开发第一个无状态会话bean
EJB中的三中bean:
会话Bean(Session Bean)
负责与client交互,是编写业务逻辑的地方。在会话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的client
Ejb在软件分层结构上,属于业务层。通常要被client调用,这里用Java类做ejbclient。
新建类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();
}
} }
运行client(main方法);调用成功。
代码含义:client要调用ejb。要通过JNDI去寻找EJB的xx代理对象,JNDI是一套用来訪问命名server的API,也是JavaEE里面的规范。
设置JNDI訪问环境信息
如同数据库一样。依据訪问命名server不同,为上下文设置的驱动类和URL也是不同的。如以下是訪问Sun应用server的上下文信息:
假设client执行在应用server内,我们不须要为InitlalContext设置应用server的上下文信息,也不建议设置。由于应用server启动时会把JNDI驱动类等上下文信息加入进系统属性,创建InitialContext对象时假设没有指定Properties參数,InitialContext内部会调用System.getProperty()方法从系统属性里获得必要的上下文信息。对本样例而言。能够省略传入的props參数,在实际应用中假设给InitialContext设置了參数,反而会带来不可移植的问题。
注:创建InitialContext对象时假设没有指定Properties參数。InitialContext还会在classpath下寻找jndi.properties文件,并从该文件里载入应用server的上下文信息,这样避免了硬编码为InitialContext设置Properties參数。
InitialContext ctx = newInitialContext();
jndi.properties的配置例如以下:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost\:1099
提示:这里编写的client程序全然能够部署在另外一台计算机上。仅仅须要改动当中的连接serverIP地址和启动Jboss时绑定对应IP地址就可以。这正是EJB的远程调用特性。在第19行返回的helloworld实例对象并非我们在server编写的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、开发EJBclient的更多相关文章
- EJB开发第一个无状态会话bean、开发EJB客户端
开发第一个无状态会话bean EJB中的三中bean: 会话Bean(Session Bean) 负责与客户端交互,是编写业务逻辑的地方,在会话bean中可以通过JDBC直接操作数据库,但大多数情况下 ...
- 无状态会话bean(1)---定义
无状态会话bean用于完毕在单个方法的生命周期内的操作.无状态bean能够实现很多业务操作,可是每一个方法都不能假定不论什么其它的方法会在它之前调用.后半句的意思是如今的你可能不是刚才的你.明天的你可 ...
- JBoss+Ant实现EJB无状态会话bean实例
EJB分为session bean.entity bean.message-driven bean,session bean又分为无状态会话bean和有状态会话bean. session bean负责 ...
- 无状态会话Bean、有状态会话Bean、CMP与BMP中,哪一种Bean不需要自己书写连接数据库的代码?
无状态会话Bean.有状态会话Bean.CMP与BMP中,哪一种Bean不需要自己书写连接数据库的代码? A.无状态会话Bean B.有状态会话Bean C.CMP D.BMP 解答:C
- 无状态会话bean(3)---远程业务接口(没有排版)
迄今为止,我们仅仅讨论了使用一个本地业务接口的会话bean.在这样的情况下.本地意味着仅仅能由执行在同一个应用程序server实例的JavaEE组件声明会话bean的依赖性.比如.远程client不可 ...
- (转)Spring Bean Scope 有状态的Bean 无状态的Bean
有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”:一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束.即每个用户最初都会得到一 ...
- 有状态的bean和无状态的bean的区别
有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”:一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束.即每个用户最初都会得到一个初 ...
- 有状态无状态回话bean
1.有状态(Stateful) 可以在不同的方法调用间保持针对各个客户端的状态 与客户端的联系必须被维持,这样做开销要大一些 有状态也可以这样理解,它存在存储能力,也就是说至少有一个属性来标识它目前的 ...
- Ejb in action(四)——购物车实例演示有状态会话Bean
前面.我们介绍了一个入门实例.事实上那就是无状态回话Bean的经常使用情况. 上一篇文章中.我们介绍了无状态会话Bean和有状态会话Bean的相关概念.为了加深大家对它们的理解,我们一起来实现一个有状 ...
随机推荐
- Examples_08_07
http://yarin.iteye.com/?page=4 Activity01.java package com.yarin.android.Examples_08_07; import andr ...
- JAVA为什么会空指针异常
1.所谓的指针,就是java中的对象的引用.比如String s;这个s就是指针. 2.所谓的空指针,就是指针的内容为空,比如上面的s,如果令它指向null,就是空指针. 3.所谓的空指针异常,就是一 ...
- (六)Angularjs - 启动引导
自动引导 AngularJs 通过 ng-app 指令进行自动引导 手工引导启动框架 如果一个HTML文件中 有多个ng-app,AngularJS只会自动引导启动它找到的第一个ng-app应用,这是 ...
- Java语言实现简单FTP软件------>FTP软件本地窗口的实现(五)
1.首先看一下本地窗口的布局效果 2.看一下本地窗口实现的代码框架 2.本地窗口的具体实现代码LocalPanel.java package com.oyp.ftp.panel.local; impo ...
- Struts2+Spring4+Hibernate4整合超详细教程
Struts2.Spring4.Hibernate4整合 超详细教程 Struts2.Spring4.Hibernate4整合实例-下载 项目目的: 整合使用最新版本的三大框架(即Struts2.Sp ...
- 【插件】WordPress缓存最佳组合:DB Cache Reloaded Fix + Hyper Cache
DB Cache Reloaded Fix是一个出色的WordPress数据库缓存插件,可以大大减少对数据库的请求次数. Hyper Cache 是非常小巧但很强大的WordPress缓存插件,设置简 ...
- JQUERY1.9学习笔记 之基本过滤器(七) 语言选择器
语言选择器 jQuery( ":lang(language)" ) 描述:选择所有用特定语言指定的标签. 根据标签指定语言的不同给标签上色. <!DOCTYPE html&g ...
- linux下实现rm()函数删除文件或目录
转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600866.html 在linux下有两个函数可以用来删除文件: #include <unistd.h ...
- C++ primer学习方法
C++ primer学习: 第一次可以跳着看.关键是要尽快用起来,在使用中熟练,而不是在细节中迷失. 以C++ Primer第五版为例,第一遍读的时候: Part1也就是前七章,除了6.6,6 ...
- akka简单示例-1
刚刚开始接触akka,网上找了2个简单示例,并在公司运营机器上尝试,踩了一些坑,在此记录. 1. 本地hello world [torstan@sparkb5-i ~/akka_example/hel ...