2015-06-22 58 views
0

我将JSF从1.2升级到2.2版本。JSF中的sendRedirect 2.2

我在我的支持bean方法中有一个简单的response.sendRedirect()。在JSF2.2中,它开始给出“java.lang.IllegalStateException:在org.apache.catalina.connecto写入数据后无法更改缓冲区大小”异常。

添加“FacesContext.getCurrentInstance()。responseComplete();”后,它工作!

任何人都可以帮助我理解如何在JSF2.2中实现升级,如果没有明确说明响应已完成,重定向不起作用?

谢谢!

回答

2

你应该使用ExternalContext#redirect()作为工作。

public void submit() throws IOException { 
    // ... 

    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
    ec.redirect(ec.getRequestContextPath() + "/otherpage.jsf"); 
} 

从JSF 1.x开始就一直如此。它将在执行HttpServletResponse#sendRedirect()后自动调用FacesContext#responseComplete()responseComplete()将基本上指示JSF已经手动完成响应,并且JSF基本上不需要继续呈现响应阶段(即,将导航结果写入响应中)。此外,如果没有JSF-ish方法来实现相同目标,任何企图从JSF封面下抓取和下传原始API的尝试都应该被视为一种暗示。在JSF 2.x的还有执行重定向额外的新方法:faces-redirect=true查询参数附加到(隐含的)导航结果:

public String submit() { 
    // ... 

    return "otherpage?faces-redirect=true"; 
} 

至于你所面临的非法状态异常,JSF 2.2仅仅是推迟设置响应头到达实际需要呈现响应的时候。如果答复已经落实,那就太迟了。

-2

Java.lang.IllegalStateException:数据已在org.apache.catalina.connecto”异常被写入之后不能更改缓冲区的大小

因为你已经为减少内存重新分配手动设置响应缓冲区大小,这可能会发生在渲染时间,但你的页面有超过缓冲区大小较具规模

例如

<context-param>  
    <param-name> javax.faces.FACELETS_BUFFER_SIZE </param-name> 
    <param-value> 55555 </param-value> 
</context-param>