下面是详细讲解“tomcat6下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法”的完整攻略。
问题描述
在使用tomcat6运行jsp页面过程中,有可能会遇到getOutputStream() has already been called for this response异常。该异常在jsp页面中使用out.writer()方法输出数据时出现,主要表现为:首次调用out.writer()方法时,可以正常返回数据,但是在再次调用该方法时,就会出现异常。
异常原因
造成该异常的原因是因为在jsp页面中使用了多个字节输出流,而tomcat6只支持一个字节输出流,不支持多个字节输出流同时工作,这就会导致输出流被重用,以至于在第二次调用out.writer()方法时,就会发现输出流已经被关闭了。
解决方法
为了解决该异常,我们需要调整jsp页面中的代码,使得只使用一个字节输出流,避免出现多个字节输出流同时工作导致的异常。
下面是两条示例说明:
示例一
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition","attachment;filename=export.xls");
%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Export Data</title>
</head>
<body>
<table>
<thead>
<tr>
<th>姓名</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="user">
<tr>
<td>${user.name}</td>
<td>${user.age}</td>
</tr>
</c:forEach>
</tbody>
</table>
<%
out.flush();
out.close();
%>
</body>
</html>
上述代码是一个简单的数据导出示例,首先我们设置响应类型和头信息,然后使用JSTL标签库输出数据,最后在jsp页面最底部,使用out.flush()和out.close()方法关闭输出流。
示例二
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%
response.setContentType("text/html;charset=UTF-8");
%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
<%
out.print("Hello World!");
out.flush();
out.close();
%>
</body>
</html>
上述代码是一个简单的输出“Hello World!”的jsp页面示例,我们可以看到,在输出数据后,同样使用out.flush()和out.close()方法关闭输出流,以确保输出流正常关闭,避免出现异常。
总的来说,为了避免出现getOutputStream() has already been called for this response异常,我们应该在jsp页面最底部关闭输出流,并且避免多个输出流同时工作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:tomcat6下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法 - Python技术站