編寫有狀態的(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;
@Remote
public interface ShoppingCart
{
// 添加某個商品信息
public void addCommodity (String value);
// 獲得客戶購買的所有商品的紗銜泥
public List<String> 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<String> shoppingCart = new ArrayList<String>();
@Override
public void addCommodity(String value)
{
shoppingCart.add(value);
}
@Override
public List<String> 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);
}
}
}
在客戶端調用時,需要將ShoppingCart接口復制到客戶端,當然,@Remote可以去掉。別忘了引用 JBoss安裝目錄中的client目錄中的jar文件。客戶端仍然使用了jndi.properties文件來配置相應的信息 ,該文件位於src目錄下,內容如下;
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost
在執行上面的程序後,將輸出如下的信息:
自行車
筆記本電腦
液晶電視
從上面的輸出結果可以看出,使用getCommodity方法成功獲得了所有的商品信息。要注意的是,需要 使用同一個sessionbean對象實例(shoppingCart)才能保存狀態。如果在web應用程序中,需要將 shoppingCart對象保存在Session中,這樣在同一個會話中的用戶就可以使用該購物車對象了。