浅谈JSF的生命周期和对ajax处理的影响

开发 后端
本文介绍JSF的生命周期和对ajax处理的影响,以及解读JSF的生命周期。

JSF一个最重要的特点就是组件化(It is all about components),组件化的特点决定了其可扩展性强和协议无关性。对一个JSF组件来说,为其定义特定的Render,该该组件将在WML或telnet中可用。

解读JSF的生命周期:
我觉得研究B/S系统***的方法就是从web.xml开始,相比于传统的JSP系统,JSF需要定义一个Servlet用来对HttpServletRequest进行处理,该servlet为javax.faces.webapp.FacesServlet。在该 servlet初始化阶段,它将生成两个对象:FacesContextFactory和Lifecycle。而在处理请求的service阶段,则会利用FacesContextFactory对象获得当前的FacesContext,lifecycle对象将会对该context对象进行处理。简单的来说,FacesServlet产生一个FacesContext对象,(在JSF的处理过程中,FacesContext是唯一被修改的对象),然后将控制权交给了lifecycle对象,Lifecycle对象将会在六个生命周期中对FacesContext对象进行处理。有一点需要注意的:FacesContext是ThreadLocal的。
JSF包含六个生命周期:
1. Restore view
2. Apply request values; process events
3. Process validations; process events
4. Update model values; process events
5. Invoke application; process events
6. Render response

其中的1-5个阶段将会执行lifecycle的execute()方法,而第六个阶段将会执行lifecycle的render()方法。

接下来说说如何将Ajax的应用体现在JSF组件上:

1. Ajax完全独立于JSF。即为Ajax请求创建一个额外的Servlet/Filter 控制器,这也是最自然而然的想法。通过传统的Ajax请求方式完成该jsf组件的Ajax体现,该Ajax请求通过jsf组件中写入的js触发。优点是自然,不需要接触JSF层面的东西,比较独立;缺点是重用性差,且页面开发者必须自己写js代码。

2. Ajax嵌入JSF组件中,即需要自定义组件。该方法与方法1很相似,不同的是组件开发者将会封装js代码和js请求获得的呈现代码。即Ajax应用已经包装在此组件中了,页面开发者不需要关心该Ajax应用是如何完成的,只需要简单调用该组件就可以了。在Lifecycle的Apply Request Values阶段,当Ajax请求处理完后,该组件的Renderer将会调用FacesContext的responseComplete()方法退出 lifecycle。

3. 使用PhaseListener判断是否为Ajax请求,如是,立即执行responseComplete()方法,禁止进入JSF的生命周期以后的 Phase。看下PhaseListener接口的代码,相信用过Spring的都觉得似曾相识,没错,它提供了2个方法beforePhase()和 afterPhase()用来对生命周期中的每一个phase进行pre-action和post-action处理。比较类似Spring中的 advice。一般选择在PhaseListner的afterPhase()方法中进行Ajax处理,处理的过程其实也很简单,当请求到达服务器端,PhaseListener进行处理,当Restore View阶段完成后如果是Ajax请求则进入afterPhase()方法中,进行Ajax处理然后调用FacesContext的 responseComplet()方法完成lifecycle的处理。这也是目前用的最多的一种处理方法。

4. 定义独立的Lifecycle,该Lifecycle只包含三个Phase,即:Apply Request Values; Invoke Application;RenderResponse。在进入lifecycle之前就判断到底进入何种lifecycle,如果是Ajax请求则进入刚定义的包含三个阶段的生命周期,否则则进入常规的六阶段生命周期。其做法就是定义一个类似FacesServlet的选择Lifecycle的 servlet,对指定的Ajax请求(通过url mapping)进行处理。以上是JSF的生命周期和对Ajax处理的影响

【编辑推荐】

  1. 使JSF支持带有HTMLMessage
  2. 利用JSF和Hibernate构建Web应用
  3. 比较JSF、Spring MVC、Stripes、Struts 2、Tapestry、Wicket
  4. JSF能否拯救WEB
  5. 各种JSF框架比较
责任编辑:佚名 来源: JavaEye
相关推荐

2009-06-11 11:28:35

JSF生命周期

2009-06-24 10:47:55

JSF生命周期

2009-06-24 10:34:39

JSF生命周期JSF应用程序

2009-06-18 13:32:39

Java线程生命周期

2015-07-08 16:28:23

weak生命周期

2022-04-19 07:20:24

软件开发安全生命周期SSDLC应用安全

2009-08-04 16:05:15

ASP.NET页面生命

2012-05-28 15:37:20

WP程序生命周期

2010-07-14 10:48:37

Perl线程

2022-06-01 09:25:16

嵌套生命周期智能技术工业资产

2023-12-18 08:24:56

ViewModel数据操作Android

2012-04-28 13:23:12

Java生命周期

2011-06-16 09:31:21

ActivityAndroid

2009-06-17 15:06:50

Hibernate实体

2019-10-16 10:50:13

Linux内核测试

2012-01-16 09:00:56

线程

2013-07-29 05:11:38

iOS开发iOS开发学习类的'生命周期'

2010-07-14 10:59:15

Perl线程

2021-02-14 00:39:57

机器学习技术人工智能

2013-06-18 10:48:41

OpenSUSEOpenSUSE 12
点赞
收藏

51CTO技术栈公众号