Servlet的两种输出机制

这两天在做自动化登录的验证接口时,通过一个jsp页面返回的xml数据在页首出现了空行,导致文件解析失败。这个问题早在网站上发现,但由于不影响显示效果,所以一直不理它。从直观上理解,造成空行的原因应该是jsp在编译时,<%import….%>语句都被换成了空行。
反编译编译后的servlet,可以看到<%import….%>语句之处,被替换为out.print(“rn”),这是因为Application Server在将jsp编译成servlet时,将<%**%>之间的内容原样输出,并加上了换行。在默认的PrintWriter输出机制下,对于文本文件来说,除了看得有点不爽之外,这种换行不存在任何问题,但如果对于jpg等其他格式的文件则会产生诸如0x0d和0x0a这样的换行符,则可能导致文件打开失败。如果我们尝试使用OutputStream输出机制来进行内容的输出,这种换行的存在就会导致一个报错:视图在servlet中使用两种输出机制。因此,最好能将它们清空。
语句很简单:

out.clear();

如果要使用OutputStream机制来输出,则需要加上:

response.reset();
即可解决这一问题。
笔记:

在Servlet中有两种机制用于打印响应:PrintWriter和ServletOutputStream。打印二进制数据应该使用ServletOutputStream,打印字符文本可以用PrintWriter,如果同时需要打印二进制数据和字符文本,比较明智的做法是使用ServletOutputStream。

3 thoughts on “Servlet的两种输出机制

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*