JSF 源代码赏析之Lifecycle
关键字: jsf sourcecode lifecycle
JSF的生命周期在JSF应用中起着至关重要的作用,每一个JSF请求的处理都需要经过一次生命周期,本文从源码的角度分析JSF的生命周期。
在讨论生命周期之前,我们先要讨论FacesContext的一些元素,他们在整个生命周期中扮演了非常重要的角色。么个JSF应用必须保存它所处理的请求信息,FacesContext为处理请求和生成响应保存了所有必需的上下文信息,具体而言,它包括:
1.信息队列,MessageQueue,保存所有的消息
2.当前的组件树,ViewRoot,
3.外部上下文,ExternalContext
4.Application。
下面就是Sun的FacesContextImpl中的变量:
这里面有很多重要的对象值得我们去研究,按照从上到下的顺序,我们先来看看ExternalContext。
ExternalContext其实是对ServletContext(或PortletContext)的封装,提供了访问外部容器资源的各种方法,ExternalContext基类定义如下:
在讨论生命周期之前,我们先要讨论FacesContext的一些元素,他们在整个生命周期中扮演了非常重要的角色。么个JSF应用必须保存它所处理的请求信息,FacesContext为处理请求和生成响应保存了所有必需的上下文信息,具体而言,它包括:
1.信息队列,MessageQueue,保存所有的消息
2.当前的组件树,ViewRoot,
3.外部上下文,ExternalContext
4.Application。
下面就是Sun的FacesContextImpl中的变量:
com.sun.faces.context.FacesContextImpl:
这里面有很多重要的对象值得我们去研究,按照从上到下的顺序,我们先来看看ExternalContext。
ExternalContext其实是对ServletContext(或PortletContext)的封装,提供了访问外部容器资源的各种方法,ExternalContext基类定义如下:
javax.faces.context.ExternalContext:
- publicabstractclassExternalContext{
- publicstaticfinalStringBASIC_AUTH="BASIC";
- publicstaticfinalStringCLIENT_CERT_AUTH="CLIENT_CERT";
- publicstaticfinalStringDIGEST_AUTH="DIGEST";
- publicstaticfinalStringFORM_AUTH="FORM";
- //----------------------------------------------------------PublicMethods
- publicabstractvoiddispatch(Stringpath)
- throwsIOException;
- publicabstractStringencodeActionURL(Stringurl);
- publicabstractStringencodeNamespace(Stringname);
- publicabstractStringencodeResourceURL(Stringurl);
- publicabstractStringgetAuthType();
- publicabstractObjectgetContext();
- publicabstractStringgetInitParameter(Stringname);
- publicabstractMapgetInitParameterMap();
- publicabstractStringgetRemoteUser();
- publicabstractObjectgetRequest();
- publicvoidsetRequest(Objectrequest){
- ExternalContextimpl;
- if(null!=(impl=(ExternalContext)this.getRequestMap().
- get("com.sun.faces.ExternalContextImpl"))){
- impl.setRequest(request);
- return;
- }
- thrownewUnsupportedOperationException();
- }
- publicvoidsetRequestCharacterEncoding(Stringencoding)throwsUnsupportedEncodingException{
- ExternalContextimpl;
- if(null!=(impl=(ExternalContext)this.getRequestMap().
- get("com.sun.faces.ExternalContextImpl"))){
- impl.setRequestCharacterEncoding(encoding);
- return;
- }
- thrownewUnsupportedOperationException();
- }
- publicabstractStringgetRequestContextPath();
- publicabstractLocalegetRequestLocale();
- publicabstractIterator<locale></locale>getRequestLocales();
- publicabstractIterator<string></string>getRequestParameterNames();
- publicabstractStringgetRequestPathInfo();
- publicabstractStringgetRequestServletPath();
- publicStringgetRequestCharacterEncoding(){
- ExternalContextimpl;
- if(null!=(impl=(ExternalContext)this.getRequestMap().
- get("com.sun.faces.ExternalContextImpl"))){
- //noinspectionTailRecursion
- returnimpl.getRequestCharacterEncoding();
- }
- thrownewUnsupportedOperationException();
- }
- publicStringgetRequestContentType(){
- ExternalContextimpl;
- if(null!=(impl=(ExternalContext)this.getRequestMap().
- get("com.sun.faces.ExternalContextImpl"))){
- //noinspectionTailRecursion
- returnimpl.getRequestContentType();
- }
- thrownewUnsupportedOperationException();
- }
- publicStringgetResponseCharacterEncoding(){
- ExternalContextimpl;
- if(null!=(impl=(ExternalContext)this.getRequestMap().
- get("com.sun.faces.ExternalContextImpl"))){
- //noinspectionTailRecursion
- returnimpl.getResponseCharacterEncoding();
- }
- thrownewUnsupportedOperationException();
- }
- publicStringgetResponseContentType(){
- ExternalContextimpl;
- if(null!=(impl=(ExternalContext)this.getRequestMap().
- get("com.sun.faces.ExternalContextImpl"))){
- //noinspectionTailRecursion
- returnimpl.getResponseContentType();
- }
- thrownewUnsupportedOperationException();
- }
- publicabstractURLgetResource(Stringpath)throwsMalformedURLException;
- publicabstractInputStreamgetResourceAsStream(Stringpath);
- publicabstractSet<string></string>getResourcePaths(Stringpath);
- publicabstractObjectgetResponse();
- publicabstractObjectgetSession(booleancreate);
- publicabstractPrincipalgetUserPrincipal();
- publicabstractbooleanisUserInRole(Stringrole);
- publicabstractvoidlog(Stringmessage,Throwableexception);
- publicabstractvoidredirect(Stringurl)throwsIOException;
- }
这个抽象类共有1000多行,提供了访问外部资源的各种方法,主要是对ServletContext或是PortletContext中方法的封装,比如getRemoteUser、getRequest、getSession等方法都是很常用的,但是在运用时也要注意,如果在程序中写死是ServletContext或HttpServletRequest,那么以后对于更换到Portal环境中是不利的,这个如果需要转换的话需要注意了。
下面来看看Application对象。Application对象是应用系统范围内的单例类,提供了对FacesContext文件的对象封装,从这个对象中可以得到很多FacesContext文件中的配置,还是来看看定义吧.