【问题标题】:sendRedirect in JSF 2.2JSF 2.2 中的发送重定向
【发布时间】:2015-06-22 07:59:36
【问题描述】:

我正在将 JSF 从 1.2 升级到 2.2 版本。

我的支持 bean 方法中有一个简单的 response.sendRedirect()。在 JSF2.2 中,它开始给出“java.lang.IllegalStateException: Cannot change buffer size after data has been written at org.apache.catalina.connecto”异常。

添加“FacesContext.getCurrentInstance().responseComplete();”后,成功了!

谁能帮助我理解 JSF2.2 中的实现是如何升级的,如果没有明确说明响应已完成,重定向不起作用?

谢谢!

【问题讨论】:

    标签: jsf-2.2 response.redirect


    【解决方案1】:

    您应该使用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 的方法来实现同样的目的,那么任何试图从 JSF 的封面下获取和降低原始 javax.servlet.* 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-30
        • 1970-01-01
        • 2011-10-12
        • 2014-07-14
        • 2018-06-12
        • 2011-07-21
        • 2012-11-06
        相关资源
        最近更新 更多