Utilizzare Jasper Reports – Sviluppo di una web application

In questo articolo vedremo un esempio di integrazione di Jasper Reports con una semplice web application, scritta ovviamente in Java.

Modificare il progetto

Utilizzare Jasper ReportNelle ultime due puntate di questa serie abbiamo creato un progetto completo grazie all’utilizzo del plugin maven-archetype-plugin. Il progetto creato però non ha la struttura di web application, dobbiamo quindi apportare delle modifiche.

Per prima cosa dobbiamo modificare il file pom.xml (la configurazione di Maven): la voce
deve essere modificata da jar (acronimo di Java Archive) a war (Web Application Archive):

<packaging>war</packaging>

Bisogna anche aggiungere le dipendenze relative alle servlet e JSP (Java Server Pages). Per farlo bisogna aggiungere queste righe all’interno dell’elemento :

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId>
  <version>2.3</version>
  <scope>provided</scope>
</dependency>

<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.0</version>
  <scope>provided</scope>
</dependency>

Creare quindi le directory:

src/main/webapp/WEB-INF

e, all’interno di WEB-INF, il file web.xml, con questi contenuti:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Tutorial Jasper Reports - Artera.it</display-name>
</web-app>

L’applicazione

Per il momento ci accontentiamo di una struttura molto semplice che utilizza una pagina HTML e una servlet, ma sappiate che un’applicazione reale avrà bisogno di un’organizzazione ben più strutturata, per poter gestire agevolmente molte maschere di inserimento dati, flussi di lavoro complessi, gestione degli errori, ecc.

Creiamo quindi la pagina HTML:

src/main/webapp/index.html

con questi contenuti:

<html>
<body>
<h1>Jasper Reports Tutorial</h1>
<a href="servlet/reportServlet">Esegui Report</a>
</body>
</html>

Creiamo quindi la classe ReportServlet nel package it.artera.jr:

package it.artera.jr;

import java.io.*;
import java.util.*;

import javax.servlet.ServletException;
import javax.servlet.http.*;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRMapCollectionDataSource;

public class ReportServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // indica al client il tipo di contenuto
        resp.setContentType("application/pdf");

        // carica il report compilato
        InputStream is = getClass().getResourceAsStream("/testReport.jasper");

        // crea una java.util.Collection contenente dei dati
        Collection data = createSampleData();
        // la avvolge in un'implementazione di JRDataSource
        JRMapCollectionDataSource dataSource = new JRMapCollectionDataSource(data);

        try {
            JasperRunManager.runReportToPdfStream(is, resp.getOutputStream(), null, dataSource);
        } catch (JRException jrex) {
            throw new ServletException("Errore generando il report", jrex);
        }
    }

    private Collection createSampleData() {
        Map row;
        Collection data = new ArrayList();

        row = new HashMap();
        row.put("name", "Lorem");
        data.add(row);

        row = new HashMap();
        row.put("name", "Ipsum");
        data.add(row);

        row = new HashMap();
        row.put("name", "Docet");
        data.add(row);

        return data;
    }
}

Il codice di del metodo doGet() è in larga parte copiato dalla classe App, con l’unica differenza che l’output non viene salvato su disco ma viene rediretto sull’output stream della servlet.

L’ultimo passo è la mappatura della servlet in web.xml, per farlo bisogna aggiungere queste righe all’interno di web.xml, prima del tag di chiusura :

<servlet>
  <servlet-name>reportServlet</servlet-name>
  <servlet-class>it.artera.jr.ReportServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>reportServlet</servlet-name>
  <url-pattern>/servlet/reportServlet</url-pattern>
</servlet-mapping>

Deploy & test

Per testare subito la vostra applicazione dovete prima preparare il pacchetto, con il comando:

mvn package

il risultato del build è il file

target/[NOME APPLICAZIONE].war

Rinominate questo file come jasper_tutorial.war e copiatelo nella directory webapps di Tomcat; fate partire il server, e poi andate all’indirizzo http://localhost:8080/jasper_tutorial, dove troverete la pagina iniziale con il link, cliccando sul quale otterrete il report in PDF.

Sviluppi

Ci sono molti modi per servire report tramite web application, noi abbiamo visto una caso molto semplice. Nelle applicazioni reali ci sono sicuramente molte più variabili in gioco: passaggio di parametri, diversi tipi di output, e soprattutto l’utilizzo di ciclo di sviluppo/deploy/debug molto più comodo e veloce.

Linkografia

La serie di articoli su Jasper Reports termina qui, speriamo vi sia stata utile. Se volete proseguire con approfondimenti su Jasper Reports, Maven, Java o qualsiasi altro argomento… fatevi sentire!

Alla prossima,

Dimitri