以前,web application中用到的Context主要有request context、session context、application context。seam中主要新增的两个Context 是conversation context和business process context。
Business process context主要用于工作流方面,让我最感兴趣的是conversation context,可以说seam的核心是conversation context。下面谈谈我对conversation context的理解。
一、概念
Seam官方文档对conversation context的解释包含三个方面:workspace、application transaction with optimistic semantics、workflow task。Workspace的功能在我经历的项目中尚未用到,我认为conversation context是完成一项工作经过的一系列步骤:可以包括一个或多个界面的多次用户交互、多次用户请求、多个数据库事务。在整个过程中涉及的状态及变化保存在conversation context。这也是seam强调自己与其他无状态框架不同,是有状态框架的原因所在。
以一个用户注册的例子为例:假设整个注册过程包含三个页面,第一个页面包括用户名、口令、口令验证,第二个页面包括用户的基本信息如真实姓名、地址、Email、电话等,第三个页面包括用户信用方面的信息。Seam建议的做法是建立二个类:一个是用户类,这是一个实体对象,一个用户注册类、这是一个stateful session bean,其中包含一个用户
属性,及一个口令验证码。第一个页面开始时,conversation context建立;第一个页面提交后,保存用户名、口令信息于会话bean并验证口令,会话bean保存在conversation context; 第二个页面提交后用户基本信息也保存到会话bean;第三个页面提交后用户信息收集完成,会话bean保存用户信息到数据库,然后销毁会话bean, conversation context结束。
二、Conversation 模型
Conversation 模型遵循如下规则:
1. conversation context分二种:long-running conversation context和temporary conversation context。 JSF生命周期的每个阶段都有一个活动的conversation,conversation;
2. 在JSF生命周期的第一个阶段—restore view阶段,seam恢复先前的long-running conversation context,如果没有,seam创建一个temporary conversation context。
3. 当遇到有状态会话bean中方法带@Begin标注时,temporary conversation context提升为long-running conversation context,conversation开始;
4. 当遇到有状态会话bean中方法带@End标注时,long-running conversation context降级为temporary conversation context,conversation结束;
5. 在JSF生命周期的最后一个阶段—响应视图呈现后,seam保存long-running conversation context中的有状态对象或销毁temporary conversation context中的对象;
6. 一般情况下,页面请求(JSF Post)传递conversation context到下一阶段,非页面请求(如Get 请求)不传递conversation context到下一阶段;
7. 如果JSF生命周期被重定向截断,seam仍存储并恢复当前conversation context,除非当前conversation context被@End(beforeRedirect=true)标注方法终止。
三、用法
1.
调用有状态会话bean中带@Begin
标注方法时开始conversation ,带@End标注方法时结束conversation。
2. 用Get request开始conversation。因为普通JSF页面通过get方式请求时不能触发任何事件侦听方法,而有时用户又希望页面被访问即开始conversation,访问其中的状态。为此,seam提供了一个内置的方法来解决这个问题,开发人员只需在pages.xml定义访问页面时希望触发的事件即可。例如:
<pages>
<page view-id="/dvd.xhtml" action="#{search.selectFromRequest}"/>
</pages>
<pages></pages> <pages></pages> <page action="#{search.selectFromRequest}" view-id="/dvd.xhtml"></page>
更多推荐
SEAM框架之我见--关于Conversation
发布评论