介绍

    stateful session bean能保存自身状态。当客户端调用相同bean stub的函数,该调用动作总是被指向容器中的同一个bean进程。因此,只要客户端应用程序保留bean stub(或者本地客户端的reference ),bean进程中的所有属性变量将保留其值。stateful session bean在应用程序中主要用于状态跟踪。

  • 在一个web应用中,servlet(或JSP 页面)在HttpSession对象中缓存bean stub,并将其作为一个属性。HTTP 会话的状态即被保存于bean进程中。
  • rich client Java应用(即Swing 应用)中,程序确定哪些是"session",并缓存stateful session bean stub。
例子
    本节中,我们实现一个投资计算应用,在一个session中,记录上一次计算的状况。在一个web session中,每次存取jsp页面,都取得同一个 calculator bean stub,然后从 EJB 3.0容器中的同一bean进程中加载会话历史记录。

具有状态属性的接口
    Calculator接口是这个 session bean的本地商业逻辑接口。请注意,我们增加了存取会话状态属性的函数。 <Integer><Double>元素指明 ArrayList中对象的类型。JDK 1.5中基本类型的介绍可以看 Sun's web site


public interface Calculator {

  
public double calculate (int start, int end, 
                  
double growthrate, double saving);

  
public ArrayList <Integer> getStarts ();
  
public ArrayList <Integer> getEnds ();
  
public ArrayList <Double> getGrowthrates ();
  
public ArrayList <Double> getSavings ();
  
public ArrayList <Double> getResults ();

}

stateful session bean实现
    stateful bean 的实现StatefulCalculator非常简单。我们将其标注为 @Stateful,用几个 ArrayList对象来保存 session bean接口类中定义的bean属性。每个客户端会话开始时, ArrayList即被bean进程初始化。以下为 StatefulCalculator类的代码。 重点注意, stateful session bean类必须实现 Serializable接口,这样 才能做到 当bean进程未运行时,容器将其序列化,并保存其状态信息。

@Stateful
public   class  StatefulCalculator  implements  Calculator, Serializable  {

  
public ArrayList <Integer> starts = new ArrayList <Integer> ();
  
public ArrayList <Integer> ends = new ArrayList <Integer> ();
  
public ArrayList <Double> growthrates = new ArrayList <Double> ();
  
public ArrayList <Double> savings = new ArrayList <Double> ();
  
public ArrayList <Double> results = new ArrayList <Double> ();

  
public double calculate (int start, int end, 
                           
double growthrate, double saving) {
    
    
// calculate the result ...
    
    starts.add(Integer.valueOf(start));
    ends.add(Integer.valueOf(end));
    growthrates.add(Double.valueOf(growthrate));
    savings.add(Double.valueOf(saving));
    results.add(Double.valueOf(result));

    
return result;
  }


  
public ArrayList <Integer> getStarts () {
    
return starts;
  }


  
// Other getter methods for the attributes ...
}

客户端

    在JSP客户端,StatefulCalculator bean stub被调用并与HttpSession对象结合,因此,从相同会话发出的全部HTTP请求到达同一个stub,以及容器中的同一个bean进程。以下是JSP的代码片断。

Calculator cal  =
      (Calculator) session.getAttribute(
" sfsb_cal " );
if  (cal  ==   null {
  
try {
    InitialContext ctx 
= new InitialContext();
    cal 
= (Calculator) ctx.lookup(
            
"EJB3Trail/StatefulCalculator/local");
    session.setAttribute (
"sfsb_cal", cal);
  }
 catch (Exception e) {
    e.printStackTrace ();
  }

}


//  Make use of the cal object

完整代码

EJB 服务器

EJB 客户端

总结
    本节讨论了web应用中如何使用 stateful session bean来保存用户会话信息。必须理解 session bean的生命期概念才能管理 session bean的内部状态。因此,读一读下一节吧。



译自
http://trailblazer.demo.jboss.com/EJB3Trail/serviceobjects/sfsb/
2007.4.13












Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐