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