我在从Java Servlet返回压缩响应(GZip)到JSP时遇到了麻烦。
流程:
注意事项:
结果:
任何人都可以帮我指出正确的方向吗?
答案 0 :(得分:3)
压缩响应字符串在请求对象中设置为属性,控件传递给JSP
您不应该将JSON响应转发给JSP。您应该已将JSON plain打印到响应中,并在JSP Android应用程序中使用 JavaScript / Ajax代码来调用返回JSON的servlet的URL。另请参阅How to use Servlets and Ajax?。
关于GZIP压缩,你不应该自己动手。让服务器自行完成。
修复你的代码以删除压缩响应的所有手动尝试,它应该最终基本上如下所示:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String json = createItSomehow();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(json);
}
就是这样,如果你让你的Android应用程序调用servlet的URL,它将检索JSON字符串。
最后编辑服务器配置以打开自动GZIP压缩。在例如Tomcat的情况下,这将是在Tomcat的compression="on"
文件中添加/conf/server.xml
到the <Connector>
element的问题:
<Connector ... compression="on">
根据the documentation,可压缩的mime类型默认为text/html,text/xml,text/plain
。您可以将其配置为添加application/json
。
<Connector ... compression="on" compressableMimeType="text/html,text/xml,text/plain,application/json">
无关,响应字符编码必须设置为UTF-8
,这符合JSON规范。
答案 1 :(得分:2)
JSP用于将文本数据呈现给客户端。 GZIP是二进制数据,即使它是下面的压缩文本。
我建议使用GZIP servlet过滤器动态压缩数据,而不是在业务逻辑中以编程方式进行。
请参阅此先前的问题,了解如何抓住现成的Which compression (is GZIP the most popular) servlet filter would you suggest?
如果失败了,那就编写自己的servlet过滤器来做同样的事情。