2011-06-01 20 views
1

我有一个扩展RemoteServiceServlet的类。这个类有几种方法,在一种方法中,我使用getThreadLocalResponse()获取当前调用的HttpServletResponse,然后在响应中写入一个File。以下是代码:GWT的RemoteServiceServlet可以在HttpServletResponse中写入文件流吗?

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?

谢谢!

回答

2

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

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

OTOH,如果您只是将一些自己的方法并行放到GWT-RPC方法中,那么为什么不创建新的Servlet呢? AFAIK,GWT-RPC使用http POST,因此覆盖doGet()应该适用于您的功能,并使GWT-RPC正常工作。但是重写doPost()会打破GWT-RPC。

相关问题