前几天做了一个jsp文件下载的页面,刚开始是直接链接到要下载的文件上,在装有像迅雷,网际快车下载软件没有问题,但在没有装这些软件的机器上会把文件直接打开,如果是一个带后缀名为.rar压缩文件后会直接打开,页面全是乱码。最后重新做了一遍,download.jsp页面接收文件的id,根据这个id号找到对应的文件所有在的路径,把要下载的文件转换成流输出,下载的功能实现了,不过每次下载文件tomcat都要报
java.lang.IllegalStateException:getOutputStream() has already been called for this response
查了好多的资料,终于明白了报错的原因
在tomcat5下jsp中出现此错误一般都是在jsp中使用了输出流,没有处理好的原因。
具体的原因就是:
在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request,HttpServletResponse response)的最后有一段这样的代码
finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和response.getOutputStream()相冲突的!所以会出现以上这个异常。
在使用完输出流以后加入下面两条语句
out.clear();
out = pageContext.pushBody();
示例:download.jsp
//新建文件输入输出流
OutputStream output = null;
FileInputStream fis = null;
try{
//新建File对象
File f = new File("文件路径");
//新建文件输入输出流对象
output = response.getOutputStream();
fis = new FileInputStream(f);
//设置每次写入缓存大小
byte[] buffer = new byte[1024];
//把输出流写入客户端
int i = =1;
while((i = fis.read(b)) != -1){
output.write(buffer, 0, i);
}
output.flush();
}
catch(Exception e){
e.printStackTrace();
}
finally{
if(fis != null){
fis.close();
fis = null;
}
if(output != null){
output.close();
output = null;
}
if(out != null){
//下面这两行解决getOutputStream() has already been called for this response异常
out.clear();
out = pageContext.pushBody();
}
}
分享到:
相关推荐
- `IOException`:在处理输入/输出流时,如果发生错误,例如网络中断或磁盘满,会抛出此异常。 - `ServletException`:与Servlet相关的错误,如初始化失败、找不到Servlet类等。 2. **日志分析**: - Tomcat的...
Tomcat 不显示详细日志的问题解决方案 Tomcat 是一个流行的 Java Web 服务器,用于部署和运行基于 Java 的 Web 应用程序。但是,在某些情况下,Tomcat 的详细错误日志可能会消失,只报一个万恶的 Context [] ...
1. 注意输出顺序:在JSP中首先使用输出流(response.getOutputStream())输出数据,然后再使用字符输出流(response.getWriter())输出文本数据。如果需要先输出文本数据,必须确保之后不再使用输出流。 2. 使用...
2. "xml读取异常Invalid byte 1 of 1-byte UTF-8 sequence-中文版的window下java的默认的编码为GBK.url":这个文件名暗示了解决XML文件读取异常的方法,尤其是在Windows环境下,Java默认的文件编码可能是GBK,这可能...
此外,Java集合框架(如ArrayList、HashMap等)、异常处理机制、并发编程模型(线程和锁)以及输入/输出流等也是开发者必须掌握的知识。 其次,Spring框架是Java企业级应用开发的首选框架,它简化了开发过程,提供...
catalina.out文件是Tomcat服务器的标准输出和标准错误的记录文件。每当Tomcat启动和运行应用时,所有的日志信息、异常堆栈跟踪以及其他运行信息都会被重定向到这个文件中。这个文件对于诊断问题和监控应用程序的运行...
所以在JSP容器通过Response获取输出流之前,前面的流并没有关闭,所以会造成该异常的报出。 本文解决办法: 在前面所说的网络解决办法中,使用的是一种躲避的方式解决该问题,也就是置之不理。 这里提供一个...
5. **日志分析**:了解如何阅读和分析Java应用的日志输出,找出错误信息和异常堆栈。 6. **错误排查技巧**:学习如何使用IDE的调试功能,或者通过打印变量值来追踪问题。 7. **源码阅读**:在某些情况下,阅读...
当这两个组件的版本不匹配时,Eclipse可能无法正确解析项目的依赖,导致编译错误或运行时异常。 解决这个问题的步骤如下: 1. **检查JDK版本**: - 右键点击项目,选择“属性”(Properties)。 - 在左侧导航栏中...
4. **日志和监控**: Tomcat的日志系统,以及如何通过修改配置来增强日志输出,以便进行故障排查。 5. **Java编程基础**: 如果"probe"是一个Java程序,需要理解Java的基本语法和类库,特别是与网络和服务器交互的部分...
- **异常解释**:当 Servlet 响应已经使用了一个输出流(OutputStream),再尝试使用 PrintWriter 类写入文本时会出现此异常。这是因为一个响应只能使用一种类型的输出方式。 - **解决方法**: - 在写入数据...
4. **输入输出流**:掌握文件I/O操作,包括字节流和字符流,以及对象序列化和反序列化。 5. **多线程**:理解线程的创建和同步,以及synchronized关键字、wait()、notify()方法的用法。 6. **网络编程**:学习...
1. Java基础:包括类、对象、封装、继承、多态等概念,以及异常处理、输入输出流等。 2. Spring Boot框架:用于快速开发Java Web应用,提供了自动配置、内嵌Tomcat服务器、MVC框架等功能。 3. MySQL数据库操作:包括...
2、设置响应的内容类型以及字符编码方式:获取响应流之前设置有效果 3、网页上的换行效果:网页上的换行效果需要输出 异常: Desktop>javac HelloServlet.java HelloServlet.java:2: 错误: 编码GBK的不可...
通过案例分析,我们可以系统地探讨Java程序设计的关键知识点,包括但不限于语法基础、面向对象编程、异常处理、集合框架、多线程、输入/输出流、网络编程以及Java应用程序和Web应用程序的开发。 1. **Java语法基础*...
在Android中,我们可以通过`java.net.Socket`类创建Socket对象,然后通过输入输出流与服务器进行数据交换。Socket连接建立后,客户端可以向服务器发送HTTP请求。 3. **构建HTTP请求**: 在手写HTTP协议时,我们...
5. **输入输出流**:理解IO流的概念,包括原始流和包装流,熟悉InputStream、OutputStream、Reader、Writer,以及对象序列化和反序列化。理解Adapter设计模式和Decorator设计模式在流类中的应用。 6. **多线程**:...
这包括但不限于异常处理、输入输出(I/O)流、多线程和集合类的使用。异常处理是Java程序中必不可少的部分,理解try-catch-finally结构,以及如何捕获和处理不同类型的异常。I/O流分为字节流、字符流和对象序列化,要...