【原創】eclipse + JBoss 5 + EJB3開發指南(2):編寫有狀態的SessionBean

銀河使者發表於2009-05-13
本文為原創,如需轉載,請註明作者和出處,謝謝!

    編寫有狀態的(Stateful)的Session Bean也非常簡單,只需要將無狀態註釋(@Stateless)改成有狀態註釋(@Stateful)即可。如果使用Stateful Sessionbean,客戶端在使用同一個SessionBean物件例項時可以儲存狀態,也就是說,在多次引用該物件時實際上在服務端是使用的同一個 Sessionbean的物件例項,而無狀態sessionbean使用了不同的sessionbean物件例項,因此,是無法儲存狀態的。
    下面將編寫一個簡單的購物車的例子,該例子將客戶購買的商品都儲存在stateful sessionbean中的List物件中。然後在客戶端使用同一個sessionbean的物件例項輸出這些商品。我們首先來實現一個 sessionbean的遠端介面,這和無狀態sessionbean是一樣的。程式碼如下:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtpackage 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,程式碼如下:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtpackage 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;
    }    
}

    最後我們編寫一個客戶端呼叫程式,程式碼如下:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtpackage 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目錄下,內容如下;
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtjava.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url
=localhost

    在執行上面的程式後,將輸出如下的資訊:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt自行車
膝上型電腦
液晶電視

    從上面的輸出結果可以看出,使用getCommodity方法成功獲得了所有的商品資訊。要注意的是,需要使用同一個sessionbean物件例項 (shoppingCart)才能儲存狀態。如果在web應用程式中,需要將shoppingCart物件儲存在Session中,這樣在同一個會話中的 使用者就可以使用該購物車物件了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-594943/,如需轉載,請註明出處,否則將追究法律責任。

相關文章