从ADF Faces JSF 1.2中的托管bean结构函数导航
是否可以从托管bean的结构函数导航到另一个页面/视图?假如产生任何非常,我想要这个重定向.我实行了许多要领: 实行-1: getFacesContext().responseComplete(); getFacesContext().getApplication().getNavigationHandler().handleNavigation(getFacesContext(),null,"gotoPartError"); getFacesContext().renderResponse(); 实行-2: getServletResponse().sendRedirect("partError.jspx") 实行-3: getFacesContext().responseComplete(); getFacesContext().getExternalContext().redirect(getServletRequest().getContextPath() + "/pages/partError.jspx"); 实行-4: RequestDispatcher dispatcher = getServletRequest().getRequestDispatcher("partError.jspx"); dispatcher.forward(getServletRequest(),getServletResponse()); 实行-5: FacesContext context = getFacesContext(); UIViewRoot newPage = context.getApplication().getViewHandler().createView(context,"/partError.jspx"); context.setViewRoot(newPage); context.renderResponse(); 实行-6: ControllerContext.getInstance().getCurrentViewPort().setViewId("partError"); 实行-7: Exception Handler in adfc-config.xml 实行-8: Custom service handler defined in /.adf/META-INF/services/oracle.adf.view.rich.context.Exceptionhandler which extends oracle.adf.view.rich.context.Exceptionhandler 实行-9: By extending JSF Life Cycle 他们都没有事变.对付我收到的全部案件 java.lang.IllegalStateException: Cannot forward after response has been committed 在JSF 1.2中真的不行能吗?当我行使ADF 11.1.1.6.0(行使JSF 1.2)时,上面的一些“Try”包括ADF Faces要领. 无论怎样,我必要,可所以JSF 1.2或ADF Faces,导航到错误页面.我得到乐成的独一要领是行使从后端执行的javascript,以便在呈现错误时在_self窗口中打开错误页面,但我真的不喜好它. 这件事中的任何指针城市很是有效. 办理要领假如领略题目的缘故起因,则更轻易办理题目.一个很好的破例根基上已经声名白题目缘故起因的统统.细心看看:
相应已经提交.这是一个不归路.大概您无法领略提交相应意味着什么(其功效是您也无法领略非常自己). 默认环境下,HTTP相应被写入缓冲区,每隔~2KB革新一次,详细取决于处事器设置.革新相应缓冲区会导致写入的字节现实从处事器发送到客户端.一旦第一次产生这种环境,就会以为相应已提交.这是一个不归路.假如处事器现实上必要在之后变动相应,则处事器无法从客户端返回已写入的字节. 假如您有一些也许必要变动相应的代码,那么您应该在提交相应之前挪用它. 在您的特定环境下,在天生HTML输出时代,托管bean显然是在JSF泛起相应阶段中构建的.已天生的HTML输出的一部门已发送到客户端(因此,相应已提交).您显然在JSF页面中相对较晚地引用了哀求范畴的bean,可能相应缓冲区相对较小,可能HTML< head>相对较大,这导致在< body>之前已经冲洗.开始,等等. 您确实必要在泛起相应阶段之前挪用代码.在JSF 1.2中,您可以行使< f:view beforePhase>为了这. 譬喻. <f:view beforePhase="#{bean.navigate}"> 同 public void navigate(PhaseEvent event) { if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) { // Do here your job which should run right before the RENDER_RESPONSE. } } 那么你的Try-1和Try-3就可以了(你可以将那些responseComplete()和renderResponse()行留下来,它们已经被隐含地处理赏罚了). Try-2和Try-4很差.你应该停止在你的支持bean中行使javax.servlet.* import. Try-5很鸠拙. Try-6,Try-7和Try-8超出了我的范畴. Try-9是可行的,但很是鸠拙. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |