简体   繁体   中英

early flush in gsp with grails

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();

%>

Sitemesh buffers the response for responses with text/html content type. You might have to exclude the uri from sitemesh. See http://jira.grails.org/browse/GRAILS-5773 for details.

Early 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.


SiteMesh

You can still use grails templating system by using g.render() and sending its output to the response outstream.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM