有状态SessionBean 和无状态Sessionbean

JavaEE中的有状态会话bean和无状态会话bean 的主要区别是:
1: 无状态会话bean 将不保存该bean使用者的状态,它使用的是单例模式 , 在ejb容器中只有一个实例存在 ,主要处理系统中的业务逻辑部分。
2: 有状态会话bean 将保存该bean使用者的状态 , 就像web程序中每一个用户分配一个session一样, 对不同使用者生成不同的实例, 并维持该使用者操作的状态, 到ejb 容器销毁该bean 。 使用处理想购物车类的业务操作。
以下代码在Netbean 6.5 , glassfish v2 中测试无误
代码示例:
SessionLessBean 无状态会话bean。
CartBean 有状态的会话bean.。
代码如下:

//远程接口
package ejb;
import javax.ejb.Remote;
/**
* @author 李亚希
*/
@Remote
public interface SessionLessRemote {
public int add();
}
//本地接口
package ejb;
import javax.ejb.Local;
/**
* @author 李亚希
*/
@Local
public interface SessionLessLocal {

}
//实现bean
package ejb;
import javax.ejb.Stateless;
/**
* @author 李亚希
*/
@Stateless(mappedName="ejb/SessionLessBean")
public class SessionLessBean implements SessionLessRemote {

public int count=0;
public int add()
{
return count++;
}
}

package ejb;
import javax.ejb.Remote;
/**
*
* @author 李亚希
*/
@Remote
public interface CartRemote {
public int add();
}
package ejb;
import javax.ejb.Local;
/**
* @author 李亚希
*/
@Local
public interface CartLocal {

}
package ejb;

import javax.ejb.Stateful;
/**
* @author 李亚希
*/
@Stateful(mappedName="ejb/CartBean")
public class CartBean implements CartRemote {

public int count=0;
public int add()
{
return count++;
}
}

部署到服务器后在, 建一个客户端测试类 (具体做法 见 [url]http://liyaxi.iteye.com/admin/blogs/508378[/url] )
测试类的代码如下:


package lyx.com.client;

import ejb.CartRemote;
import ejb.HelloRemote;
import ejb.SessionLessRemote;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;


public class ClientTest {

public static void main(String[] args) {
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

try {
InitialContext ctx = new InitialContext(props);
System.out.println("-----------------这是第一次从上下文中获取到有状态会话bean------------------------");
;
CartRemote cr = (CartRemote) ctx.lookup("ejb/CartBean");
System.out.println(cr.add());
System.out.println(cr.add());
System.out.println(cr.add());
System.out.println(cr.add());
System.out.println("--------------------这是第二次从上下文中获取同一个有状态会话bean -----------------------");
CartRemote cr2 = (CartRemote) ctx.lookup("ejb/CartBean");
System.out.println(cr2.add());
System.out.println(cr2.add());
System.out.println(cr2.add());
System.out.println(cr2.add());
System.out.println(cr2.add());
if(cr.equals(cr2))
{
System.out.println("相等");
}
else
{
System.out.println("不相等");
}
System.out.println("---------------有状态会话bean 的测试结束---------------------");
System.out.println("---------------无状态会话bean 的测试开始第一次从上下文中获取到一个无状态会话bean --------------------");
SessionLessRemote slr = (SessionLessRemote) ctx.lookup("ejb/SessionLessBean");
System.out.println(slr.add());
System.out.println(slr.add());
System.out.println(slr.add());
System.out.println(slr.add());
System.out.println(slr.add());
System.out.println("---------------开始第二次从上下文中获取到一个无状态会话bean-----------------------");
SessionLessRemote slr2 = (SessionLessRemote) ctx.lookup("ejb/SessionLessBean");
System.out.println(slr2.add());
System.out.println(slr2.add());
System.out.println(slr2.add());
System.out.println(slr2.add());
System.out.println(slr2.add());
System.out.println(slr2.add());
System.out.println(slr2.add());
if(slr.equals(slr2))
{
System.out.println("相等");
}
else
{
System.out.println("不相等");
}


} catch (NamingException e) {
e.printStackTrace();
}

}
}



运行结果如下:
run:
-----------------这是第一次从上下文中获取到有状态会话bean------------------------
0
1
2
3
--------------------这是第二次从上下文中获取同一个有状态会话bean -----------------------
0
1
2
3
4
不相等
---------------有状态会话bean 的测试结束---------------------
---------------无状态会话bean 的测试开始第一次从上下文中获取到一个无状态会话bean --------------------
0
1
2
3
4
---------------开始第二次从上下文中获取到一个无状态会话bean-----------------------
5
6
7
8
9
10
11
相等

不重启服务 在运行一次的结果
run:
hello李亚希
-----------------这是第一次从上下文中获取到有状态会话bean------------------------
0
1
2
3
--------------------这是第二次从上下文中获取同一个有状态会话bean -----------------------
0
1
2
3
4
不相等
---------------有状态会话bean 的测试结束---------------------
---------------无状态会话bean 的测试开始第一次从上下文中获取到一个无状态会话bean --------------------
12
13
14
15
16
---------------开始第二次从上下文中获取到一个无状态会话bean-----------------------
17
18
19
20
21
22
23
相等

由此可见有状态会话bean 每当从context.lookup("xxxx"); 就获取一个新的实例 并记录该bean 的状态, 而无状态会话bean 每一次取得的是同一个实例。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值