精华帖 (1) :: 良好帖 (1) :: 新手帖 (5) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-19
responseBody 这个属性确实不太常用
|
|
返回顶楼 | |
发表时间:2009-11-19
最后修改:2009-11-19
刚才去看了下TOMCAT 4的源码,发现PrinterWriter其实也就是包装了OutputStreamWriter,而OutputStreamWriter(这个类代理了sun.nio.cs.StreamEncoder)包装了getOutputStream(返回ServletOutputStream),而ServletOutputStream应该是来自socket.getOutputStream()。在tomcat里,他们的提交最后都交给RequestBase.write方法。不过我不清楚JBOSS怎么实现的。。。
也就是说PrintWriter相对于ServletOutputStream多了一层OutputStreamWriter 虽然想不明白那3种状况是为什么,但对于楼主的问题还是挺好奇的。 不过对于楼主的第二种方案,不知道楼主有没有试过直接将byte cast成 char char c = (char)b;然后把char数组传到客户端去呢? |
|
返回顶楼 | |
发表时间:2009-11-19
有些浏览器不支持的,输出的可能是一堆乱码
加个resp.setContentType好点。 |
|
返回顶楼 | |
发表时间:2009-11-19
jeff312 写道 2. URL直接给图像组件。这个实际上原来开发包里就有这个功能,但是它只能下载实际存在的图像文件,比如这样的URL: http://host_name:8080/AppName/images/001.tif ,如果是 http://host_name:8080/AppName/SomeServlet?fileId=30 这样的URL,它是不起作用的。但是我不清楚是ActiveX的http请求都有这个限制还是说仅仅是我手头这个开发包的功能缺陷? 请指教。 不可能静态URL可以而动态不行,客户端应该只认数据格式,不会管你后台是如何生成的(否则生成图形验证码的程序如何实现?),应该是你写的“SomeServlet”有问题! 不一定Servlet,用jsp也可以直接输出byte array的,但要注意,在输出之前,要: response.reset(); out.clear(); |
|
返回顶楼 | |
发表时间:2009-11-19
jeff312 写道 karlmax 写道 既然http://host_name:8080/AppName/images/001.tif可以用,那么http://host_name:8080/AppName/SomeServlet?fileId=30就没有理由不成。可以尝试一下URL rewriting,如果不成看一下SomeServlet的respons header是否正确设置了content type等。
这恐怕跟服务器端的stream的类型和方式有关,我也试过用byte[]缓冲输出流(缓冲区byte[]得到数据后,把它编码成相应的char[]),诡异的是,浏览器端收到了正确的二进制数据,但IE却随后立即崩溃了。以IO流输出文件只怕与实际文件地址URL读取还是有区别的,区别在哪里还要请人指教。 有区别也是服务器端没设置好,查看一下响应头,就知道哪儿不同了。 |
|
返回顶楼 | |
发表时间:2009-11-20
最后修改:2009-11-20
lzyzizi 写道 刚才去看了下TOMCAT 4的源码,发现PrinterWriter其实也就是包装了OutputStreamWriter,而OutputStreamWriter(这个类代理了sun.nio.cs.StreamEncoder)包装了getOutputStream(返回ServletOutputStream),而ServletOutputStream应该是来自socket.getOutputStream()。在tomcat里,他们的提交最后都交给RequestBase.write方法。不过我不清楚JBOSS怎么实现的。。。
也就是说PrintWriter相对于ServletOutputStream多了一层OutputStreamWriter 虽然想不明白那3种状况是为什么,但对于楼主的问题还是挺好奇的。 不过对于楼主的第二种方案,不知道楼主有没有试过直接将byte cast成 char char c = (char)b;然后把char数组传到客户端去呢? 你倒是提醒了我,其实JBoss的servlet实现就是Tomcat的实现,JBoss现在把Tomcat当成一个子集,专门处理web/servlet请求。 第二个方案的代码中我省略了byteArray2CharArray()方法的代码,实现上跟你的设想其实没多大差别,而这正是我在主帖里对方案二描述的故障的源头。实际上从byte到char的解码编码没那么简单,强制转换是行不通的,实际上,b会先被转换成有符号int,然后才会转成char,这样一来就麻烦了,因为char是无符号的,当中间int数据是负数的时候,char的结果就会出错。比较正确简洁的代码如下: charArray = new String(byteArray).toCharArray(); 当然,即使通过转换使得char数组得到了正确的二进制数据,方案仍然行不通,因为IE虽然接到了正确的数据,却突然离奇崩溃了,正在考虑一些跟帖网友的建议,试一试resp.reset()之类的办法。 |
|
返回顶楼 | |
发表时间:2009-11-20
最后修改:2009-11-20
weiqingfei 写道 jeff312 写道 karlmax 写道 既然http://host_name:8080/AppName/images/001.tif可以用,那么http://host_name:8080/AppName/SomeServlet?fileId=30就没有理由不成。可以尝试一下URL rewriting,如果不成看一下SomeServlet的respons header是否正确设置了content type等。
这恐怕跟服务器端的stream的类型和方式有关,我也试过用byte[]缓冲输出流(缓冲区byte[]得到数据后,把它编码成相应的char[]),诡异的是,浏览器端收到了正确的二进制数据,但IE却随后立即崩溃了。以IO流输出文件只怕与实际文件地址URL读取还是有区别的,区别在哪里还要请人指教。 有区别也是服务器端没设置好,查看一下响应头,就知道哪儿不同了。 多谢提示,我就去研究一下响应头。 |
|
返回顶楼 | |
发表时间:2009-11-20
myy 写道 jeff312 写道 2. URL直接给图像组件。这个实际上原来开发包里就有这个功能,但是它只能下载实际存在的图像文件,比如这样的URL: http://host_name:8080/AppName/images/001.tif ,如果是 http://host_name:8080/AppName/SomeServlet?fileId=30 这样的URL,它是不起作用的。但是我不清楚是ActiveX的http请求都有这个限制还是说仅仅是我手头这个开发包的功能缺陷? 请指教。 不可能静态URL可以而动态不行,客户端应该只认数据格式,不会管你后台是如何生成的(否则生成图形验证码的程序如何实现?),应该是你写的“SomeServlet”有问题! 不一定Servlet,用jsp也可以直接输出byte array的,但要注意,在输出之前,要: response.reset(); out.clear(); 你的意见我正在考虑,在向ActiveX供应商寻求支持时,那边的回答就是只能拿实际文件而不能拿servlet二进制流。你这一说,我开始怀疑他们是否对此有过测试。谢谢提示。 |
|
返回顶楼 | |
发表时间:2009-11-20
既然用int 可以正确输出到client端,为什么不能用buffer writer 来输出呢
|
|
返回顶楼 | |
发表时间:2009-11-20
jeff312 写道 myy 写道 jeff312 写道 2. URL直接给图像组件。这个实际上原来开发包里就有这个功能,但是它只能下载实际存在的图像文件,比如这样的URL: http://host_name:8080/AppName/images/001.tif ,如果是 http://host_name:8080/AppName/SomeServlet?fileId=30 这样的URL,它是不起作用的。但是我不清楚是ActiveX的http请求都有这个限制还是说仅仅是我手头这个开发包的功能缺陷? 请指教。 不可能静态URL可以而动态不行,客户端应该只认数据格式,不会管你后台是如何生成的(否则生成图形验证码的程序如何实现?),应该是你写的“SomeServlet”有问题! 不一定Servlet,用jsp也可以直接输出byte array的,但要注意,在输出之前,要: response.reset(); out.clear(); 你的意见我正在考虑,在向ActiveX供应商寻求支持时,那边的回答就是只能拿实际文件而不能拿servlet二进制流。你这一说,我开始怀疑他们是否对此有过测试。谢谢提示。 供应商瞎扯蛋,tomcat静态文件也是通过servlet传送给客户端的, DefaultServlet 你可以尝试下跟踪应答头,看看你缺少了什么 |
|
返回顶楼 | |