`

JSF 源代码赏析之Lifecycle

    博客分类:
  • JSF
阅读更多
   JSF的生命周期在JSF应用中起着至关重要的作用,每一个JSF请求的处理都需要经过一次生命周期,本文从源码的角度分析JSF的生命周期。
   在讨论生命周期之前,我们先要讨论FacesContext的一些元素,他们在整个生命周期中扮演了非常重要的角色。么个JSF应用必须保存它所处理的请求信息,FacesContext为处理请求和生成响应保存了所有必需的上下文信息,具体而言,它包括:
     1.信息队列,MessageQueue,保存所有的消息
     2.当前的组件树,ViewRoot,
     3.外部上下文,ExternalContext
     4.Application。
  下面就是Sun的FacesContextImpl中的变量:
 
com.sun.faces.context.FacesContextImpl:
  1. // Relationship Instance Variables   
  2.      private ResponseStream responseStream = null;   
  3.      private ResponseWriter responseWriter = null;   
  4.      private ExternalContext externalContext = null;   
  5.      private Application application = null;   
  6.      private UIViewRoot viewRoot = null;   
  7.      private ELContext elContext = null;   
  8.      private RenderKitFactory rkFactory;   
  9.      private RenderKit lastRk;   
  10.      private String lastRkId;   
  11.   
  12.      /**   
  13.       * Store mapping of clientId to ArrayList of FacesMessage   
  14.       * instances.  The null key is used to represent FacesMessage instances   
  15.       * that are not associated with a clientId instance.   
  16.       */   
  17.      private Map<String,List<FacesMessage>> componentMessageLists;   
  18.      // Attribute Instance Variables   
  19.   
  20.      private boolean renderResponse = false;   
  21.      private boolean responseComplete = false;   

这里面有很多重要的对象值得我们去研究,按照从上到下的顺序,我们先来看看ExternalContext。
ExternalContext其实是对ServletContext(或PortletContext)的封装,提供了访问外部容器资源的各种方法,ExternalContext基类定义如下:
javax.faces.context.ExternalContext:
 
  1. public abstract class ExternalContext {  
  2.     
  3.      
  4.     public static final String BASIC_AUTH = "BASIC";  
  5.     public static final String CLIENT_CERT_AUTH = "CLIENT_CERT";  
  6.     public static final String DIGEST_AUTH = "DIGEST";  
  7.     public static final String FORM_AUTH = "FORM";  
  8.   
  9.     // ---------------------------------------------------------- Public Methods  
  10.     public abstract void dispatch(String path)  
  11.     throws IOException;  
  12.     public abstract String encodeActionURL(String url);  
  13.       
  14.     public abstract String encodeNamespace(String name);  
  15.     public abstract String encodeResourceURL(String url);  
  16.     public abstract String getAuthType();  
  17.     public abstract Object getContext();  
  18.     public abstract String getInitParameter(String name);  
  19.     public abstract Map getInitParameterMap();  
  20.     public abstract String getRemoteUser();  
  21.     public abstract Object getRequest();  
  22.     public void setRequest(Object request) {  
  23.         ExternalContext impl;  
  24.         if (null != (impl = (ExternalContext) this.getRequestMap().  
  25.                 get("com.sun.faces.ExternalContextImpl"))) {  
  26.             impl.setRequest(request);  
  27.             return;  
  28.         }  
  29.           
  30.         throw new UnsupportedOperationException();  
  31.     }  
  32.     public void setRequestCharacterEncoding(String encoding) throws UnsupportedEncodingException {  
  33.         ExternalContext impl;  
  34.         if (null != (impl = (ExternalContext) this.getRequestMap().  
  35.                 get("com.sun.faces.ExternalContextImpl"))) {  
  36.             impl.setRequestCharacterEncoding(encoding);  
  37.             return;  
  38.         }  
  39.         throw new UnsupportedOperationException();  
  40.     }  
  41.     public abstract String getRequestContextPath();  
  42.     public abstract Locale getRequestLocale();  
  43.     public abstract Iterator<locale></locale> getRequestLocales();  
  44.     public abstract Iterator<string></string> getRequestParameterNames();  
  45.     public abstract String getRequestPathInfo();  
  46.     public abstract String getRequestServletPath();  
  47.       
  48.     public String getRequestCharacterEncoding() {  
  49.         ExternalContext impl;  
  50.         if (null != (impl = (ExternalContext) this.getRequestMap().  
  51.                 get("com.sun.faces.ExternalContextImpl"))) {  
  52.             //noinspection TailRecursion  
  53.             return impl.getRequestCharacterEncoding();  
  54.         }  
  55.         throw new UnsupportedOperationException();  
  56.     }  
  57.   
  58.     public String getRequestContentType() {  
  59.         ExternalContext impl;  
  60.         if (null != (impl = (ExternalContext) this.getRequestMap().  
  61.                 get("com.sun.faces.ExternalContextImpl"))) {  
  62.             //noinspection TailRecursion  
  63.             return impl.getRequestContentType();  
  64.         }  
  65.   
  66.         throw new UnsupportedOperationException();  
  67.     }  
  68.   
  69.     public String getResponseCharacterEncoding() {  
  70.         ExternalContext impl;  
  71.         if (null != (impl = (ExternalContext) this.getRequestMap().  
  72.                 get("com.sun.faces.ExternalContextImpl"))) {  
  73.             //noinspection TailRecursion  
  74.             return impl.getResponseCharacterEncoding();  
  75.         }  
  76.           throw new UnsupportedOperationException();  
  77.     }  
  78.   
  79.      public String getResponseContentType() {  
  80.         ExternalContext impl;  
  81.         if (null != (impl = (ExternalContext) this.getRequestMap().  
  82.                 get("com.sun.faces.ExternalContextImpl"))) {  
  83.             //noinspection TailRecursion  
  84.             return impl.getResponseContentType();  
  85.         }
  86.         throw new UnsupportedOperationException();  
  87.     }  
  88.     public abstract URL getResource(String path) throws MalformedURLException;  
  89.     public abstract InputStream getResourceAsStream(String path);  
  90.     public abstract Set<string></string> getResourcePaths(String path);  
  91.     public abstract Object getResponse();  
  92.     public abstract Object getSession(boolean create);  
  93.     public abstract Principal getUserPrincipal();  
  94.     public abstract boolean isUserInRole(String role);  
  95.     public abstract void log(String message, Throwable exception);  
  96.     public abstract void redirect(String url) throws IOException;  
  97. }  

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

  1.  // ------------------------------------------------------------- Properties   
  2.   
  3.  public abstract ActionListener getActionListener();   
  4.   
  5.   
  6.  public abstract void setActionListener(ActionListener listener);   
  7.   
  8.   
  9.  public abstract void setDefaultLocale(Locale locale);   
  10.   
  11.  public abstract String getDefaultRenderKitId();   
  12.   
  13.   
  14.  public abstract void setDefaultRenderKitId(String renderKitId);   
  15.   
  16.  public abstract String getMessageBundle();   
  17.   
  18.   
  19.  public abstract void setMessageBundle(String bundle);   
  20.   
  21.   
  22.  public abstract NavigationHandler getNavigationHandler();   
  23.   
  24.   
  25.  public abstract void setNavigationHandler(NavigationHandler handler);   
  26.   
  27.   
  28.  public abstract PropertyResolver getPropertyResolver();   
  29.   
  30.   
  31.     
  32.  public ResourceBundle getResourceBundle(FacesContext ctx, String name) {   
  33.      Application app = getRIApplicationImpl(ctx);   
  34.      if (app != null) {   
  35.          //noinspection TailRecursion   
  36.          return app.getResourceBundle(ctx, name);   
  37.      }   
  38.         
  39.      throw new UnsupportedOperationException();   
  40.  }   
  41.   
  42.  public abstract VariableResolver getVariableResolver();   
  43.   
  44.   
  45.  public abstract void setVariableResolver(VariableResolver resolver);   
  46.   
  47.   
  48.  public void addELResolver(ELResolver resolver) {   
  49.      Application app = getRIApplicationImpl();   
  50.      if (app != null) {   
  51.          app.addELResolver(resolver);   
  52.      } else {   
  53.          throw new UnsupportedOperationException();   
  54.      }   
  55.  }   
  56.   
  57.  public ELResolver getELResolver() {   
  58.      Application app = getRIApplicationImpl();   
  59.      if (app != null) {   
  60.          //noinspection TailRecursion   
  61.          return app.getELResolver();   
  62.      }   
  63.      throw new UnsupportedOperationException();   
  64.  }   
  65.   
  66.   
  67.  public abstract ViewHandler getViewHandler();   
  68.   
  69.  public abstract void setViewHandler(ViewHandler handler);   
  70.   
  71.  public abstract StateManager getStateManager();   
  72.   
  73.  public abstract void setStateManager(StateManager manager);   
  74.   
  75.   
  76.  // ------------------------------------------------------- Object Factories   
  77.   
  78.  public abstract void addComponent(String componentType,   
  79.                                    String componentClass);   
  80.   
  81.   
  82.  public abstract UIComponent createComponent(String componentType)   
  83.      throws FacesException;   
  84.   
  85.   
  86.  public abstract UIComponent createComponent(ValueBinding componentBinding,   
  87.                                              FacesContext context,   
  88.                                              String componentType)   
  89. rows FacesException;   
  90.   
  91.  public UIComponent createComponent(ValueExpression componentExpression,   
  92.                                     FacesContext context,   
  93.                                     String componentType)   
  94. rows FacesException {   
  95.      if (null == componentExpression || null == context ||   
  96.          null == componentType) {   
  97.         // PENDING - i18n   
  98.          StringBuilder builder = new StringBuilder(64);   
  99.          builder.append("null parameters - ");   
  100.          builder.append("componentExpression: ").append(componentExpression);   
  101.          builder.append(", context: ").append(context);   
  102.          builder.append(", componentType: ").append(componentType);   
  103.          throw new NullPointerException(builder.toString());   
  104.      }   
  105.   
  106.      Object result;   
  107.      boolean createOne = false;   
  108.   
  109.      try {   
  110.          if (null != (result =    
  111.              componentExpression.getValue(context.getELContext()))) {   
  112.              // if the result is not an instance of UIComponent   
  113.              createOne = (!(result instanceof UIComponent));   
  114.              // we have to create one.   
  115.          }   
  116.          if (null == result || createOne) {   
  117.              result = this.createComponent(componentType);   
  118.              componentExpression.setValue((context.getELContext()), result);   
  119.          }   
  120.      } catch (ELException elex) {   
  121.          throw new FacesException(elex);   
  122.      }   
  123.   
  124.      return (UIComponent) result;       
  125.  }   
  126.   
  127.   
  128.  public abstract Iterator<String> getComponentTypes();   
  129.   
  130.   
  131.  public abstract void addConverter(String converterId,    
  132.   
  133.  public abstract void addConverter(Class targetClass,   
  134.                                    String converterClass);   
  135.   
  136.  public abstract Converter createConverter(String converterId);   
  137.   
  138.   
  139.  public abstract Converter createConverter(Class targetClass);   
  140.   
  141.   
  142.  public abstract Iterator<String> getConverterIds();   
  143.   
  144.   
  145.   
  146.  public ExpressionFactory getExpressionFactory() {   
  147.      Application app = getRIApplicationImpl();   
  148.      if (app != null) {   
  149.          //noinspection TailRecursion   
  150.          return app.getExpressionFactory();   
  151.      }   
  152.   
  153.      throw new UnsupportedOperationException();   
  154.  }   
  155.   
  156.   
  157.   
  158.  public Object evaluateExpressionGet(FacesContext context,   
  159.                                      String expression,   
  160.                                      Class expectedType) throws ELException {   
  161.      Application app = getRIApplicationImpl(context);   
  162.      if (app != null) {   
  163.          //noinspection TailRecursion   
  164.          return app.evaluateExpressionGet(context, expression, expectedType);   
  165.      }   
  166.      throw new UnsupportedOperationException();   
  167.  }   
  168.   
  169.  public abstract MethodBinding createMethodBinding(String ref,   
  170.                                                    Class params[])   
  171.      throws ReferenceSyntaxException;   
  172.   
  173.  public abstract Iterator<Locale> getSupportedLocales();   
  174.   
  175.   
  176.  public abstract void setSupportedLocales(Collection<Locale> locales);   
  177.   
  178.   
  179.  public void addELContextListener(ELContextListener listener) {   
  180.      Application app = getRIApplicationImpl();   
  181.      if (app != null) {   
  182.          app.addELContextListener(listener);   
  183.      } else {   
  184.          throw new UnsupportedOperationException();   
  185.      }   
  186.  }   
  187.   
  188.  public void removeELContextListener(ELContextListener listener) {   
  189.      Application app = getRIApplicationImpl();   
  190.      if (app != null) {   
  191.          app.removeELContextListener(listener);   
  192.      } else {   
  193.          throw new UnsupportedOperationException();   
  194.      }   
  195.   
  196.  }   
  197.   
  198.  public ELContextListener [] getELContextListeners() {   
  199.      Application app = getRIApplicationImpl();   
  200.      if (app != null) {   
  201.          //noinspection TailRecursion   
  202.          return app.getELContextListeners();   
  203.      } else {   
  204.          throw new UnsupportedOperationException();   
  205.      }   
  206.  }   
  207.   
  208. public abstract void addValidator(String validatorId,    
  209.           String validatorClass);   
  210.   
  211. public abstract Validator createValidator(String validatorId)   
  212.      throws FacesException;   
  213.   
  214. public abstract Iterator<String> getValidatorIds();   
  215. public abstract ValueBinding createValueBinding(String ref)   
  216.      throws ReferenceSyntaxException;   
  217.   
  218.   
  219.  // --------------------------------------------------------- Private Methods   
  220.   
  221.   
  222.  private static Application getRIApplicationImpl(FacesContext context) {   
  223.      ExternalContext extContext;   
  224.      if (context != null) {   
  225.          extContext = context.getExternalContext();   
  226.      } else {   
  227.          extContext =   
  228.               FacesContext.getCurrentInstance().getExternalContext();   
  229.      }   
  230.      if (extContext != null) {   
  231.          return ((Application) extContext.getApplicationMap().   
  232.               get("com.sun.faces.ApplicationImpl"));   
  233.      }   
  234.      return null;   
  235.  }   
  236.   
  237.  private static Application getRIApplicationImpl() {   
  238.      return getRIApplicationImpl(null);   
  239.  }   



   未完待续。

分享到:
评论
3 楼 wst0350 2011-09-05  
2 楼 haiyupeter 2009-05-13  
首先我觉得你的写的对这些源码的分析还是不错的..希望以后再多写一些出来..

不过在本文中你不多讲一下生命周期里每一阶段主要是做什么的吗?
待续了那么久了..
比如第一阶段:恢复视图
第二阶段:应用请求值
第三阶段:验证请救值
第四阶段:绑定模型域
第五阶段:调用应用程序
第六阶段:渲染

然后每一阶段都挺重要的..
1 楼 chen.fa 2007-12-13  

相关推荐

    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