2016年12月20日 | Leave a comment 问题: JSF 视图恢复(Restore View) 干了什么? 解决: 根据 JSF 标准 2.2 文档翻译如下: 视图恢复(Restore View) JSF实现在视图恢复阶段必须执行下列任务: 调用 ViewHandler.initView() ,设置request字符编码 检测FacesContontext 是否包含 UIViewRoot : 包含 UIViewRoot.locale = ExternalContext.getRequestLocal() 得到ViewId,算法如下: 查找 request[‘javax.servlet.include.path_info’] ,如果有的话它就是viewId 调用 ExternalContext.getRequestPathInfo() ,如果!=null 它就是viewId 查找 request[‘javax.servlet.include.servlet_path’] 如果上边的所有步骤都没有找到 viewId,抛出异常 FacesException 由下列算法检测 request 是不是postback 。 Application’s ViewHandler.caculateRenderKitId().responseStateManager.isPostBack(facesContext) 如果request 是postback : facesContext.setProcessingEvents(false)。 facesContext.uiviewRoot=viewHandler.restoreView(facesContext,viewId) 如果viewRoot==null 抛出ViewExpiredException。 facesContext.setProcessingEvents(true) 如果request 不是postback : vdl=ViewHandler.getViewDeclarationLanguage(ViewHandler.deriveLogicalViewId()) if vdl==null facesContext.renderResponse() else vdl!=null ViewMetadata.createMetadataView(vdl) ,可能会创建viewroot,如果没有创建调用ViewHandler.