编写有状态的(Stateful)的Session Bean也非常简单,只需要将无状态注释(@Stateless)改成有状态注释(@Stateful)即可。如果使用Stateful Sessionbean,客户端在使用同一个SessionBean对象实例时可以保存状态,也就是说,在多次引用该对象时实际上在服务端是使用的同一个 Sessionbean的对象实例,而无状态sessionbean使用了不同的sessionbean对象实例,因此,是无法保存状态的。
下面将编写一个简单的购物车的例子,该例子将客户购买的商品都保存在stateful sessionbean中的List对象中。然后在客户端使用同一个sessionbean的对象实例输出这些商品。我们首先来实现一个 sessionbean的远程接口,这和无状态sessionbean是一样的。代码如下:
- package service;
- import java.util.List;
- import javax.ejb.Remote;
- public interface ShoppingCart
- {
-
- public void addCommodity (String value);
-
- public List getCommodity();
- }
|
为了方便,在这里只将商品名保存在List对象中,读者也可以在List对象中保存更复杂的信息,如使用一个对象来保存商品信息。
下面来编写具体的Stateful sessionbean,代码如下:
- package service;
- import java.util.ArrayList;
- import java.util.List;
- import javax.ejb.Stateful;
- @Stateful
- public class ShoppingCartBean implements ShoppingCart
- private List shoppingCart = new ArrayList();
-
- public void addCommodity(String value)
-
- shoppingCart.add(value); }
- public List getCommodity()
- { return shoppingCart;
- }
|
最后我们编写一个客户端调用程序,代码如下:
- package test;
-
- import java.util.List;
- import java.util.Properties;
- import javax.naming.InitialContext;
- import service.ShoppingCart;
-
- public class Client
- {
-
- public static void main(String[] args) throws Exception
- {
- Properties prop = new Properties();
- InitialContext ctx = new InitialContext();
- ShoppingCart shoppingCart = (ShoppingCart) ctx
- .lookup("ShoppingCartBean/remote");
- shoppingCart.addCommodity("自行车");
- shoppingCart.addCommodity("笔记本电脑");
- shoppingCart.addCommodity("液晶电视");
- List<String> commodities = shoppingCart.getCommodity();
- for(String commodity: commodities)
- {
- System.out.println(commodity);
- }
-
- }
-
- }
|