編寫有狀態(tài)的(Stateful)的Session Bean也非常簡單,只需要將無狀態(tài)注釋(@Stateless)改成有狀態(tài)注釋(@Stateful)即可。如果使用Stateful Sessionbean,客戶端在使用同一個SessionBean對象實例時可以保存狀態(tài),也就是說,在多次引用該對象時實際上在服務(wù)端是使用的同一個 Sessionbean的對象實例,而無狀態(tài)sessionbean使用了不同的sessionbean對象實例,因此,是無法保存狀態(tài)的。
下面將編寫一個簡單的購物車的例子,該例子將客戶購買的商品都保存在stateful sessionbean中的List對象中。然后在客戶端使用同一個sessionbean的對象實例輸出這些商品。我們首先來實現(xiàn)一個 sessionbean的遠程接口,這和無狀態(tài)sessionbean是一樣的。代碼如下:
- package service;
- import java.util.List;
- import javax.ejb.Remote;
- public interface ShoppingCart
- {
-
- public void addCommodity (String value);
-
- public List getCommodity();
- }
|
為了方便,在這里只將商品名保存在List對象中,讀者也可以在List對象中保存更復(fù)雜的信息,如使用一個對象來保存商品信息。
下面來編寫具體的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;
- }
|
最后我們編寫一個客戶端調(diào)用程序,代碼如下:
- 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);
- }
-
- }
-
- }
|