前言
上篇讲解了EJB开发的简单实例,我们对EJB也有了简单的认识,下面咱们对EJB进行继续的深入学习。
正题
今天讲解的实例就是有状态和无状态的Ejb,所需的步骤跟上一篇讲解的一样,一个服务端项目,一个客户端项目.
1.服务端(EJB项目):
接口类:
StatefulEjb.java:
package com.tgb.ejb;
public interface StatefulEjb {
public void compute(int i);
public int getResult();
}
StatelessEjb.java:
package com.tgb.ejb;
public interface StatelessEjb {
public void compute(int i);
public int getResult();
}
实现类:
StatefulEjbBean.java:
package com.tgb.ejb;
import javax.ejb.Remote;
import javax.ejb.Stateful;
@Stateful
@Remote
public class StatefulEjbBean implements StatefulEjb {
private int state;
@Override
public void compute(int i) {
state = state + i;
}
@Override
public int getResult() {
return state;
}
}
StatelessEjbBean.java:
package com.tgb.ejb;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless
@Remote
public class StatelessEjbBean implements StatelessEjb {
private int state;
@Override
public void compute(int i) {
state = state + i;
}
@Override
public int getResult() {
return state;
}
}
2.客户端:
引入jar包:
引入接口StatefulEjb和StatelessEjbjar包还有jboss的client包,还有配置jndi配置文件。
编写main方法:
StatefulEjbClient的main方法:
package com.tgb.ejb;
import javax.naming.InitialContext;
public class StatefulEjbClient {
public static void main(String[] args) throws Exception{
InitialContext context = new InitialContext();
//第一次会话
StatefulEjb ejb1 = (StatefulEjb)context.lookup("StatefulEjbBean/remote");
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
//第二次会话
StatefulEjb ejb2 = (StatefulEjb)context.lookup("StatefulEjbBean/remote");
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
}
}
执行结果:0 1 2 3 0 1 2 3
StatelessEjbClient的main方法:
package com.tgb.ejb;
import javax.naming.InitialContext;
public class StatelessEjbClient {
public static void main(String[] args) throws Exception{
InitialContext context = new InitialContext();
//第一次会话
StatelessEjb ejb1 = (StatelessEjb)context.lookup("StatelessEjbBean/remote");
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
//第二次会话
StatelessEjb ejb2 = (StatelessEjb)context.lookup("StatelessEjbBean/remote");
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
System.out.println("ejb1 == ejb2 ? : " + (ejb1 == ejb2));
}
}
执行结果:0 1 2 3 4 5 6 7
通过观察两个客户端的执行结果我们就可以知道有状态和无状态的区别,有状态Bean可以保持记录每一个Bean的状态,而无状态Bean则不能。