?
在?Faces realm外,例如 在 ?filter 或者servlet中,當 FacesContent.getCurrentInstance() 返回null時候,你可以使用FacesContextFactory來得到FacesContext,下面是一個示例.
//?You?need?an?inner?class?to?be?able?to?call?FacesContext.setCurrentInstance //?since?it's?a?protected?method private?abstract?static?class?InnerFacesContext?extends?FacesContext { ??protected?static?void?setFacesContextAsCurrentInstance(FacesContext?facesContext)?{ ????FacesContext.setCurrentInstance(facesContext); ??} }
private?FacesContext?getFacesContext(ServletRequest?request,?ServletResponse?response)?{ ??//?Try?to?get?it?first ??FacesContext?facesContext?=?FacesContext.getCurrentInstance(); ??if?(facesContext?!=?null)?return?facesContext;
??FacesContextFactory?contextFactory?=?(FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); ??LifecycleFactory?lifecycleFactory?=?(LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY); ??Lifecycle?lifecycle?=?lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
??//?Either?set?a?private?member?servletContext?=?filterConfig.getServletContext(); ??//?in?you?filter?init()?method?or?set?it?here?like?this: ??//?ServletContext?servletContext?=?((HttpServletRequest)request).getSession().getServletContext(); ??//?Note?that?the?above?line?would?fail?if?you?are?using?any?other?protocol?than?http
??//?Doesn't?set?this?instance?as?the?current?instance?of?FacesContext.getCurrentInstance ??facesContext?=?contextFactory.getFacesContext(servletContext,?request,?response,?lifecycle);
??//?Set?using?our?inner?class ??InnerFacesContext.setFacesContextAsCurrentInstance(facesContext);
??//?set?a?new?viewRoot,?otherwise?context.getViewRoot?returns?null ??UIViewRoot?view?=?facesContext.getApplication().getViewHandler().createView(facesContext,?"yourOwnID"); facesContext.setViewRoot(view);
??return?facesContext; }
|