1.EJB的三种bean:
1>会话bean(Session Bean)--负责与客户端交互,是编写业务逻辑的地方。在会话bean中要可以直接通过JDBC操作数据库,但大多数情况通过实体bean完成对数据库操作
a.无状态会话bean(使用较多),它的实例可以供多个用户使用,所以它的性能比有状态bean高,而正因为一个bean实例被多个用户使用,所以前一个用户设置的值可能会被后一个用户所修改,因而它无法正确保存某个用户设置的值,所以它是无状态的
b.有状态会话bean(使用较少),因为它的一个实例只供一个用户使用,所以性能开销比较大,每个用户设置的值 不会被其他的用户所修改,所以可以正确每个用户设置值,因而它是有状态的
2>实体bean(entity bean)---Java持久化规范技术,类似于hibernate中与数据库表映射的bean
3>消息驱动bean(message-driven bean)--专门用于异步处理java消息的组件,具有大量处理并发消息的能力
2.开发无状态会话bean:
1>开发接口:
public interface HelloWorld { public String sayHello(String name); }2>开发无状态bean实现接口
@Stateless//bean类是无状态bean @Remote(HelloWorld.class) //远程接口 public class HelloWorldImpl implements HelloWorld { @Override public String sayHello(String name) { return name+" say hello"; } }3>开发客户端,此处的客户端不需要与服务端处于同一台计算机上,只需要修改其中连接的服务器IP地址和启动Jboss时绑定相应的IP地址就可以了,这就是EJB的远程调用特性。
public static void main(String[] args) { //JNDI服务的配置信息 Properties properties=new Properties(); properties.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); properties.setProperty("java.naming.provider.url", "localhost:1099"); try { Context context=new InitialContext(properties); //获取无状态bean的代理 HelloWorld helloWorld=(HelloWorld)context.lookup("HelloWorldImpl/remote"); System.err.println(helloWorld.sayHello("cash")); } catch (NamingException e) { e.printStackTrace(); } }4>Jboss默认生成的JDNI名称:
a.当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/HelloWorldImpl/remote
b.如果把EJB应用打包成后经为*.jar的模块文件,默认的全局JNDI名称是
本地接口:EJB-CLASS-NAME/local
远程接口:EJB-CLASS-NAME/remote
例如上面的代码。