Foros del Web » Programación para mayores de 30 ;) » Java »

IllegalStateException en JSP

Estas en el tema de IllegalStateException en JSP en el foro de Java en Foros del Web. Hola, estoy creando una aplicación en JSP sobre Tomcat 5.5 para generar un archivo de texto en mi máquina local y que pueda ser descargado ...
  #1 (permalink)  
Antiguo 03/01/2007, 05:01
 
Fecha de Ingreso: enero-2007
Mensajes: 17
Antigüedad: 17 años, 3 meses
Puntos: 0
IllegalStateException en JSP

Hola, estoy creando una aplicación en JSP sobre Tomcat 5.5 para generar un archivo de texto en mi máquina local y que pueda ser descargado por un usuario remoto. Para ello hago uso de un taglib que contiene el método sendFile:

private void sendFile(String s, HttpServletResponse httpservletresponse)
throws JspException
{
String s1 = System.getProperty("file.separator");
try
{
pageContext.getOut().clearBuffer();
}
catch(Exception exception) { }
int i = s.lastIndexOf(s1);
if(i < 0 && s1.equals("\\"))
{
i = s.lastIndexOf("/");
}
String s2;
if(i > 0 && i != s.length() - 1)
{
s2 = s.substring(i + 1);
} else
{
s2 = s;
}
httpservletresponse.setContentType(getContentType( s2) + "; name=" + s2);
if(!inline)
{
httpservletresponse.setHeader("Content-Disposition", "attachment;filename=\"" + s2 + "\"");
} else
{
httpservletresponse.setHeader("Content-Disposition", "inline;filename=\"" + s2 + "\"");
}
ServletOutputStream servletoutputstream;
try
{
servletoutputstream = httpservletresponse.getOutputStream();
}
catch(Exception exception1)
{
throw new JspException("Could not get OutputStream: " + exception1.getMessage());
}
if(!dumpFile(s, servletoutputstream))
{
throw new JspException("Could not download file");
}
try
{
servletoutputstream.flush();
servletoutputstream.close();
}
catch(Exception exception2) { }
}

El problema es que Tomcat me da una IllegalStateException, diciéndome que ya he llamado a getOutputStream para esa respuesta, lo que no entiendo, ya que no estoy llamando a getWriter. Esta es la traza del error:

03-ene-2007 11:19:09 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() para servlet jsp lanzó excepción
java.lang.IllegalStateException: getOutputStream() ya ha sido llamado para esta respuesta
at org.apache.catalina.connector.Response.getWriter(R esponse.java:599)
at org.apache.catalina.connector.ResponseFacade.getWr iter(ResponseFacade.java:195)
at org.apache.jasper.runtime.JspWriterImpl.initOut(Js pWriterImpl.java:124)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffe r(JspWriterImpl.java:117)
at org.apache.jasper.runtime.PageContextImpl.release( PageContextImpl.java:191)
at org.apache.jasper.runtime.JspFactoryImpl.internalR eleasePageContext(JspFactoryImpl.java:115)
at org.apache.jasper.runtime.JspFactoryImpl.releasePa geContext(JspFactoryImpl.java:75)
at org.apache.jsp.descargaInformeAgregado_jsp._jspSer vice(descargaInformeAgregado_jsp.java:241)
at org.apache.jasper.runtime.HttpJspBase.service(Http JspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:802)
at org.apache.jasper.servlet.JspServletWrapper.servic e(JspServletWrapper.java:332)
at org.apache.jasper.servlet.JspServlet.serviceJspFil e(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspSe rvlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:802)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:178)
at org.apache.catalina.authenticator.AuthenticatorBas e.invoke(AuthenticatorBase.java:524)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11 ConnectionHandler.processConnection(Http11BaseProt ocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.process Socket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThr ead.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlR unnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)

Y la parte relevante del código fuente de la aplicación (las String tempInforme y nombreInforme ya están inicializadas; "do: download" es la etiqueta del taglib):


<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /></head>
<body>
<%
String dirInforme = "/files/temp";
String rutaInforme = "webapps/tarific/files/temp/" + nombreInforme;
BufferedWriter salidaInforme = new BufferedWriter(new FileWriter(rutaInforme));
File ficheroInforme = new File(rutaInforme);
salidaInforme.write(tempInforme);
salidaInforme.close();
if (!(ficheroInforme.exists())){
%>
ERROR. El archivo no se ha guardado correctamente
<%
} else {
%>
<do:download file="<%=nombreInforme%>" dir="<%=dirInforme%>"/>
<%
}
Registros.close();
StatementRegistros.close();
ConnRegistros.close();
%>
</body>
</html>

¿Alguien puede ayudarme? Muchas gracias por vuestra atención.
  #2 (permalink)  
Antiguo 03/01/2007, 08:11
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: IllegalStateException en JSP

Si usas un taglib de ese tipo, no puedes escribir nada de HTML en el fichero. Y nada incluye los tags que has puesto (body, html...) que no tienen que estar. Solo deberian estar en caso de error, pero no si devuelves el fichero.
  #3 (permalink)  
Antiguo 03/01/2007, 08:43
 
Fecha de Ingreso: enero-2007
Mensajes: 17
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: IllegalStateException en JSP

Gracias por responder tan rápidamente, Greeneyed.

Si te he entendido bien, la fuente del conflicto entre getOutputStream() y getWriter() radica en la propia inclusión de HTML en el código JSP. Luego debería funcionar si suprimo el HTML en dicho código. Por desgracia, acabo de intentar una solución borrando todas las etiquetas HTML y sigue lanzando la misma excepción. El código fuente (completo) ahora es:

<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" import="java.io.*"%>
<%@ include file="/Connections/conexion.jsp" %>
<%@ taglib uri="/WEB-INF/lib/taglibDescarga.tld" prefix="do" %>

<%--Inicialización de variables--%>
<%
String fechaInforme = "";
String extInforme = "";
String ccInforme = "";
String tipoInforme = "";
String tempInforme = "Fecha\tCentro de Coste\tExtensión\tTipo de Llamada\tNum. Llamadas\tTotal segundos\tImporte Total(\u20AC)\n";
if (request.getParameter("reqFecha") != null){
fechaInforme = request.getParameter("reqFecha");
} else fechaInforme = "%";
if (request.getParameter("reqExt") != null){
extInforme = request.getParameter("reqExt");
} else extInforme = "%";
if (request.getParameter("reqCentroCoste") != null){
ccInforme = request.getParameter("reqCentroCoste");
} else ccInforme = "%";
if (request.getParameter("reqTipo") != null){
tipoInforme = request.getParameter("reqTipo");
} else tipoInforme = "%";
String ano = "";
String mes = "";
String dia = "";
String nombreInforme = "informeAgregadoTPI" + fechaInforme + extInforme + ccInforme + tipoInforme;
int acumNumeroLlamadas = 0;
int acumTotalSegundos = 0;
double acumImporte = 0;
%>

<%--Creación de juego de registros de agregado--%>
<%
Driver DriverRegistros = (Driver)Class.forName(MM_conexion_DRIVER).newInsta nce();
Connection ConnRegistros = DriverManager.getConnection(MM_conexion_STRING,MM_ conexion_USERNAME,MM_conexion_PASSWORD);
PreparedStatement StatementRegistros = ConnRegistros.prepareStatement("SELECT * FROM tarific.adt_agdiallama WHERE id_centro_coste LIKE ? AND nc_extension LIKE ? AND de_clase_llama LIKE ? AND co_dia LIKE ? GROUP BY co_dia, id_centro_coste, nc_extension, de_clase_llama ASC");
StatementRegistros.setString (1,ccInforme);
StatementRegistros.setString (2,extInforme);
StatementRegistros.setString (3,tipoInforme);
StatementRegistros.setString (4,fechaInforme + "__");
ResultSet Registros = StatementRegistros.executeQuery();
boolean Registros_isEmpty = !Registros.next();
boolean Registros_hasData = !Registros_isEmpty;
%>

<%--Bucle de escritura de registros--%>
<%
if (Registros_isEmpty) {
tempInforme += "No hay resultados que mostrar";
} else {
String reg_CC = "";
String reg_ext = "";
String reg_tipo = "";
String reg_dia = "";
String reg_llamadas = "";
String reg_duracion = "";
String sImporte = "";
StringBuffer tAno = new StringBuffer(4);
StringBuffer tMes = new StringBuffer(2);
StringBuffer tDia = new StringBuffer(2);
while (Registros_hasData) {
reg_CC = Registros.getString(1);
reg_ext = Registros.getString(2);
reg_tipo = Registros.getString(3);
reg_dia = Registros.getString(4);
reg_llamadas = Registros.getString(5);
reg_duracion = Registros.getString(6);
Double reg_importe = new Double((double)Math.round(Registros.getDouble(7)*1 00)/100);
sImporte = reg_importe.toString().replace('.',',');
tAno.delete(0,4);
tMes.delete(0,2);
tDia.delete(0,2);
for (int i=0; i <= 3; i++){
tAno.append(reg_dia.charAt(i));
}
ano = tAno.toString();
for (int i=4; i <= 5; i++){
tMes.append(reg_dia.charAt(i));
}
mes = tMes.toString();
for (int i=6; i <= 7; i++){
tDia.append(reg_dia.charAt(i));
}
dia = tDia.toString();
if(reg_ext.equals("-1")){
tempInforme += ano + "/" + mes + "/" + dia + "\t" + reg_CC + "\t" + "TPI Gen&eacute;rico Madrid\t"+ reg_tipo + "\t" + reg_llamadas + "\t" + reg_duracion + "\t" + sImporte + "\n";
} else if(reg_ext.equals("-2")){
tempInforme += ano + "/" + mes + "/" + dia + "\t" + reg_CC + "\t" + "TPI Gen&eacute;rico Barcelona\t" + reg_tipo + "\t" + reg_llamadas + "\t" + reg_duracion + "\t" + sImporte + "\n";
} else if(reg_ext.equals("-3")){
tempInforme += ano + "/" + mes + "/" + dia + "\t" + reg_CC + "\t" + "Televenta Madrid\t" + reg_tipo + "\t" + reg_llamadas + "\t" + reg_duracion + "\t" + sImporte + "\n";
} else if(reg_ext.equals("-4")){
tempInforme += ano + "/" + mes + "/" + dia + "\t" + reg_CC + "\t" + "Televenta Barcelona\t" + reg_tipo + "\t" + reg_llamadas + "\t" + reg_duracion + "\t" + sImporte + "\n";
} else if(reg_ext.equals("-9")){
tempInforme += ano + "/" + mes + "/" + dia + "\t" + reg_CC + "\t" + "Desconocido\t" + reg_tipo + "\t" + reg_llamadas + "\t" + reg_duracion + "\t" + sImporte + "\n";
} else {
tempInforme += ano + "/" + mes + "/" + dia + "\t" + reg_CC + "\t" + reg_ext + "\t" + reg_tipo + "\t" + reg_llamadas + "\t" + reg_duracion + "\t" + sImporte + "\n";
}
acumNumeroLlamadas += Registros.getInt(5);
acumTotalSegundos += Registros.getInt(6);
acumImporte += Registros.getDouble(7);
Registros_hasData = Registros.next();
}

Double dAcumImporte = new Double((double)Math.round(acumImporte*100)/100);
String sAcumImporte = dAcumImporte.toString().replace('.',',');
tempInforme += "TOTAL\t\t\t\t" + acumNumeroLlamadas + "\t" + acumTotalSegundos + "\t" + sAcumImporte + "\n";
}

//Escritura de archivo
String dirInforme = "/files/temp";
String rutaInforme = "webapps/tarific/files/temp/" + nombreInforme;
BufferedWriter salidaInforme = new BufferedWriter(new FileWriter(rutaInforme));
File ficheroInforme = new File(rutaInforme);
salidaInforme.write(tempInforme);
salidaInforme.close();
if (ficheroInforme.exists()){
%>
<do:download file="<%=nombreInforme%>" dir="<%=dirInforme%>"/>
<%
}
Registros.close();
StatementRegistros.close();
ConnRegistros.close();
%>
  #4 (permalink)  
Antiguo 03/01/2007, 09:13
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: IllegalStateException en JSP

Algo se debe estar escribiendo antes, aunque sean espacios en blanco o así, a veces pasa. Prueba a coger el servlet que genera el Tomcat a partir de la JSP y revisa ahi si esta escribiendo algo (algun comentario, alguna linea en blanco). Pero el error viene de ahí.

De todas formas, para devolver un fichero yo suelo usar servlets en vez de JSP, ya que si no tiene "vista" no tiene mucho sentido usar JSP y da problemas como estos.

Suerte
  #5 (permalink)  
Antiguo 03/01/2007, 09:43
 
Fecha de Ingreso: enero-2007
Mensajes: 17
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: IllegalStateException en JSP

Efectivamente, algo se está escribiendo. Concretamente saltos de línea, cada vez que se abren o cierran unas llaves JSP normales (<% %>) o de comentarios (<%-- --%>); algo como:

out.write('\r');
out.write('\n');

y similares.

Efectivamente, no tiene mucho sentido programar esta utilidad en JSP. Si lo hice así fue más que nada por "inercia", ya que el resto de la aplicación es una interfaz visual y sí está programada en JSP. Intentaré usar un servlet y espero que se solucione.

Gracias una vez más por tu rápida respuesta. Un saludo.
  #6 (permalink)  
Antiguo 03/01/2007, 11:01
 
Fecha de Ingreso: enero-2007
Mensajes: 17
Antigüedad: 17 años, 3 meses
Puntos: 0
Error en Servlet

Bueno, estoy haciendo que el proceso de descarga lo lleve a cabo un servlet, en vez de una página JSP. He construido dicho servlet reutilizando los métodos del taglib que tenía en un principio, y colocando en doGet y doPost el código Java de mi página JSP anterior, de acuerdo con la estructura estándar de un servlet; el archivo de texto se graba correctamente en mi máquina local, pero no salta un cuadro de diálogo (como ocurría anteriormente) para poder grabar ese archivo en el ordenador de un usuario remoto). Creo que el problema debe estar al invocar al método doEndtag(), que no debe de llamar correctamente a sendFile(), pero no veo la diferencia entre lo que había antes en el tag y lo que he copiado en mi servlet. El código completo del servlet lo incluyo en el siguiente mensaje (demasiados caracteres)

¿Alguien es capaz de ver el problema, o tiene una solución más fácil para un servlet que reciba como parámetro el nombre del archivo a crear (eso ya está), grabe el archivo en la máquina local (eso también) y abra un cuadro de diálogo que permita descargarlo?

Gracias por vuestra atención.
  #7 (permalink)  
Antiguo 03/01/2007, 11:02
 
Fecha de Ingreso: enero-2007
Mensajes: 17
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: IllegalStateException en JSP

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import java.sql.*;
import java.util.zip.GZIPOutputStream;
import java.io.*;

public class servletDescarga extends HttpServlet {

PageContext pageContext;
private static final int BUFFER_SIZE = 4096;
private boolean compress = false;
private boolean inline = false;
private String file = null;
private String dir = null;
private String contentType = null;

public void setCompress(boolean flag)
{
compress = flag;
}

public void setCompress(String s)
{
if("true".equals(s))
{
compress = true;
} else
{
compress = false;
}
}

public boolean getCompress()
{
return compress;
}

public void setInline(boolean flag)
{
inline = flag;
}

public void setInline(String s)
{
if("true".equals(s))
{
inline = true;
} else
{
inline = false;
}
}

public boolean getInline()
{
return inline;
}

public void setFile(String s)
{
file = s;
}

public String getFile()
{
return file;
}

public void setDir(String s)
{
dir = s;
}

public String getDir()
{
return dir;
}

public void setContentType(String s)
{
contentType = s;
}

public String getContentType()
{
return contentType;
}

public int doEndTag()
throws JspException
{
HttpServletRequest httpservletrequest = (HttpServletRequest)pageContext.getRequest();
HttpServletResponse httpservletresponse = (HttpServletResponse)pageContext.getResponse();
String s;
if(dir == null)
{
s = "";
} else
{
s = dir;
String s1 = System.getProperty("file.separator");
if(!s.endsWith(s1) && !s.endsWith("/") && !file.startsWith(s1) && !file.startsWith("/"))
{
s = s + s1;
} else
if((s.endsWith(s1) || s.endsWith("/")) && (file.startsWith(s1) || file.startsWith(s1)))
{
s = s.substring(0, s.length() - 1);
}
}
s = s + file;
if(!compress)
{
sendFile(s, httpservletresponse);
} else
if(httpservletrequest.getHeader("Accept-Encoding").indexOf("gzip") < 0)
{
sendFile(s, httpservletresponse);
} else
{
sendCompressed(s, httpservletresponse);
}
return 6;
}

private void sendCompressed(String s, HttpServletResponse httpservletresponse)
throws JspException
{
String s1 = System.getProperty("file.separator");
try
{
pageContext.getOut().clearBuffer();
}
catch(Exception exception) { }
int i = s.lastIndexOf(s1);
if(i < 0 && s1.equals("\\"))
{
i = s.lastIndexOf("/");
}
String s2;
if(i > 0 && i != s.length() - 1)
{
s2 = s.substring(i + 1);
} else
{
s2 = s;
}
httpservletresponse.setContentType(getContentType( s2) + "; name=" + s2 + "");
httpservletresponse.setHeader("Content-Encoding", "gzip");
if(!inline)
{
httpservletresponse.setHeader("Content-Disposition", "attachment;filename=\"" + s2 + "\"");
} else
{
httpservletresponse.setHeader("Content-Disposition", "inline;filename=\"" + s2 + "\"");
}
javax.servlet.ServletOutputStream servletoutputstream;
GZIPOutputStream gzipoutputstream;
try
{
servletoutputstream = httpservletresponse.getOutputStream();
gzipoutputstream = new GZIPOutputStream(servletoutputstream);
}
catch(Exception exception1)
{
throw new JspException("Could not get OutputStream");
}
if(!dumpFile(s, gzipoutputstream))
{
throw new JspException("Could not download file");
}
try
{
gzipoutputstream.close();
servletoutputstream.flush();
servletoutputstream.close();
}
catch(Exception exception2) { }
}

private void sendFile(String s, HttpServletResponse httpservletresponse)
throws JspException
{
String s1 = System.getProperty("file.separator");
try
{
pageContext.getOut().clearBuffer();
}
catch(Exception exception) { }
int i = s.lastIndexOf(s1);
if(i < 0 && s1.equals("\\"))
{
i = s.lastIndexOf("/");
}
String s2;
if(i > 0 && i != s.length() - 1)
{
s2 = s.substring(i + 1);
} else
{
s2 = s;
}
httpservletresponse.setContentType(getContentType( s2) + "; name=" + s2 + "");
if(!inline)
{
httpservletresponse.setHeader("Content-Disposition", "attachment;filename=\"" + s2 + "\"");
} else
{
httpservletresponse.setHeader("Content-Disposition", "inline;filename=\"" + s2 + "\"");
}
javax.servlet.ServletOutputStream servletoutputstream;
try
{
servletoutputstream = httpservletresponse.getOutputStream();
}
catch(Exception exception1)
{
throw new JspException("Could not get OutputStream: " + exception1.getMessage());
}
if(!dumpFile(s, servletoutputstream))
{
throw new JspException("Could not download file");
}
try
{
servletoutputstream.flush();
servletoutputstream.close();
}
catch(Exception exception2) { }
}

private boolean dumpFile(String s, OutputStream outputstream)
{
byte abyte0[] = new byte[4096];
boolean flag = true;
try
{
FileInputStream fileinputstream = new FileInputStream(lookupFile(s));
int i;
while((i = fileinputstream.read(abyte0)) != -1)
{
outputstream.write(abyte0, 0, i);
}
fileinputstream.close();
}
catch(Exception exception)
{
flag = false;
}
return flag;
}
  #8 (permalink)  
Antiguo 03/01/2007, 11:03
 
Fecha de Ingreso: enero-2007
Mensajes: 17
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: IllegalStateException en JSP

sigue el servlet:

private String getContentType(String s)
{
if(contentType != null)
{
return contentType;
} else
{
return "application/octet-stream";
}
}

public void setPageContext(PageContext pagecontext)
{
pageContext = pagecontext;
}

public void release()
{
compress = false;
inline = false;
file = null;
dir = null;
contentType = null;
}

private File lookupFile(String s)
{
File file1 = new File(s);
return file1.isAbsolute() ? file1 : new File(pageContext.getServletContext().getRealPath("/"), s);
}




public void doGet(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {

try {

String MM_conexion_DRIVER = "com.mysql.jdbc.Driver";
String MM_conexion_USERNAME = "root";
String MM_conexion_PASSWORD = "langas69";
String MM_conexion_STRING = "jdbc:mysql://localhost/tarific";
String fechaInforme = "";
String extInforme = "";
String ccInforme = "";
String tipoInforme = "";
String tempInforme = "Fecha\tCentro de Coste\tExtensión\tTipo de Llamada\tNum. Llamadas\tTotal segundos\tImporte Total(\u20AC)\n";
if (request.getParameter("reqFecha") != null){
fechaInforme = request.getParameter("reqFecha");
} else fechaInforme = "%";
if (request.getParameter("reqExt") != null){
extInforme = request.getParameter("reqExt");
} else extInforme = "%";
if (request.getParameter("reqCentroCoste") != null){
ccInforme = request.getParameter("reqCentroCoste");
} else ccInforme = "%";
if (request.getParameter("reqTipo") != null){
tipoInforme = request.getParameter("reqTipo");
} else tipoInforme = "%";
String ano = "";
String mes = "";
String dia = "";
String nombreInforme = "informeAgregadoTPI" + fechaInforme + extInforme + ccInforme + tipoInforme;
int acumNumeroLlamadas = 0;
int acumTotalSegundos = 0;
double acumImporte = 0;
Driver DriverRegistros = (Driver)Class.forName(MM_conexion_DRIVER).newInsta nce();
Connection ConnRegistros = DriverManager.getConnection(MM_conexion_STRING,MM_ conexion_USERNAME,MM_conexion_PASSWORD);
PreparedStatement StatementRegistros = ConnRegistros.prepareStatement("SELECT * FROM tarific.adt_agdiallama WHERE id_centro_coste LIKE ? AND nc_extension LIKE ? AND de_clase_llama LIKE ? AND co_dia LIKE ? GROUP BY co_dia, id_centro_coste, nc_extension, de_clase_llama ASC");
StatementRegistros.setString (1,ccInforme);
StatementRegistros.setString (2,extInforme);
StatementRegistros.setString (3,tipoInforme);
StatementRegistros.setString (4,fechaInforme + "__");
ResultSet Registros = StatementRegistros.executeQuery();
boolean Registros_isEmpty = !Registros.next();
boolean Registros_hasData = !Registros_isEmpty;
if (Registros_isEmpty) {
tempInforme += "No hay resultados que mostrar";
} else {
String reg_CC = "";
String reg_ext = "";
String reg_tipo = "";
String reg_dia = "";
String reg_llamadas = "";
String reg_duracion = "";
String sImporte = "";
StringBuffer tAno = new StringBuffer(4);
StringBuffer tMes = new StringBuffer(2);
StringBuffer tDia = new StringBuffer(2);
while (Registros_hasData) {
reg_CC = Registros.getString(1);
reg_ext = Registros.getString(2);
reg_tipo = Registros.getString(3);
reg_dia = Registros.getString(4);
reg_llamadas = Registros.getString(5);
reg_duracion = Registros.getString(6);
Double reg_importe = new Double((double)Math.round(Registros.getDouble(7)*1 00)/100);
sImporte = reg_importe.toString().replace('.',',');
tAno.delete(0,4);
tMes.delete(0,2);
tDia.delete(0,2);
for (int i=0; i <= 3; i++){
tAno.append(reg_dia.charAt(i));
}
ano = tAno.toString();
for (int i=4; i <= 5; i++){
tMes.append(reg_dia.charAt(i));
}
mes = tMes.toString();
for (int i=6; i <= 7; i++){
tDia.append(reg_dia.charAt(i));
}
dia = tDia.toString();
if(reg_ext.equals("-1")){
tempInforme += ano + "/" + mes + "/" + dia + "\t" + reg_CC + "\t" + "TPI Gen&eacute;rico Madrid\t"+ reg_tipo + "\t" + reg_llamadas + "\t" + reg_duracion + "\t" + sImporte + "\n";
} else if(reg_ext.equals("-2")){
tempInforme += ano + "/" + mes + "/" + dia + "\t" + reg_CC + "\t" + "TPI Gen&eacute;rico Barcelona\t" + reg_tipo + "\t" + reg_llamadas + "\t" + reg_duracion + "\t" + sImporte + "\n";
} else if(reg_ext.equals("-3")){
tempInforme += ano + "/" + mes + "/" + dia + "\t" + reg_CC + "\t" + "Televenta Madrid\t" + reg_tipo + "\t" + reg_llamadas + "\t" + reg_duracion + "\t" + sImporte + "\n";
} else if(reg_ext.equals("-4")){
tempInforme += ano + "/" + mes + "/" + dia + "\t" + reg_CC + "\t" + "Televenta Barcelona\t" + reg_tipo + "\t" + reg_llamadas + "\t" + reg_duracion + "\t" + sImporte + "\n";
} else if(reg_ext.equals("-9")){
tempInforme += ano + "/" + mes + "/" + dia + "\t" + reg_CC + "\t" + "Desconocido\t" + reg_tipo + "\t" + reg_llamadas + "\t" + reg_duracion + "\t" + sImporte + "\n";
} else {
tempInforme += ano + "/" + mes + "/" + dia + "\t" + reg_CC + "\t" + reg_ext + "\t" + reg_tipo + "\t" + reg_llamadas + "\t" + reg_duracion + "\t" + sImporte + "\n";
}
acumNumeroLlamadas += Registros.getInt(5);
acumTotalSegundos += Registros.getInt(6);
acumImporte += Registros.getDouble(7);
Registros_hasData = Registros.next();
}

Double dAcumImporte = new Double((double)Math.round(acumImporte*100)/100);
String sAcumImporte = dAcumImporte.toString().replace('.',',');
tempInforme += "TOTAL\t\t\t\t" + acumNumeroLlamadas + "\t" + acumTotalSegundos + "\t" + sAcumImporte + "\n";
}

//Escritura de archivo
String dirInforme = "/files/temp";
String rutaInforme = "webapps/tarific/files/temp/" + nombreInforme;
BufferedWriter salidaInforme = new BufferedWriter(new FileWriter(rutaInforme));
File ficheroInforme = new File(rutaInforme);
salidaInforme.write(tempInforme);
salidaInforme.close();
if (ficheroInforme.exists()){
setCompress(false);
setInline(false);
setDir(dirInforme);
setFile(nombreInforme);
doEndTag();
}
Registros.close();
StatementRegistros.close();
ConnRegistros.close();


} catch (Throwable t) {
System.out.println("cagada" + t.getMessage());
}
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
doGet(request,response);
}
}
  #9 (permalink)  
Antiguo 03/01/2007, 15:28
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: IllegalStateException en JSP

Un servlet te ejecutará solo el metodo doGet. El resto endTag etc son de los taglibs, en realidad no los necesitas para nada si no usas taglibs y seguramente no se te ejecutaran.

Si no te esta pidiendo que almacenes el fichero o lo abras con algun programa, es que no se le esta poniendo la cabecera HTTP correctamente (content type, etc) ya que eso es lo que le indica que no es HTML y debe tratarlo como fichero aparte.
  #10 (permalink)  
Antiguo 04/01/2007, 06:06
 
Fecha de Ingreso: enero-2007
Mensajes: 17
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: IllegalStateException en JSP

Si te fijas, al final del método doGet(), después de haber escrito el fichero en mi máquina, ejecuto los métodos setCompress(false);setInline(false);setDir(dirInfo rme);setFile(nombreInforme) y, finalmente, doEndTag(). Sé que no es nada elegante mantener los métodos del taglib, ya innecesarios, pero prefiero dejarlo de momento así y depurar más tarde. Además, te hago caso y he incluido una línea "setContentType("application/excel");" el problema es que la ejecución de doEndTag() me provoca una NullPointerException, que no sé de dónde sale (en los logs no aparece, y tanto el getCause como getMessage y demás métodos me devuelven null). A ver si encuentro la fuente del error y lo reparo.

Muchas gracias por tus respuestas; un saludo.
  #11 (permalink)  
Antiguo 04/01/2007, 06:54
 
Fecha de Ingreso: enero-2007
Mensajes: 17
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: IllegalStateException en JSP

¡Encontrado! (aunque ha costado lo suyo) Es la variable pageContext la que es null, y provoca la excepción.
  #12 (permalink)  
Antiguo 05/01/2007, 04:55
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: IllegalStateException en JSP

Esa variable se inicializa cuando es una JSP, en servlets el equivalente es request.getServletContext()
  #13 (permalink)  
Antiguo 05/01/2007, 07:17
 
Fecha de Ingreso: enero-2007
Mensajes: 17
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: IllegalStateException en JSP

Bueno, ya está (casi todo) arreglado. Terminé el servlet, y el archivo se guarda en local correctamente. El problema (sí, siempre surge un nuevo problema) ahora es que el proceso de descarga es totalmente impredecible si el archivo a descargar es grande: en ocasiones todo va correctamente, y en otras falla de una de estas maneras: o bien ni siquiera salta el cuadro de diálogo de descarga, o bien salta pero al darle a "guardar" no sucede nada. El error que me aparece es:

ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error

Se supone que este error aparece cuando se interrumpe la comunicación con el cliente (por ejemplo, al detener la carga de una página); pero no sé si puede ser por efecto de un timeout (no lo creo, el proceso dura en torno a 20 segundos), el caso es que, cuando falla, falla inmediatamente después de grabar el fichero en local, en el momento de empezar el proceso de descargarlo. En ocasiones, también aparece en los logs el mensaje "can not save body". El método que lanza la excepción es el siguiente:

private boolean dumpFile(String s, OutputStream outputstream)
{
byte abyte0[] = new byte[4096];
boolean flag = true;
try
{
FileInputStream fileinputstream = new FileInputStream(lookupFile(s));
int i;
while((i = fileinputstream.read(abyte0)) != -1)
{
outputstream.write(abyte0, 0, i);
}
fileinputstream.close();
}
catch(Exception exception)
{
flag = false;
}
return flag;
}

Esto se está volviendo más complicado por momentos. Uffffff. Gracias de antemano por vuestra atención. Un saludo.
  #14 (permalink)  
Antiguo 05/01/2007, 07:26
 
Fecha de Ingreso: enero-2007
Mensajes: 17
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: IllegalStateException en JSP

Se me olvidaban dos cosas: una, el método que lanza el error (dumpFile()) llama al siguiente método (puede que el error venga de aquí):

private File lookupFile(String s)
{
File file1 = new File(s);
return file1.isAbsolute() ? file1 : new File(pageContext.getServletContext().getRealPath("/"), s);
}

Y dos, además del SocketException, a veces lanza un NullPointerException (de forma impredecible, como todo en esta aplicación).
  #15 (permalink)  
Antiguo 05/01/2007, 11:23
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: IllegalStateException en JSP

Respecto a cortarse... puede ser que grabar el fichero tarde "demasiado" y el navegador "se canse" de esperar una respuesta y por eso de el timeout. ¿Te serviría devolverle directamente el fichero desde la conexion JDBC? Así empezarías a responder en seguida, y de hecho no es tan complicado.

Respecto a errores impredecibles, null pointers etc... yo creo que empezaría de cero, haría un simple servlet que descargue el fichero desde la conexion JDBC y me olvidaría de los taglibs y lo que hacen. Creo que los problemas te vienen de ahi, de coger codigo que se usa de otra forma e intentar adaptarlo.

En realidad un servlet que descargue un fichero es muy sencillo y no necesita tanto lio .
  #16 (permalink)  
Antiguo 08/01/2007, 04:34
 
Fecha de Ingreso: enero-2007
Mensajes: 17
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: IllegalStateException en JSP

Bueno, haciéndote caso (una vez más), he "limpiado" bastante el código que tomé prestado de los taglibs, ordenándolo más adecuadamente y eliminando lo innecesario... y ¡sorpresa! toda va como la seda; por lo menos los 5 minutos que llevo probando, apuesto a que mañana surgirán nuevos errores de la nada

Muchas gracias por tu ayuda, espero que con esto no vuelva a dar problemas. De todos modos, me has dejado intrigado: ¿qué mecanismo utilizarías tú para descargar el fichero al equipo del cliente directamente desde la conexión JDBC, es decir, sin crear antes un fichero "base" en la máquina local? Lo he estado pensando, y te aseguro que no se me ocurre...
  #17 (permalink)  
Antiguo 08/01/2007, 05:38
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: IllegalStateException en JSP

Simplemente preparas la conexion (poniendole el setContentType, etc) y luego lo que tu escribirías directamente en el fichero, lo escribes en response.getOuputStream(). Si tienes que comprimirlo, le pones entre medias un GzipOuputStream, si lo escribes como texto, entonces un BufferedWriter... a veces no se puede hacer todo, y entonces como lo has hecho con fichero va bien, pero muchas veces combinando Streams puedes hacerlo todo de golpe y te evitas ficheros temporales, consumo de memoria intermedia etc.

Si le coges el truco, con lo de anidar Streams en Java puedes hacer "magia" :).

Por cierto, haz una prueba de estres/rendimiento con la version que tienes ahora, luego cambiale donde tienes "+" por StringBuffer y ".append()", repite las pruebas y veras qué diferencia .

La concatenación de String es muy fácil, pero dentro de bucles o procesos que se repiten mucho es mucho mejor evitarla, aunque con StringBuffer el código quede más largo.

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:08.