【问题标题】:Can GWT's RemoteServiceServlet write a file stream in HttpServletResponse?GWT的RemoteServiceServlet能否在HttpServletResponse中写入文件流?
【发布时间】:2011-06-01 07:31:47
【问题描述】:

我有一个扩展 RemoteServiceServlet 的类。这个类有几个方法,在一个方法中,我使用 getThreadLocalResponse() 来获取当前调用的 HttpServletResponse,然后在响应中写入一个 File。代码如下:

File aFile = new File("c://test.txt");
int iBufferSize = 1000;
int iLength = 0;

HttpServletResponse resp = getThreadLocalResponse();

ServletOutputStream op = resp.getOutputStream();
ServletContext context = getServletConfig().getServletContext();
String mimetype = context.getMimeType(aFile.getName());

resp.setContentType((mimetype != null) ? mimetype : "application/octet-stream");
resp.setContentLength((int) aFile.length());
resp.setHeader("Content-Disposition", "attachment; filename=\"" + aFile.getName() + "\"");

byte[] xbuf = new byte[iBufferSize];
DataInputStream in = new DataInputStream(new FileInputStream(aFile));

while ((in != null) && ((iLength = in.read(xbuf)) != -1))
{
  op.write(xbuf, 0, iLength);
}

in.close();
op.flush();
op.close();

但是,总是会发生错误。调试后发现写响应的时候抛出了异常。

我没有重写doGet和doPost,因为还有一些其他的方法,我不希望每个对类的请求都可以调用这段代码。

但是如果我在这个类中创建一个单独的 Servlet 或覆盖 doGet 或 doPost,它就可以正常工作。

有人知道为什么吗?当我们使用 getThreadLocalResponse() 时,GWT RemoteServiceServlet 是否支持在响应中写入 Stream ?

谢谢!

【问题讨论】:

    标签: gwt servlets


    【解决方案1】:

    您是否将此代码放入 RemoteServiceServlet 中的 GWT-RPC 方法中?

    如果是,那么您正在尝试将 GWT-RPC 与您自己的一些内容混合在一起,这是不允许的。您不能只将任意数据写入 http 响应,因为这显然会弄乱 RPC 协议。

    OTOH,如果您只是将自己的一些方法与 GWT-RPC 方法并排放置,那么为什么不创建一个新的 Servlet?

    AFAIK,GWT-RPC 使用 http POST,因此覆盖 doGet() 应该适用于您的功能并让 GWT-RPC 正常工作。但是覆盖 doPost() 会破坏 GWT-RPC。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      相关资源
      最近更新 更多