问题:

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.

发表评论

电子邮件地址不会被公开。