Dunque, ecco una descrizione più esaustiva del problema. Sto creando una web application in Java usando Eclipse; nella cartella /report/ sotto WebContent esiste il file rpt.jasper che corrisponde al report che vorrei aprire con il link che dà l'errore descritto. In locale tutto funziona, solo in remoto vedo quell'errore. Ecco la servlet con la quale cerco di aprire il report, servlet che si presume dia tale errore:
EDIT: Te lo commento meglio e te lo rendo un pò più leggibile.
codice:
package servletReport;
//qui ci sono un pò di import per le necessarie risorse
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRRtfExporter;
/**
* Servlet implementation class for Servlet: ServletReportStremRTF
*
*/
public class ServletReportStreamRTF extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
static final long serialVersionUID = 1L;
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#HttpServlet()
*/
public ServletReportStreamRTF() {
super();
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
//questa riga di sotto non l'avevo mai vista prima. Ma parla di un warning e non di errori
@SuppressWarnings("unchecked")
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//Di seguito troverai i parametri che portano al percorso dove si trova il report
String rptFileName = request.getParameter("rptFileName").toString();
String rptFolder = "/report/";
JasperPrint jp = null;
//qui passo alcuni parametri per il report, in locale tutto funziona bene.
Map parameters = new HashMap();
parameters.put("param1", new Integer(1));
parameters.put("alfa", "www");
parameters.put("beta", "CCC");
//qui ci sono i parametri per la connessione
String cnHost = "localhost";
String cnName = "databasedb";
String cnLogin = "databaseuser";
String cnPsw = "databasepsw";
Connection Conn = null;
ServletContext context = this.getServletContext();
//Parte relativa alla connessione al db
try {
Class.forName("org.postgresql.Driver").newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Conn = DriverManager.getConnection("jdbc:postgresql://"+cnHost+"/" + cnName + "?user=" + cnLogin + "&password=" + cnPsw);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Ecco la parte secondo me incriminata!
C'è qualcosa, nel modo di ottenere il percorso del report
tramite context.getRealPath (ti ricordo che il report è sotto WebContent/report/)
che in locale funziona ed in remoto no.
Posso sbagliarmi, ma forse doveva esserci qualcosa che non ho fatto.
try {
jp = JasperFillManager.fillReport(context.getRealPath(rptFolder + rptFileName + ".jasper"), parameters, Conn);
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Parte relativa all'apertura del report
JRRtfExporter exporter = new JRRtfExporter();
response.setHeader("Content-disposition", "attachment; filename=" + rptFolder + rptFileName + ".rtf");
response.setContentType("application/x-download");
OutputStream outputStream = response.getOutputStream();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jp);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);
try {
exporter.exportReport();
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputStream.flush();
outputStream.close();
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request,response);
}