1.Session Bean概述
Session Bean代表一个可处理应用中业务逻辑的完整组件,主要包含了各种业务逻辑的实现代码。当Session Bean部署在EJB容器中之后,其他客户端就可获取该EJB组件,并调用它的方法。从客户端获取Session Bean,到客户端调用其方法结束,可称为客户端与Session Bean之间的一次会话。
EJB3对Session Bean进行了简化,开发者不需要对Session Bean编写Home接口,不需要为Session Bean提供所谓的部署描述文件。
对于EJB3的Session Bean而言,它可分为两类:有状态的Session Bean,无状态的Session Bean。对于有状态的Session Bean来说,在客户端多次调用某个Session Bean的方法时,只要客户端一直保持着该Session Bean的引用,那么该Session Bean就可以在多次调用之间维护这种会话状态。而无状态的Session Bean无须维护与客户端之间的会话状态,如果无状态的Session Bean包括一个与客户端相关的实例变量,那么这个实例变量应该只是在调用期间内有效,一旦调用结束,这个与客户端相关的状态就不应该保留。
2.Session Bean开发过程
Session Bean总是由两部分组成:一个或多个业务接口和EJB的Bean实现类。
EJB3的业务接口就是一个普通接口,没有任何特殊之处。代码如下:
package ejb;
public interface HelloEJB {
public String sayHello(String name);
}
该业务接口中定义了该EJB可以提供的业务方法,一个业务方法通常处理一次业务请求。EJB内的业务方法应该遵守如下基本规定:
- 业务方法名尽量不要以ejb开头,如果开发者定义的业务方法与这些方法名相同,将可能与EJB体系定义的默认方法冲突。
- 如果是一个允许远程调用的EJB,那么所有业务方法中���形式参数类型、返回值类型都必须是可序列化的。
- 业务方法不应该使用static final修饰。
下面是该EJB业务接口的一个实现类,如果是一个无状态的Session Bean,则使用@Stateless修饰该Bean类。如果是一个有状态的Session Bean,则使用@Stateful来修饰该Bean类。
package ejb;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless(mappedName = "HelloEJB")
@Remote
public class HelloEJBBean implements HelloEJB {
@Override
public String sayHello(String name) {
return "Hello "+name + ", the time is:" + new java.util.Date();
}
}
编译上面两个Java文件,将它们生成的.class文件打包成一个jar包,并部署WebLogic下,部署方法如下:
单击WebLogic控制台域结构面板中的部署节点,将会看到如下页面:
单击安装按钮,系统将进入查找EJB jar包的页面:
选中要安装的jar包后,如果没有额外的需求,多次点击“下一步”就可完成EJB的部署:
调用EJB服务非常简单,只需两步即可:
- 通过JNDI查找EJB的引用,并面向接口编程,将该引用强制类型转换为EJB的业务接口类型。
- 调用方法。
下面是一个调用WebLogic服务器EJB组件的示例:
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import ejb.HelloEJB;
public class EjbClient{
public void test() throws NamingException{
Context ctx = getInitialContext();
HelloEJB h2 = (HelloEJB) ctx.lookup("HelloEJB#ejb.HelloEJB");
System.out.println(h2.sayHello("Zaiven"));
}
private Context getInitialContext(){
final String INIT_FACTORY = "weblogic.jndi.WLInitialContextFactory";
final String SERVER_URL = "t3://localhost:7001";
Context ctx = null;
try{
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, INIT_FACTORY);
props.put(Context.PROVIDER_URL, SERVER_URL);
ctx = new InitialContext(props);
}catch(NamingException ne){
System.err.println("can't connect WebLogic" + SERVER_URL);
ne.printStackTrace();
}
return ctx;
}
public static void main(String[] args) throws NamingException{
EjbClient client = new EjbClient();
client.test();
}
}
上述程序的运行结果如下:
Hello Zaiven, the time is:Tue Sep 02 15:49:04 CST 2014
该贴被xiuwen.zhao编辑于2014-9-2 17:01:07