Download de arquivo na jsp

Boa tarde povo!

Seguinte, tenho um problema um pouco complicado em relação a downloads em jsp…

Estou trabalhando com 2 sistemas, um com um pocketPc, e outro um sistema web.
Utilizo o Linux (ou seja, sem activeSync), e o sistema do pocketPc precisa de um arquivo gerado pelo sistema web.

Até ai tudo bem.

Toda vez que um usuário utiliza o sistema, o mesmo gera um arquivo pra ele por no pocket. Um arquivo diferente para cada consulta. Então eu acredito que não posso colocá-lo no servidor e indicar a url (vários usuários, mesmo nome de arquivo,sabe como é…).
Então, segundo os patterns da empresa (MVC), na Action crio um arquivo, e escrevo nele utilizando o seguinte código:

		try {
			byte[] zipFile = (byte[])request.getSession().getAttribute("zipFile");
			if(zipFile != null){
				response.setHeader("Content-disposition", "attachment;filename="+request.getSession().getAttribute("nomeArq")+".zip");
				response.setContentType("application/zip");
				response.setContentLength(zipFile.length);
			}
			ServletOutputStream outPutStream = response.getOutputStream();
			outPutStream.write(zipFile, 0, zipFile.length);
			outPutStream.flush();
			outPutStream.close();

			
		}catch (IllegalStateException ie){
			throw new ApplicationException("mensagem.padrao");
		}catch (Exception e) {
			throw new ApplicationException("mensagem.padrao");
		}
		//Removendo da sessao
		request.getSession().removeAttribute("zipFile");
		request.getSession().removeAttribute("nomeArq");

Apesar de não entender muito como funcionou, o sistema realiza a operação que quero, e o download aparece. Entretanto, o sistema lança um erro:

13:11:29,818 INFO [STDOUT] 13:11:29,816 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response

Procurando pela internet, achei coisas do tipo “você deve fazer este tipo de coisa no servlet” “servlet puro” e afins. Porém, não tenho esta escolha, tenho que fazer na Action :sad: . Alguém sabe como posso contornar este problema?

Creio que o erro seja porque você seta o response para um tipo de resposta e posteriormente o Struts tenta enviar outra resposta…
Qual é a sua limitação em utilizar um Servlet?

Abraços

Verifique se no fim do metodo você não está retornando um ActionForward, tente retornar null, ou coloque o codigo do metodo completo aí.

Bom, dexa eu bota as tecnologias usadas

Linux(Debian), JBoss, Struts, Hibernate

Na JSP:

		<c:if test="${arquivoExportacao == 1}">
			<script>
        		window.onload = funcition downloadArquivoExportacao(){
					form.arquivoExportacao = 0;
					form.action = "exportarPocket.do?action=downloadZip";
				}
    		</script>
		</c:if>

Na classe ExportarPocketAction

	public ActionForward downloadZip(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws ApplicationException, Exception {
	
		try {
			byte[] zipFile = (byte[])request.getSession().getAttribute("zipFile");
			if(zipFile != null){
				response.setHeader("Content-disposition", "attachment;filename="+request.getSession().getAttribute("nomeArq")+".zip");
				response.setContentType("application/zip");
				response.setContentLength(zipFile.length);
			}
			ServletOutputStream outPutStream = response.getOutputStream();
			outPutStream.write(zipFile, 0, zipFile.length);
			outPutStream.flush();
			outPutStream.close();
			
		}catch (IllegalStateException ie){
			throw new ApplicationException("mensagem.padrao");
		}catch (Exception e) {
			throw new ApplicationException("mensagem.padrao");
		}
		//Removendo da sessao
		request.getSession().removeAttribute("zipFile");
		request.getSession().removeAttribute("nomeArq");
		
		return iniciarProcesso(mapping, form, request, response);
	}

Erro

14:10:48,196 INFO  [STDOUT] 14:10:48,192 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
	at org.apache.catalina.connector.Response.getWriter(Response.java:599)
	at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:195)
	at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:111)
	at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:124)
	at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:117)
	at org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:172)
	at org.apache.struts.tiles.taglib.InsertTag$InsertHandler.doEndTag(InsertTag.java:893)
	at org.apache.struts.tiles.taglib.InsertTag.doEndTag(InsertTag.java:465)
	at org.apache.jsp.pages.layout.applicationLayout_jsp._jspx_meth_tiles_get_0(applicationLayout_jsp.java:514)
	at org.apache.jsp.pages.layout.applicationLayout_jsp._jspx_meth_html_html_0(applicationLayout_jsp.java:422)
	at org.apache.jsp.pages.layout.applicationLayout_jsp._jspService(applicationLayout_jsp.java:130)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)
	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:574)
	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:499)
	at org.apache.struts.action.RequestProcessor.doInclude(RequestProcessor.java:1105)
	at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:292)
	at org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:271)
	at org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:332)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:232)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
	at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
	at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
	at java.lang.Thread.run(Thread.java:595)

Tente trocar:

return iniciarProcesso(mapping, form, request, response);

Por:

return null;