Как очистить буфер рано в JSF 2.0?
Я использую JSF 2.0 и хочу заблаговременно очистить буфер (между головой и ответом), так как это один из лучших способов улучшить производительность. В этой статье BalusC показывает, как это сделать на странице JSP (<% response.getWriter().flush(); %>
), но я использую страницы HTML. кто нибудь знает как это сделать?
Спасибо!
Damian
2 ответа
Если вы используете <h:head>
в JSF2 теоретически вы можете сделать это, явно сбрасывая основной выходной поток сервлета в encodeEnd()
метод Renderer
связано с компонентом.
Есть два основных способа реализации пользовательского рендерера. Если вы хотите быть независимым от реализации, то вам нужно написать весь Renderer
себя, который является частью работы (хотя для простого HTML <head>
элемент это не так сложно). Вы также можете выбрать конкретную реализацию, чтобы получить более простой пользовательский Renderer
реализация. Предполагая, что вы используете Мохарру, тогда вам просто нужно расширить 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
:
<render-kit>
<renderer>
<component-family>javax.faces.Output</component-family>
<renderer-type>javax.faces.Head</renderer-type>
<renderer-class>com.example.FlushedHeadRenderer</renderer-class>
</renderer>
</render-kit>
Однако такой подход имеет свои недостатки. JSF больше не имеет возможности создавать сеанс всякий раз, когда это необходимо, или обрабатывать любое исключение как страницу ошибки всякий раз, когда возникает исключение во время рендеринга представления. Я бы не рекомендовал такой подход для JSF.
При использовании myFaces есть контекстный параметр, который вы можете установить в своем файле web.xml, как показано ниже:
<context-param>
<param-name>org.apache.myfaces.EARLY_FLUSH_ENABLED</param-name>
<param-value>true</param-value>
</context-param>