1. COME UTILIZZARE FLASH VIEWER DI JASPERREPORTS
<DOWNLOAD E CONFIGURAZIONE>
1) Download del componente jasperreports-flash: jasperreports-flash-4.0.0.swf
Questo mostra il report all'utente.
-------------------------------------------------------------------------------------------------------------------------http://sourceforge.net/projects/jasperreports/files/
-------------------------------------------------------------------------------------------------------------------------2) Configuarazione del file web xml: Registrare la servlet Xml4SwfServlet.
Questa sarà
la sorgente dati per il componente flash del punto 1)
-------------------------------------------------------------------------------------------------------------------------<servlet>
<description>Necessaria per l'anteprima dei report</description>
<servlet-name>Xml4SwfServlet</servlet-name>
<servletclass>net.sf.jasperreports.j2ee.servlets.Xml4SwfServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Xml4SwfServlet</servlet-name>
<url-pattern>/servlets/xml4swf</url-pattern>
</servlet-mapping>
-------------------------------------------------------------------------------------------------------------------------3) Creare la pagina da utilizzare per l'anteprima. Creare un file preview.html
(il nome può
essere qualunque e con l'estensione che fa comodo: php, jsp, ...). Con il
contenuto riportato
di seguito. Salvarlo, ad esempio, nello stesso livello di web-inf.
(N.B. Assicurarsi che il parametro FlashVars contenga il percorso corretto
per la servlet)
-------------------------------------------------------------------------------------------------------------------------<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Preview</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<wicket:extend>
<CENTER>
<TABLE style="WIDTH: 100%; " cellSpacing="0" cellPadding="0" border="0">
<TR>
<TD align="center">
<object width="750px" height="800px">
<param name="movie" value="jasperreports-flash-4.0.0.swf"/>
<embed src="resources/jasperreports-flash-4.0.0.swf"
FlashVars="jrpxml=servlets/xml4swf?&fetchSize=3"
width="750px" height="800px">
</embed>
</object>
</TD>
</TR>
</TABLE>
2. </CENTER>
</wicket:extend>
</body>
</html>
-------------------------------------------------------------------------------------------------------------------------4) Nella stessa cartella della pagina del punto 3) copiare il file
jasperreports-flash-4.0.0.swf.
Ovviamente può essere messo anche in un'altra cartella ma bisogna modifiare
il percorso nella
pagina del punto 3).
</DOWNLOAD E CONFIGURAZIONE>
<USO>
L'esempio seguente mostra come avviare l'anteprima mediante servlet. E' facile
estrapolare il funzionamento anche
per atri framework come jsp, jsf, wicket, ...
-------------------------------------------------------------------------------------------------------------------------@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.doGet(req, resp);
// Elabora parametri passati (querystring)
...
// Riempire il report
JasperPrint print= ...;
// Recupera la sessione
Session session=req.getSession();
// Salva l'oggetto print nella sessione. Questo sarà utilzzato dalla
servlet Xml4SwfServlet
// per restituire il contenuto al client jasperreports-flash-4.0.0.swf.
session.setAttribute(BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,
print);
// Visualizza l'anteprima
RequestDispatcher dispatcher=req.getRequestDispatcher("/preview.html");
dispatcher.forward(req, resp);
}
-------------------------------------------------------------------------------------------------------------------------</USO>
<RIEPILOGO DEL FUNZIONAMENTO>
1) Una servlet o una pagina jsp (o altro) Creano il file JasperPring e lo
assegnano alla
sessione con:
session.setAttribute(BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,
print);
2) La servlet (o anche un'altra pagina) visualizza la pagina preview.html
3) Il componente jasperreports-flash-4.0.0.swf esegue una richiesta alla servlet
Xml4SwfServlet.
4) La servlet Xml4SwfServlet crea un file jrpxml (utilizzando JRXmlExporter) del
file JasperPrint
memorizzato nella sessione e lo restituisce (tramite stream).
3. </RIEPILOGO DEL FUNZIONAMENTO>
<PROBLEMI>
________________________________________________________________________________
________________________________________________________________
IL CLIENT NON VISUALIZZA IL RIQUADRO DEL REPORT:
questo può essere dovuto al fatto che il componete FLASH-PLAYER non è installato
________________________________________________________________________________
________________________________________________________________
IMPEDIRE CACHING PER FLASH VIEWER DI JASPERREPORTS
In effetti con la configurazione suddetta (riportata dalla documentazione
ufficiale) si presenta il
seguente problema: si avvia un report X e successivamente un report Y ma il
viewer mostra ancora il
report X!!!.
Guardando la cache del browser ci si accorge che quando viene fatta una
richiesta da parte del componente
jasperreports-flash-4.0.0.swf il file jrpxml, restituito dalla servlet
Xml4SwfServlet, viene memorizzato
in quest'ultima. Tale file verrà quindi utilizzato anche nelle richieste
successive da parte del componente
flash jasperreports-flash-4.0.0.swf che di conseguenza mostrerà lo stesso
contenuto.
Per ovviare al problema è necessario impedire che la risposta (file jrpxml)
della servlet Xml4SwfServlet
venga memorizzata nella servlet.
Per fare ciò è sufficiente:
1) estendere la servlet net.sf.jasperreports.j2ee.servlets.Xml4SwfServlet come
mostrato di seguito.
2) disabilitarela cache nella risposta
3) Modificare la registrazione della servlet con la nuova: punto 2) in <DOWNLOAD
E CONFIGURAZIONE>
Sostituendo net.sf.jasperreports.j2ee.servlets.Xml4SwfServlet con
com.myapp.servlets.PreviewServlet
-------------------------------------------------------------------------------------------------------------------------package com.myapp.servlets;
import
import
import
import
import
java.io.IOException;
javax.servlet.ServletException;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
net.sf.jasperreports.j2ee.servlets.Xml4SwfServlet;
/**
*
* @author santi caltabiano
*/
public class PreviewServlet extends Xml4SwfServlet{
public PreviewServlet() {
super();
}
@Override
protected long getLastModified(HttpServletRequest req) {
4. //long ret=super.getLastModified(req);
return -1;
}
@Override
public void service(HttpServletRequest request, HttpServletResponse
response) throws IOException, ServletException {
// Questo elemento non deve essere memorizzato nella cache del browser.
Questo impedirà al
// componente jasperreports-flash-x.x.x.x.swf di utilizzare la cache.
Senza tale accorgimento
// Verrà sempre utilizzato lo stesso report anche quando se ne vorrà
visulizzare un altro.
response.setHeader("Cache-Control", "no-store,no-cache,mustrevalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");
super.service(request, response);
}
}
--------------------------------------------------------------------------------------------------------------------------
________________________________________________________________________________
________________________________________________________________
</PROBLEMI>