以前,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定义访问页面时希望触发的事件即可。例如:   &lt;pages&gt; &lt;page view-id="/dvd.xhtml" action="#{search.selectFromRequest}"/&gt; &lt;/pages&gt;        <pages></pages>      <pages></pages>   <page action="#{search.selectFromRequest}" view-id="/dvd.xhtml"></page>         

更多推荐

SEAM框架之我见--关于Conversation