如何在JSF 2.0中尽早刷新缓冲区?

时间:2011-09-09 14:46:23

标签: jsf jsf-2

我正在使用JSF 2.0,我希望尽早(在头部和响应之间)刷新缓冲区,因为它是提高性能的最佳实践之一。在这个article BalusC中显示了如何在JSP页面(<% response.getWriter().flush(); %>)中进行操作,但我正在使用xhtml页面。 有谁知道怎么做?

谢谢!
达米安

2 个答案:

答案 0 :(得分:3)

如果你在JSF2中使用<h:head>,那么你可以理论上通过在{encodeEnd()方法中显式刷新底层servlet输出流来做到这一点。 1}}与组件相关联。

实现自定义渲染器基本上有两种方法。如果你想独立于实现,那么你自己编写了整个Renderer这是一项工作(尽管对于一个简单的HTML Renderer元素,这并不难。)您还可以选择特定于实现,以便最终实现更简单的自定义<head>实现。假设您正在使用Mojarra,那么您只需要扩展Renderer

E.g。

com.sun.faces.renderkit.html_basic.HeadRenderer

然后在package com.example; import java.io.IOException; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import com.sun.faces.renderkit.html_basic.HeadRenderer; public class FlushedHeadRenderer extends HeadRenderer { @Override public void encodeEnd(FacesContext context, UIComponent component) throws IOException { super.encodeEnd(context, component); context.getExternalContext().getResponseOutputWriter().flush(); // Forces flush. } }

中注册如下
faces-config.xml

然而,这种方法有一些警告。 JSF没有机会在必要时创建会话,或者在渲染视图时抛出异常时将任何异常作为错误页面处理。 我不建议将此方法用于JSF

答案 1 :(得分:1)

如果使用myFaces,您可以在web.xml中设置上下文参数,如下所示:

<context-param>
    <param-name>org.apache.myfaces.EARLY_FLUSH_ENABLED</param-name>
    <param-value>true</param-value>
</context-param>