I'm trying to do early flush in gsp Grails 2.2.4 but not work.
<%
response.flushBuffer();
%>
and
<%
org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest webRequest = (org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest) org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes()
webRequest.getOut().flush();
%>
The responsible for not being able to manually flush the response is GrailsPageFilter filter, which wraps the response object so he can manage the response buffer.
You can skip this filter by creating a new filter in src/java:
package com.test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BypassGrailsPageFilter implements Filter {
private static final String ALREADY_APPLIED_KEY = "com.opensymphony.sitemesh.APPLIED_ONCE";
public void init(FilterConfig config) throws ServletException {}
public void doFilter(ServletRequest rq, ServletResponse rs, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) rq;
req.setAttribute(ALREADY_APPLIED_KEY, Boolean.TRUE);
chain.doFilter(req, rs);
}
public void destroy() {
}
}
And add it to your web.xml (located in src/templates/war), before sitemesh filter.
<filter>
<filter-name>nositemesh</filter-name>
<filter-class>com.test.BypassGrailsPageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>nositemesh</filter-name>
<url-pattern>/path/to/controller/*</url-pattern>
</filter-mapping>
Controller example:
class EarlyFlushController {
def test() {
def out = response.outputStream
out << '<html>'
out << '<body>'
out.flush()
(1..10).each { i ->
out << i
out.flush()
Thread.sleep(1000)
}
out << '</body>'
out << '</html>'
out.flush()
out.close()
response.status = 200
}
}
NOTE: If you cant find your web.xml try running grails install-template
on your app dir.
You can still use grails templating system by using g.render()
and sending its output to the response outstream.