EJB 3.0入门:Stateful Session Bean
介绍 stateful session bean能保存自身状态。当客户端调用相同bean stub的函数,该调用动作总是被指向容器中的同一个bean进程。因此,只要客户端应用程序保留bean stub(或者本地客户端的reference ),bean进程中的所有属性变量将保留其值。stateful session bean在应用程序中主要用于状态跟踪。在一个web应用中,
·
介绍
本节中,我们实现一个投资计算应用,在一个session中,记录上一次计算的状况。在一个web session中,每次存取jsp页面,都取得同一个 calculator bean stub,然后从 EJB 3.0容器中的同一bean进程中加载会话历史记录。
具有状态属性的接口
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 的实现
客户端
完整代码
本节讨论了web应用中如何使用 stateful session bean来保存用户会话信息。必须理解 session bean的生命期概念才能管理 session bean的内部状态。因此,读一读下一节吧。
译自
http://trailblazer.demo.jboss.com/EJB3Trail/serviceobjects/sfsb/
2007.4.13
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 ...
}
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
(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 服务器
- Calculator.java: bean的本地商业逻辑接口。
- StatefulCalculator.java: stateful session bean 的实现
EJB 客户端
- calculator.jsp: stateful calculator session bean的客户端
本节讨论了web应用中如何使用 stateful session bean来保存用户会话信息。必须理解 session bean的生命期概念才能管理 session bean的内部状态。因此,读一读下一节吧。
译自
http://trailblazer.demo.jboss.com/EJB3Trail/serviceobjects/sfsb/
2007.4.13
更多推荐
已为社区贡献1条内容
所有评论(0)