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?
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?
Hmmm… da uma conferida se o seu browser aceita encoding GZip, e dah uma googlada por gzip servlet filter 
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
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
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
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: )
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.
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
)
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)
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…
Olá pessoal!
Esta solução de comprimir a saída serve também para html, como ativo?
Olá pessoal!
Esta solução de comprimir a saída serve também para html, como ativo?
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
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!
Eitcha, burrice pegou pesado hein louds? :puppydogeyes:
Vou fazer um teste aqui … o JWS entende conteudo comprimido?!? let’s see …
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.