`

JSF 源代码赏析之Lifecycle

 
阅读更多

JSF 源代码赏析之Lifecycle

关键字: jsf sourcecode lifecycle

JSF的生命周期在JSF应用中起着至关重要的作用,每一个JSF请求的处理都需要经过一次生命周期,本文从源码的角度分析JSF的生命周期。
在讨论生命周期之前,我们先要讨论FacesContext的一些元素,他们在整个生命周期中扮演了非常重要的角色。么个JSF应用必须保存它所处理的请求信息,FacesContext为处理请求和生成响应保存了所有必需的上下文信息,具体而言,它包括:
1.信息队列,MessageQueue,保存所有的消息
2.当前的组件树,ViewRoot,
3.外部上下文,ExternalContext
4.Application。
下面就是Sun的FacesContextImpl中的变量:
com.sun.faces.context.FacesContextImpl:
  1. //RelationshipInstanceVariables
  2. privateResponseStreamresponseStream=null;
  3. privateResponseWriterresponseWriter=null;
  4. privateExternalContextexternalContext=null;
  5. privateApplicationapplication=null;
  6. privateUIViewRootviewRoot=null;
  7. privateELContextelContext=null;
  8. privateRenderKitFactoryrkFactory;
  9. privateRenderKitlastRk;
  10. privateStringlastRkId;
  11. /**
  12. *StoremappingofclientIdtoArrayListofFacesMessage
  13. *instances.ThenullkeyisusedtorepresentFacesMessageinstances
  14. *thatarenotassociatedwithaclientIdinstance.
  15. */
  16. privateMap<String,List<FacesMessage>>componentMessageLists;
  17. //AttributeInstanceVariables
  18. privatebooleanrenderResponse=false;
  19. privatebooleanresponseComplete=false;

这里面有很多重要的对象值得我们去研究,按照从上到下的顺序,我们先来看看ExternalContext。
ExternalContext其实是对ServletContext(或PortletContext)的封装,提供了访问外部容器资源的各种方法,ExternalContext基类定义如下:
javax.faces.context.ExternalContext:
  1. publicabstractclassExternalContext{
  2. publicstaticfinalStringBASIC_AUTH="BASIC";
  3. publicstaticfinalStringCLIENT_CERT_AUTH="CLIENT_CERT";
  4. publicstaticfinalStringDIGEST_AUTH="DIGEST";
  5. publicstaticfinalStringFORM_AUTH="FORM";
  6. //----------------------------------------------------------PublicMethods
  7. publicabstractvoiddispatch(Stringpath)
  8. throwsIOException;
  9. publicabstractStringencodeActionURL(Stringurl);
  10. publicabstractStringencodeNamespace(Stringname);
  11. publicabstractStringencodeResourceURL(Stringurl);
  12. publicabstractStringgetAuthType();
  13. publicabstractObjectgetContext();
  14. publicabstractStringgetInitParameter(Stringname);
  15. publicabstractMapgetInitParameterMap();
  16. publicabstractStringgetRemoteUser();
  17. publicabstractObjectgetRequest();
  18. publicvoidsetRequest(Objectrequest){
  19. ExternalContextimpl;
  20. if(null!=(impl=(ExternalContext)this.getRequestMap().
  21. get("com.sun.faces.ExternalContextImpl"))){
  22. impl.setRequest(request);
  23. return;
  24. }
  25. thrownewUnsupportedOperationException();
  26. }
  27. publicvoidsetRequestCharacterEncoding(Stringencoding)throwsUnsupportedEncodingException{
  28. ExternalContextimpl;
  29. if(null!=(impl=(ExternalContext)this.getRequestMap().
  30. get("com.sun.faces.ExternalContextImpl"))){
  31. impl.setRequestCharacterEncoding(encoding);
  32. return;
  33. }
  34. thrownewUnsupportedOperationException();
  35. }
  36. publicabstractStringgetRequestContextPath();
  37. publicabstractLocalegetRequestLocale();
  38. publicabstractIterator<locale></locale>getRequestLocales();
  39. publicabstractIterator<string></string>getRequestParameterNames();
  40. publicabstractStringgetRequestPathInfo();
  41. publicabstractStringgetRequestServletPath();
  42. publicStringgetRequestCharacterEncoding(){
  43. ExternalContextimpl;
  44. if(null!=(impl=(ExternalContext)this.getRequestMap().
  45. get("com.sun.faces.ExternalContextImpl"))){
  46. //noinspectionTailRecursion
  47. returnimpl.getRequestCharacterEncoding();
  48. }
  49. thrownewUnsupportedOperationException();
  50. }
  51. publicStringgetRequestContentType(){
  52. ExternalContextimpl;
  53. if(null!=(impl=(ExternalContext)this.getRequestMap().
  54. get("com.sun.faces.ExternalContextImpl"))){
  55. //noinspectionTailRecursion
  56. returnimpl.getRequestContentType();
  57. }
  58. thrownewUnsupportedOperationException();
  59. }
  60. publicStringgetResponseCharacterEncoding(){
  61. ExternalContextimpl;
  62. if(null!=(impl=(ExternalContext)this.getRequestMap().
  63. get("com.sun.faces.ExternalContextImpl"))){
  64. //noinspectionTailRecursion
  65. returnimpl.getResponseCharacterEncoding();
  66. }
  67. thrownewUnsupportedOperationException();
  68. }
  69. publicStringgetResponseContentType(){
  70. ExternalContextimpl;
  71. if(null!=(impl=(ExternalContext)this.getRequestMap().
  72. get("com.sun.faces.ExternalContextImpl"))){
  73. //noinspectionTailRecursion
  74. returnimpl.getResponseContentType();
  75. }
  76. thrownewUnsupportedOperationException();
  77. }
  78. publicabstractURLgetResource(Stringpath)throwsMalformedURLException;
  79. publicabstractInputStreamgetResourceAsStream(Stringpath);
  80. publicabstractSet<string></string>getResourcePaths(Stringpath);
  81. publicabstractObjectgetResponse();
  82. publicabstractObjectgetSession(booleancreate);
  83. publicabstractPrincipalgetUserPrincipal();
  84. publicabstractbooleanisUserInRole(Stringrole);
  85. publicabstractvoidlog(Stringmessage,Throwableexception);
  86. publicabstractvoidredirect(Stringurl)throwsIOException;
  87. }

这个抽象类共有1000多行,提供了访问外部资源的各种方法,主要是对ServletContext或是PortletContext中方法的封装,比如getRemoteUser、getRequest、getSession等方法都是很常用的,但是在运用时也要注意,如果在程序中写死是ServletContext或HttpServletRequest,那么以后对于更换到Portal环境中是不利的,这个如果需要转换的话需要注意了。
下面来看看Application对象。Application对象是应用系统范围内的单例类,提供了对FacesContext文件的对象封装,从这个对象中可以得到很多FacesContext文件中的配置,还是来看看定义吧.

  1. //-------------------------------------------------------------Properties
  2. publicabstractActionListenergetActionListener();
  3. publicabstractvoidsetActionListener(ActionListenerlistener);
  4. publicabstractvoidsetDefaultLocale(Localelocale);
  5. publicabstractStringgetDefaultRenderKitId();
  6. publicabstractvoidsetDefaultRenderKitId(StringrenderKitId);
  7. publicabstractStringgetMessageBundle();
  8. publicabstractvoidsetMessageBundle(Stringbundle);
  9. publicabstractNavigationHandlergetNavigationHandler();
  10. publicabstractvoidsetNavigationHandler(NavigationHandlerhandler);
  11. publicabstractPropertyResolvergetPropertyResolver();
  12. publicResourceBundlegetResourceBundle(FacesContextctx,Stringname){
  13. Applicationapp=getRIApplicationImpl(ctx);
  14. if(app!=null){
  15. //noinspectionTailRecursion
  16. returnapp.getResourceBundle(ctx,name);
  17. }
  18. thrownewUnsupportedOperationException();
  19. }
  20. publicabstractVariableResolvergetVariableResolver();
  21. publicabstractvoidsetVariableResolver(VariableResolverresolver);
  22. publicvoidaddELResolver(ELResolverresolver){
  23. Applicationapp=getRIApplicationImpl();
  24. if(app!=null){
  25. app.addELResolver(resolver);
  26. }else{
  27. thrownewUnsupportedOperationException();
  28. }
  29. }
  30. publicELResolvergetELResolver(){
  31. Applicationapp=getRIApplicationImpl();
  32. if(app!=null){
  33. //noinspectionTailRecursion
  34. returnapp.getELResolver();
  35. }
  36. thrownewUnsupportedOperationException();
  37. }
  38. publicabstractViewHandlergetViewHandler();
  39. publicabstractvoidsetViewHandler(ViewHandlerhandler);
  40. publicabstractStateManagergetStateManager();
  41. publicabstractvoidsetStateManager(StateManagermanager);
  42. //-------------------------------------------------------ObjectFactories
  43. publicabstractvoidaddComponent(StringcomponentType,
  44. StringcomponentClass);
  45. publicabstractUIComponentcreateComponent(StringcomponentType)
  46. throwsFacesException;
  47. publicabstractUIComponentcreateComponent(ValueBindingcomponentBinding,
  48. FacesContextcontext,
  49. StringcomponentType)
  50. rowsFacesException;
  51. publicUIComponentcreateComponent(ValueExpressioncomponentExpression,
  52. FacesContextcontext,
  53. StringcomponentType)
  54. rowsFacesException{
  55. if(null==componentExpression||null==context||
  56. null==componentType){
  57. //PENDING-i18n
  58. StringBuilderbuilder=newStringBuilder(64);
  59. builder.append("nullparameters-");
  60. builder.append("componentExpression:").append(componentExpression);
  61. builder.append(",context:").append(context);
  62. builder.append(",componentType:").append(componentType);
  63. thrownewNullPointerException(builder.toString());
  64. }
  65. Objectresult;
  66. booleancreateOne=false;
  67. try{
  68. if(null!=(result=
  69. componentExpression.getValue(context.getELContext()))){
  70. //iftheresultisnotaninstanceofUIComponent
  71. createOne=(!(resultinstanceofUIComponent));
  72. //wehavetocreateone.
  73. }
  74. if(null==result||createOne){
  75. result=this.createComponent(componentType);
  76. componentExpression.setValue((context.getELContext()),result);
  77. }
  78. }catch(ELExceptionelex){
  79. thrownewFacesException(elex);
  80. }
  81. return(UIComponent)result;
  82. }
  83. publicabstractIterator<String>getComponentTypes();
  84. publicabstractvoidaddConverter(StringconverterId,
  85. publicabstractvoidaddConverter(ClasstargetClass,
  86. StringconverterClass);
  87. publicabstractConvertercreateConverter(StringconverterId);
  88. publicabstractConvertercreateConverter(ClasstargetClass);
  89. publicabstractIterator<String>getConverterIds();
  90. publicExpressionFactorygetExpressionFactory(){
  91. Applicationapp=getRIApplicationImpl();
  92. if(app!=null){
  93. //noinspectionTailRecursion
  94. returnapp.getExpressionFactory();
  95. }
  96. thrownewUnsupportedOperationException();
  97. }
  98. publicObjectevaluateExpressionGet(FacesContextcontext,
  99. Stringexpression,
  100. ClassexpectedType)throwsELException{
  101. Applicationapp=getRIApplicationImpl(context);
  102. if(app!=null){
  103. //noinspectionTailRecursion
  104. returnapp.evaluateExpressionGet(context,expression,expectedType);
  105. }
  106. thrownewUnsupportedOperationException();
  107. }
  108. publicabstractMethodBindingcreateMethodBinding(Stringref,
  109. Classparams[])
  110. throwsReferenceSyntaxException;
  111. publicabstractIterator<Locale>getSupportedLocales();
  112. publicabstractvoidsetSupportedLocales(Collection<Locale>locales);
  113. publicvoidaddELContextListener(ELContextListenerlistener){
  114. Applicationapp=getRIApplicationImpl();
  115. if(app!=null){
  116. app.addELContextListener(listener);
  117. }else{
  118. thrownewUnsupportedOperationException();
  119. }
  120. }
  121. publicvoidremoveELContextListener(ELContextListenerlistener){
  122. Applicationapp=getRIApplicationImpl();
  123. if(app!=null){
  124. app.removeELContextListener(listener);
  125. }else{
  126. thrownewUnsupportedOperationException();
  127. }
  128. }
  129. publicELContextListener[]getELContextListeners(){
  130. Applicationapp=getRIApplicationImpl();
  131. if(app!=null){
  132. //noinspectionTailRecursion
  133. returnapp.getELContextListeners();
  134. }else{
  135. thrownewUnsupportedOperationException();
  136. }
  137. }
  138. publicabstractvoidaddValidator(StringvalidatorId,
  139. StringvalidatorClass);
  140. publicabstractValidatorcreateValidator(StringvalidatorId)
  141. throwsFacesException;
  142. publicabstractIterator<String>getValidatorIds();
  143. publicabstractValueBindingcreateValueBinding(Stringref)
  144. throwsReferenceSyntaxException;
  145. //---------------------------------------------------------PrivateMethods
  146. privatestaticApplicationgetRIApplicationImpl(FacesContextcontext){
  147. ExternalContextextContext;
  148. if(context!=null){
  149. extContext=context.getExternalContext();
  150. }else{
  151. extContext=
  152. FacesContext.getCurrentInstance().getExternalContext();
  153. }
  154. if(extContext!=null){
  155. return((Application)extContext.getApplicationMap().
  156. get("com.sun.faces.ApplicationImpl"));
  157. }
  158. returnnull;
  159. }
  160. privatestaticApplicationgetRIApplicationImpl(){
  161. returngetRIApplicationImpl(null);
  162. }
分享到:
评论

相关推荐

    JavaEE源代码 jsf-api

    JavaEE源代码 jsf-apiJavaEE源代码 jsf-apiJavaEE源代码 jsf-apiJavaEE源代码 jsf-apiJavaEE源代码 jsf-apiJavaEE源代码 jsf-apiJavaEE源代码 jsf-apiJavaEE源代码 jsf-apiJavaEE源代码 jsf-apiJavaEE源代码 jsf-...

    JavaEE源代码 jsf-impl

    JavaEE源代码 jsf-implJavaEE源代码 jsf-implJavaEE源代码 jsf-implJavaEE源代码 jsf-implJavaEE源代码 jsf-implJavaEE源代码 jsf-implJavaEE源代码 jsf-implJavaEE源代码 jsf-implJavaEE源代码 jsf-implJavaEE源...

    Jsf 项目源代码

    在"Jsf 项目源代码"这个压缩包中,我们可以推测这包含了一个基于JSF 2.0版本的项目。JSF 2.0是该框架的一个重要版本,引入了许多增强功能,例如面部刷新(Facelet)、视图状态管理、自定义标签改进以及请求处理的...

    JSF上传 JSF大文件上传 JSF上传代码 JSF上传源代码

    项目的源代码中应该包含了上述所有部分,提供了一个完整的JSF大文件上传解决方案。对于希望学习或改进自己JSF文件上传功能的开发者来说,这是一个宝贵的资源。通过深入研究源代码,可以了解到如何处理大文件、如何...

    jsf 源代码

    JSF的组件模型是其核心特性之一。它提供了大量的UI组件,如按钮、输入框、表格等,开发者可以通过XML(在JSF中是Facelets或JSP)来声明这些组件。每个组件都有自己的生命周期和属性,可以与后端的数据模型绑定,实现...

    Core JSF源代码

    **标题“Core JSF源代码”** 提供的源码可能是书中示例代码的集合,这些代码可以帮助读者更直观地理解书中讲解的概念和技术。通过分析和运行这些源码,开发者可以更好地学习JSF的实践操作和工作原理。 **描述中的...

    JSF2.0源代码

    **JSF 2.0 源代码详解** JavaServer Faces (JSF) 是一个用于构建Web用户界面的Java框架,由Sun Microsystems(现已被Oracle收购)开发并维护。JSF 2.0是该框架的一个重要版本,它带来了许多改进和新特性,提升了...

    JSF1.2.07版源代码

    **JSF 1.2.07 源代码详解** JavaServer Faces (JSF) 是Java平台上用于构建用户界面的官方标准框架,它提供了一种声明式的方式来创建Web应用程序。JSF 1.2是该框架的一个重要版本,引入了许多增强功能和改进,为...

    JSF实例源代码下载

    在这个"JSF实例源代码下载"中,我们有机会深入学习和理解JSF的工作原理及其应用。 1. **JSF框架概述**:JSF设计的主要目标是简化服务器端的Web开发,通过提供可重用的UI组件和事件处理机制。JSF生命周期包括六步:...

    jsf1.2源代码下载

    **JSF 1.2 源代码详解** JavaServer Faces (JSF) 是一个用于构建用户界面的Java EE框架,它提供了一种组件化的方式来创建Web应用程序。JSF 1.2是该框架的一个重要版本,发布于2007年,带来了许多增强功能和改进,...

    JSF入门实例 源代码

    这个"JSF入门实例 源代码"是专门为初学者设计的,帮助他们快速理解并掌握JSF的基本概念和用法。下面我们将深入探讨JSF的核心特性、工作原理以及如何通过给定的实例进行学习。 1. JSF概述: JSF是一种官方支持的...

    JSF工程实例源代码

    **JSF(JavaServer Faces)** 是Java平台上的一种用于...通过研究源代码,你可以了解如何将用户界面与后端服务集成,以及如何处理复杂的文件I/O和数据库操作。此外,这个实例也可以作为你自定义文件管理系统的起点。

    完整的jsf博客源代码

    在本例中,我们有一个完整的JSF博客源代码,该源码使用了Apache Derby数据库,特别适合初学者用来学习JSF的基础知识和实际应用。** **1. JSF框架详解** JSF的核心概念是组件模型,它允许开发者通过拖放UI组件来构建...

    JSF学习代码

    5. **分页(Pagination)**:在**"JSF 分页学习代码"**标签下,可能包含了一个示例,展示如何在JSF应用中实现数据的分页显示,这通常涉及到对大量数据集的处理和展示策略。 6. **JSF与Spring、Hibernate集成**:在`...

    JSF IN ACTION 源代码

    **JSF IN ACTION 源代码详解** "JSF IN ACTION 源代码" 是一本深入探讨JavaServer Faces(JSF)技术的书籍的配套源码。这本书籍旨在帮助开发者全面理解JSF框架,通过实践代码来提升技能。源代码的提供意味着读者...

    richface and jsf 源代码

    richface,jsf源码。相当不错的资料。特别是richface.里面有不错的例子。放到tomcat下可以直接运行啊。

    JSF(java server faces)开源框架的源代码

    在你所拥有的"JSF(java server faces)开源框架的源代码"压缩包中,包含的是JSF 1.1版本的源码,这对于深入理解和学习这个框架有着重要的价值。 首先,让我们来看看JSF框架的基础结构和主要组成部分: 1. **组件...

    JSF编程 光盘 源代码 2

    本资源包含的是《JSF编程》一书第二章的配套源代码,这将有助于读者深入理解JSF的工作原理和实践应用。 在JSF中,一个关键概念是UI组件。这些组件可以是简单的HTML元素,如按钮和文本输入,也可以是复杂的自定义...

    JSF2入门视频+源代码教程

    **JSF2入门视频+源代码教程** JavaServer Faces(JSF)是Oracle公司推出的用于构建Web应用程序的Java EE框架。JSF2是其第二个主要版本,带来了许多增强功能和改进,使得开发更加高效和易用。这个"JSF2入门视频+源...

    jsf实用代码

    在这个“jsf实用代码”压缩包中,我们可能找到了与JSF相关的代码示例,特别是与`select`标签相关的部分,这通常指的是在JSF中用于创建下拉选择框或者多选框的元素。 在JSF中,`&lt;h:selectOneMenu&gt;`和`...

Global site tag (gtag.js) - Google Analytics