`
weigang.gao
  • 浏览: 491371 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

java.lang.IllegalStateException: getOutputStream() has already been called for

 
阅读更多

①在java代码Action中

在使用流的方法下载Excel的时候 经常会遇到如下错误:

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()。

异常出现原因:这是因为在java中调用response.getOutputStream()方法 和 Servlet中调用 response.getWriter()相冲突造成的!所以会出现以上这个异常。

解决:在java中也使用PrintWriter(response.getWriter获取的是PrintWriter)就行了

如下:

  /**
     * @param response
     * @param source 存放Excel文件本地路径
     */
	private void download(HttpServletResponse response, File source){
		Log.info("download-->1.source=" + source);
		FileInputStream in = null;
		//OutputStream out = null; //替换成PrintWriter 
		PrintWriter out = null;
		try {
			in = new FileInputStream(source);
			//out = response.getOutputStream();
			out = response.getWriter();//获取PrintWriter
			response.setContentType("application/vnd.ms-excel");
			response.setHeader("Content-disposition", new String(
					("attachment; filename=" + source.getName()).getBytes(),
					"ISO8859-1")); // 支持下载中文名称的文件
			byte[] buffer = new byte[1024];
			int len = 0;
			while ((len = in.read(buffer)) > 0) {
				String temp = new String(buffer, "ISO8859-1"); //转码
				//out.write(buffer, 0, len);
				out.write(temp);
			}
			out.flush();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (in != null) {
					in.close();
				}
				if (out != null) {
					out.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}

 

 

②在使用jspsmart做文件下载时候,可能会遇到如下错误:


解决:在使用完out后应该 out.clear(); out=pageContext.pushBody();

如下:downloadFile.jsp

<%@ page import="com.aegon_cnooc.giss.util.Constants"%>
<%@ page import="com.jspsmart.upload.SmartUpload"%>
<%
String templateType = request.getParameter("templateType");
String fullFileName = null;
if("clause_one".equals(templateType)){
    fullFileName = Constants.CLAUSE_DOC_ONE;//文件名全路径
}

try
 {
    if(fullFileName != null && fullFileName !="")
    {
    	com.jspsmart.upload.SmartUpload su = new com.jspsmart.upload.SmartUpload();

        su.initialize(pageContext);

        su.setContentDisposition(null);
     
        su.downloadFile(fullFileName);
       
     }else
     {
    	 out.write("<a>" + "下载路径不能为空!" + "</a>"); 
     }
	}catch (Exception e)
	 {
        out.write("<a>" + e.getMessage() + "</a>");
     }finally{
    	 if(out != null){
	    	 out.clear();
	    	 out=pageContext.pushBody();
    	 }
     }
%>

 

问题:今天在使用jspsmart做文件下载的时候,从一个jsp页面传参(文件路径filePath)到downloadFile.jsp进行文件下载,文件路径中带有中文,虽然统一了编码,但是downloadFile.jsp接受到的路径还是乱码,所以导致文件一直无法下载。最后网上找到如下方法解决:String fileName = new String(request.getParameter("fileName").getBytes("iso-8859-1"),"gb2312"); 倍感欣慰。这是问题又来了,发布到服务器上,无法下载。最后无奈只有改成流的方式做下载Excel了,好在问题及时解决了。后来又想了另外一种思路,还是使用jspsmart, 但是我把中文文件路径配置在常量文件(Constants.java)中,然后在downloadFile.jsp文件中引入 就解决了。

 

  • 大小: 8.2 KB
分享到:
评论

相关推荐

    java.lang.IllegalStateException: getOutputStream() has already解决办法

    纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already。这个问题困扰了半天,在网上查阅了大量资料 出这个错误一般就是下面2个.....

    java.lang.IllegalStateException: Cannot call sendError() after the response has

    在Java的Web开发中,`java.lang.IllegalStateException: Cannot call sendError() after the response has been committed` 是一个常见的错误,通常发生在尝试在HTTP响应已经发送到客户端之后调用`sendError()`方法...

    java.lang.IllegalStateException: OutputStream already obtain

    标题 "java.lang.IllegalStateException: OutputStream already obtain" 涉及到的是Java编程中的一个常见错误,特别是当处理I/O流时。这个异常通常在尝试获取已经存在的OutputStream实例时抛出,表明该输出流已经被...

    关于IllegalStateException: The specified child already has a parent.

    IllegalStateException: The specified child already has a parent.我的博客中有文章讲解

    Android异常 java.lang.IllegalStateException解决方法

    1. java.lang.IllegalStateException: No wrapped connection. 2.java.lang.IllegalStateException: Adapter is detached. 原因: 1.单线程一次执行一个请求可以正常执行,如果使用多线程,同时执行多个请求时就会...

    ListView后台更新报错:java.lang.IllegalStateException

    java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but...

    spring入门好教程

    《Spring框架:开启Java开发新纪元》 Spring框架,由Rod Johnson创立并由Interface21公司推广,自诞生以来,它就致力于简化Java企业级应用(J2EE)的开发,提供了一种非侵入式的解决方案,极大地提高了开发效率。它...

    Failed to convert value of type ‘java.lang.String’ to required type ‘java.util.Date’; nested except

    Type 异常报告 消息 Failed to convert ... nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.util.Date': no matching editors or co

    powerbuilder

    ### PowerBuilder 中从 Excel 导入数据到 DataWindow 的实现方法 #### 标题解析: 在 PowerBuilder 开发环境中,经常需要将外部数据源(如 Excel 文件)中的数据导入到程序内部的数据展示组件(DataWindow)中进行...

    asm5.0.jar

    2013-08-12 14:33:37.672:... Add CGLIB to your classpath.:java.lang.IncompatibleClassChangeError: class net.sf.cglib.core.DebuggingClassWriter has interface org.objectweb.asm.ClassVisitor as super class

    xfire访问webservice客户端用到的jar包

    在Java开发中,Web服务(Web Service)是一种标准的接口,允许不同系统之间进行通信,而XFire是早年流行的一款用于构建和消费Web服务的开源框架。它使用SOAP(简单对象访问协议)和XML(可扩展标记语言)作为基础,...

    Jnative1.4_java调用动态库所需jar

    Java是一种高级编程语言,通常用于开发跨平台的应用程序。然而,有时我们可能需要在Java程序中调用操作系统底层的动态链接库(DLLs on Windows,SOs on Linux,dylibs on macOS),以便利用C、C++等语言编写的高性能...

    action-buffer:提供了在处理后台任务时避免片段过渡期间出现 IllegalStateException 的示例

    这个存储库提供了一种在处理片段传输和后台任务时避免“java.lang.IllegalStateException:Can not perform this action after onSaveInstanceState”的方法。 您可以在的非常权威的阅读有关该问题和可能的解决方案...

    借助Ehcache缓存框架实现对页面的缓存Demo

    信息: Illegal access: this web application instance has been stopped already. Could not load net.sf.ehcache.store.disk.DiskStore$KeySet. The eventual following stack trace is caused by an error thrown...

    The full error is: java.lang.IllegalState

    标题中的"The full error is: java.lang.IllegalStateException"是一个典型的Java编程错误,通常表示在不合法或不适当的状态下调用了某个方法。这个错误通常暗示程序试图执行一个不能在这个特定时刻执行的操作。让...

    oop object , for apple ios developer

    ### 面向对象编程与Objective-C:苹果iOS开发者指南 #### 一、概述 面向对象编程(Object-Oriented Programming, OOP)是一种广泛应用于软件开发中的编程范式,它将程序设计围绕“对象”进行组织。...

    nexus-3.70.1-02-java17-unix.tar.gz

    java.lang.IllegalStateException: The maximum Java version for OrientDb is Java 11. Please check current Java version meets this requirement. 参见: ...

    Invalid name=”com.alibaba.dubbo.config.ProtocolConfig#0″

    java.lang.IllegalStateException: Invalid name=“com.alibaba.dubbo.config.ProtocolConfig#0” contains illegal character, only digit, letter, ‘-’, ‘_’ or ‘.’ is legal 原因: 如果没有指定id属性,...

Global site tag (gtag.js) - Google Analytics