Krakovia,
grazie per la tua gentilissima (e provvidenziale, avrà qualche nesso col tuo nick? Mah! Chi ha orecchie per intendere intenda...) risposta. Dopo due giorni di tentativi ho scoperto che è esattamente come dici tu.
Ovvero, dopo aver creato e modificato la servlet con ogni foggia e colore mi sono detto "e se dipendesse dal percorso del subreport"?
Allora ho ripreso la servlet iniziale, nella quale non avevo inserito alcun particolare comando aggiuntivo ma solo il parametro da passare al main report affinché vedesse il sub (ovvero, la sua path), ed ho inserito C:/temp/ (il più semplice in assoluto che mi venisse in mente, indipendente dalla mia web application e dalla sua ubicazione nel tomcat locale, parametro che funziona sempre e che ho sempre usato in molte mie prove). Ho lasciato ovviamente il main report nella cartella report della mia applicazione e collocato il subreport in quella destinazione di prova C:/test/. Bene, tutto funzionava a meraviglia.
Passo successivo: ho provato ad inserire il sub_report nella cartella report della mia web application. Passando qualsiasi parametro possibile (.//, //, ./, /, /report/, context.getResourceAsStream(rptFolder) e molti altri) non c'è modo di far vedere la corretta ubicazione del subreport. Per maggior chiarezza copio sotto la servlet e formulo il quesito:
Quale parametro passare al main report affinché veda un sub report collocato nella sua stessa cartella?
Ecco il frammento della servlet
codice:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String rptFileName = request.getParameter("rptFileName").toString();
String rptFolder = "/report/";
JasperPrint jp2 = null;
ServletContext context = this.getServletContext();
Map parameters = new HashMap();
//nota bene! con il percorso riportato nella riga sottostante e mettendo lì il jasper del subreport tutto funziona bene!
//parameters.put("SUBREPORT_DIR", "C:/temp/miaprova/");
//questo invece è il mio tentativo di fargli vedere il subreport collocandolo nella stessa cartella del report principale
parameters.put("SUBREPORT_DIR", ".//");
String cnHost = "localhost";
String cnName = "testdb";
String cnLogin = "testuser";
String cnPsw = "testpsw";
Connection Conn = null;
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();
}
try {
jp2 = JasperFillManager.fillReport(context.getResourceAsStream(rptFolder + "prova2" + ".jasper"), parameters, Conn);
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ServletOutputStream outStream = response.getOutputStream();
try {
JasperExportManager.exportReportToPdfStream(jp2, outStream);
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}