Comprimir a saída

14 respostas
smota

Olá pessoal …

Tenho uma aplicação baseada no Webwork e preciso comprimir toda a saída pois ela será utilizada em aparelhos wireless cobrando por kb … entonces eu queria no minimo retirar espaços e tabs desnecessários … alguma idéia?

14 Respostas

cv1

Hmmm… da uma conferida se o seu browser aceita encoding GZip, e dah uma googlada por gzip servlet filter :wink:

smota

Eh, estou vendo isso … de qq jeito alem de gzipar a parada eu queria retirar o lixo (espacos dentro das tags, enters & cia) …

posso fazer isso com um filtro tb, mas eu queria fazer o filtro e usar uma ferramenta pra isso, alguem conhece uma?

valeus

Rafael_Steil

Mas a compactacao ja faz isso pra vc… pegue um arquivo HTML de 100kb e compacte com gzip pra ver o tamanho ridiculo que fica…

Rafael

Luca

Olá

Como o Rafael disse, o gzip faz compressão usando métodos tipo dicionário onde as strings repetidas são suprimidas.

Mas se sua preocupação é diminuir o tamanho do que vai para um dispositivo móvel de capacidade limitada e sem uso de descompressão, talvez seja fácil você mesmo fazer algo como o método de compactação chamado RLE (Run Lenght Encoding) que é fácil de descomprimir no aparelhinho. RLE simplesmente suprime espaços e chars repetidos.

Talvez o google ajude.

[]s
Luca

smota

Ressucitanto o tópico … alguem conhece um bom filtro para compressão GZIP pra indicar?!? Procurei e achei varios, mas a maioria eh simples demais (enquanto o mod_gzip pro apache nao eh tao simples assim, mesmo desconsiderando o código necessário pro mod :shock: )

louds

Tou usando java.util.zip em produção com bastante sucesso.
Com uma taxa de compressão de 115% a 20% por arquivo xml transmitido (tou usando xml sobre http), com uma média de 25% para o volume total transmitido.

O código para implementar isso é muito simples, não precisa de muito google foo para achar uns exemplo legais usando servlet filters.

smota

Ressucitando o tópico de novo …

Eu estou usando o Sitemesh pra aplica decorators a minha aplicação e agora quero gzipar :lol: toda a saida …

Se eu aplicar somente o filtro de Gzip funciona, se aplico o filtro do Sitemesh sozinho tb funciona, mas os 2 juntos não. (o filtro de Gzip é o exemplo que veio no Tomcat 4, mas usando no tomcat 5 :slight_smile: )

eu to meio perdido no meio do monte de Wrappers & chains :oops: … alguem tem uma ideia pra colocar os 2 juntos?

A ordem é : Decorator -> Gzip (se eu inverter a ordem não dá nenhum erro, mas o filtro de Gzip não zipa nada)
O trace:StandardWrapperValve[velocity]: Servlet.service() for servlet velocity threw exception java.lang.IllegalStateException: getOutputStream() has already been called for this response at org.apache.coyote.tomcat5.CoyoteResponse.getWriter(CoyoteResponse.java:6 11) at org.apache.coyote.tomcat5.CoyoteResponseFacade.getWriter(CoyoteResponseF acade.java:190) at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.ja va:156) at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:167) at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:1 60) at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:2 27) at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspF actoryImpl.java:160) at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryIm pl.java:120) at org.apache.jsp.decorators.default_jsp._jspService(default_jsp.java:81) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:133) at javax.servlet.http.HttpServlet.service(HttpServlet.java:856) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.ja va:311) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248) at javax.servlet.http.HttpServlet.service(HttpServlet.java:856) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica tionFilterChain.java:284) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt erChain.java:204) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatc her.java:742) at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDisp atcher.java:630) at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispat cher.java:542) at com.opensymphony.module.sitemesh.filter.PageFilter.applyDecorator(PageFi lter.java:169) at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.j ava:68) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica tionFilterChain.java:233) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt erChain.java:204) at com.opensymphony.webwork.lifecycle.RequestLifecycleFilter.doFilter(Reque stLifecycleFilter.java:62) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica tionFilterChain.java:233) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt erChain.java:204) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValv e.java:256) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:151) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5 64) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardCon textValve.java:245) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValv e.java:199) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:151) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5 64) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java :195) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:151) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java :164) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:149) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5 64) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve. java:156) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo ntext.java:151) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5 64) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:211) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:80 5) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processC onnection(Http11Protocol.java:696) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:60 5) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool java:677) at java.lang.Thread.run(Thread.java:536)

louds

Primeiro voce tem que acertar a ordem dos filtros, o do gzip tem que ser o primeiro.
depois tem q verificar que request/response tão sendo passados adiante…

N

Olá pessoal!
Esta solução de comprimir a saída serve também para html, como ativo?

N

Olá pessoal!
Esta solução de comprimir a saída serve também para html, como ativo?

smota

Funciona sim.

Na verdade independe do que você está processando … você configura o filtro no Tomcat ou no Apache e a resposta dele para o client é comprimida.

[]s

louds

Minha experiencia é que usar filtros para compressão é burrice, a performance é patetica e volta e meia da problemas com filtros mal escritos.

A melhor solução é ligar compressão no teu webserver. Seja via mod gzip do apache ou alterando 1 parametro do connector do tomcat!

smota

Eitcha, burrice pegou pesado hein louds? :puppydogeyes:

Vou fazer um teste aqui … o JWS entende conteudo comprimido?!? let’s see …

louds

Não peguei não. Só deixa de ser burrice caso voce não tenha como alterar essa configuração do teu servlet container. Usando o suporte do container voce evita ter que manter todo response content duas vezes em memoria e ter bugs relacionado a filtros mau feitos. Alem do fator praticidade.

Criado 14 de janeiro de 2004
Ultima resposta 2 de mar. de 2004
Respostas 14
Participantes 6