problema JasperReport extraño

msi
19 de Octubre del 2009
Hola, estoy haciendo unos informes y he creado uno sencillo con la herramienta ireport (simplemente lee unos datos de la BD mediante select * from Tabla).

He conseguido mostrar el informe desde una página jsp pero en cuanto cierro el visor de informe (JasperViewer) la aplicación deja de funcionar (es como si el servidor se parase aunque no da señales de ello). Mediante algunos mensajes de ayuda me dice que los objetos session que tenía han sido invalidados.

Mientras está activo el informe (que se abre en otra ventana) puedo seguir utilizando la aplicación pero en cuanto cierro ese informe ya no puedo ya no puedo realizar nada más y tengo que volver a arrancar tomcat.

Aquí os dejo el sencillo código:

<%@ page import="net.sf.jasperreports.engine.*" %>
<%@ page import="net.sf.jasperreports.view.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="java.sql.*" %>
<%@ page import="javax.naming.*" %>

<html>
<HEAD>
<TITLE></TITLE>
</HEAD>
<body>

<%
Connection conexion = null;

File reportFile = new File(application.getRealPath("/reports/Reporte1.jasper"));

Class.forName("org.gjt.mm.mysql.Driver").newInstance();
conexion = DriverManager.getConnection("jdbc:mysql://localhost/pycenre_DBPYC?user=pycenre_login&password=bismarck");

HashMap parametros = new HashMap();

JasperPrint jasperPrint = JasperFillManager.fillReport(reportFile.getPath(),parametros,conexion);

JasperViewer.viewReport(jasperPrint);
%>
</body>
</html>

El informe es correcto y en la consola tomcat no me aparece ningún mensaje de error.

¿Alguna idea?

delia_montoya
19 de Octubre del 2009
Hola, tengo el mismo problema que tu, me podrías explicar como lo solucionaste, muchas gracias :-D
Saludos y una semana llena de mucho exito

Isaul salazar
19 de Octubre del 2009
Hola msi... checando tu problema te comento lo siguiente:

si quieres visualizar informes mediantes jsp, lo ideal es que generes PDF y no utilizes el JasperViewer.viewReport(jasperPrint).

si utilizas esa linea conseguiras que el informe solo se vizualise en la maquina donde tengas instalado tomcat, es decir se genera local.

lo ideal es combinarlo con un servlet que te responda un archivo PDF, ejemplo.-

public class RepServlets extends HttpServlet {
private static final String CONTENT_TYPE = "application/pdf";


//Initialize global variables
public void init() throws ServletException {
}

//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
createReport(request, response);

}

//Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doGet(request, response);
}

public void createReport(HttpServletRequest request, HttpServletResponse response) {
java.sql.Connection conn = null;
try {
response.setContentType(CONTENT_TYPE);
JasperReport jasperReport = null;

String dirInformes = nombre de la carpeta donde tienes el informe;
String reporteNombre = (String)request.getAttribute("REPORTE_JASPER"); // nombre del reporte a executar

String reporteJasper = "/reportes/" + dirInformes +"/"+ reporteNombre;
reporteJasper = request.getSession().getServletContext().getRealPath(reporteJasper);
jasperReport = JasperManager.loadReport(new FileInputStream(reporteJasper));

Map parameters = (Map)request.getAttribute("REPORTE_PARAMETROS"); // parametros
conn = getConnection(request);
JasperPrint jasperPrint = null;

jasperPrint = JasperManager.fillReport(jasperReport, parameters, conn);

OutputStream oS = null;
oS = response.getOutputStream();
JasperManager.printReportToPdfStream(jasperPrint, oS);

} catch(Throwable e) {

}finally{
try{
if(conn != null){
conn.close();
}

} catch (Throwable ex2) {
System.out.println("*************MENSAJE ERROR = " + ex2.getMessage());
System.out.println("*************CAUSA ERROR = " + ex2.getMessage());
}

}
}

private Connection getConnection(HttpServletRequest request) throws CrediSysException{
Connection conexion = null;

try {

final String claseDriver = "com.mysql.jdbc.Driver";

String cadConexion = cadena de conexion;
String usuario = usuario de la BD;
String password = contraseña del usuario;
Class.forName(claseDriver).newInstance();
String strConexion= cadConexion + "?user=" + usuario +"&password=" + password;
conexion = DriverManager.getConnection(strConexion);
}
catch (Throwable ex2) {
conexion = null;
System.out.println("*********ERROR EN LA CONEXION**********");
System.out.println("*************MENSAJE ERROR = " + ex2.getMessage());
System.out.println("*************CAUSA ERROR = " + ex2.getMessage());
throw new CrediSysException("No se pudo cargar la conexion.");
}

return conexion;
}

public void destroy() {

}



claro solo debes ajustarlo a tu caso..

un saludo y espero te sirva.

L.S.C: Isaul salazar

msi
19 de Octubre del 2009
Gracias por el interés. Puse esta duda en el foro inglés de jasperreport, me contestaron con la solución y se me olvidó comentarlo aquí.

La solución es poner JasperViewer.viewReport(jasperPrint,false); para que no se cierre la conexión.

De todas formas, esta solución tampoco me sirve porque aunque me funciona en mi máquina local, cuando subo mi aplicación a un hosting y uso JasperViewer me salta un error (null) por lo que debo hacer uso de tu método y generar el pdf.

Un saludo.