2015-06-22 52 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>