读一点写一点,写完发布到seam圈子,读得很粗糙,有错误请指出。
seam通过两个监听器介入jsf,SeamPhaseListener,DocumentStorePhaseListener
SeamPhaseListener的getPhaseId()方法返回new PhaseId("ANY"),意味着监听所有阶段
DocumentStorePhaseListener的getPhaseId()方法返回new PhaseId("RENDER_RESPONSE")
1、恢复视图
之前,seam将把Contexts中的状态指向ernalContext下的对应状态,conversationContext设为空
jsf,试图从facesContext恢复视图,如果为空,从xml类型文件构建视图,执行doPerComponentActions(facesContext, viewRoot);计算bind表达式
之后,从请求参数取得对话id,接下来发生的事seam文档说得很清楚了,恢复或新建对话,conversationContext内部状态指向session上下文。conversationContext的管理比较有趣,请参见[url]http://afadgaeg.iteye.com/blog/286963[/url]的结尾部分,seam在这里还处理页面参数,包括转换,验证和更新到模型(按照pages.xml的配置)
2、应用请求值
seam不干预,jsf在组件树上执行
3、执行验证
之前,不干预
jsf,在组件树上执行验证
之后,如果验证失败,触发一个seam事件
4、更新模型值
seam不干预,jsf在组件树上执行
5、执行应用
之前,不干预
jsf,在组件树上执行事件
之后,这里还没看明白,与事务有关,增加事务失败消息
6、渲染
之前,
//SeamPhaseListener,执行pages.xml定义的页面动作等内容,并有可能执行导航。保存对话和页面流标志,
Pages.preRender(FacesContext facesContext)方法是主角,该方法有较为详细的注释。preRender()调用Pages.callAction(FacesContext facesContext)方法执行请求参数"actionOutcome"和"actionMethod"的页面动作和导航(如果参数存在的话)。
如果并非如以上,最终seam调用Page.preRender(FacesContext facesContext)以执行在pages.xml中定义的页面动作,并可能导航。
Pages中@Create public void create()完成读取pages.xml并把配置参数维护在一系列对象中,其中导航规则维护在Navigation实例中。
导航通过调用NavigationHandler.handleNavigation(...)进行,SeamNavigationHandler继承了NavigationHandler并覆盖了handleNavigation(...),在handleNavigation(...)中优先使用Pages.navigate(...)导航,Pages.navigate(...)根据Navigation实例中的规则进行导航。
seam的faces-config.xml中有如下配置
待续。。。
//DocumentStorePhaseListener应该是与pdf,word等特殊文档的请求有关,猜的
jsf,渲染
之后,保存对话,保存页面流,SeamPhaseListener做收尾清理工作
seam通过两个监听器介入jsf,SeamPhaseListener,DocumentStorePhaseListener
SeamPhaseListener的getPhaseId()方法返回new PhaseId("ANY"),意味着监听所有阶段
DocumentStorePhaseListener的getPhaseId()方法返回new PhaseId("RENDER_RESPONSE")
1、恢复视图
之前,seam将把Contexts中的状态指向ernalContext下的对应状态,conversationContext设为空
jsf,试图从facesContext恢复视图,如果为空,从xml类型文件构建视图,执行doPerComponentActions(facesContext, viewRoot);计算bind表达式
之后,从请求参数取得对话id,接下来发生的事seam文档说得很清楚了,恢复或新建对话,conversationContext内部状态指向session上下文。conversationContext的管理比较有趣,请参见[url]http://afadgaeg.iteye.com/blog/286963[/url]的结尾部分,seam在这里还处理页面参数,包括转换,验证和更新到模型(按照pages.xml的配置)
2、应用请求值
seam不干预,jsf在组件树上执行
3、执行验证
之前,不干预
jsf,在组件树上执行验证
之后,如果验证失败,触发一个seam事件
4、更新模型值
seam不干预,jsf在组件树上执行
5、执行应用
之前,不干预
jsf,在组件树上执行事件
之后,这里还没看明白,与事务有关,增加事务失败消息
6、渲染
之前,
//SeamPhaseListener,执行pages.xml定义的页面动作等内容,并有可能执行导航。保存对话和页面流标志,
Pages.preRender(FacesContext facesContext)方法是主角,该方法有较为详细的注释。preRender()调用Pages.callAction(FacesContext facesContext)方法执行请求参数"actionOutcome"和"actionMethod"的页面动作和导航(如果参数存在的话)。
如果并非如以上,最终seam调用Page.preRender(FacesContext facesContext)以执行在pages.xml中定义的页面动作,并可能导航。
Pages中@Create public void create()完成读取pages.xml并把配置参数维护在一系列对象中,其中导航规则维护在Navigation实例中。
导航通过调用NavigationHandler.handleNavigation(...)进行,SeamNavigationHandler继承了NavigationHandler并覆盖了handleNavigation(...),在handleNavigation(...)中优先使用Pages.navigate(...)导航,Pages.navigate(...)根据Navigation实例中的规则进行导航。
seam的faces-config.xml中有如下配置
<navigation-handler>org.jboss.seam.jsf.SeamNavigationHandler</navigation-handler>
<view-handler>org.jboss.seam.jsf.SeamViewHandler</view-handler>
待续。。。
//DocumentStorePhaseListener应该是与pdf,word等特殊文档的请求有关,猜的
jsf,渲染
之后,保存对话,保存页面流,SeamPhaseListener做收尾清理工作