Tutti gli articoli di admin

JASPERREPORTS TUTORIAL – 7 – INTEGRARE IL REPORT IN UNA SERVLET

Nell’articolo di oggi vedremo come rendere disponibile il report all’interno di una web application. Il report sarà aperto invocando una url particolare e reso disponibile direttamente nel browser.

Primo passo: creare la web application.

Per fare questo ci avvaliamo di maven e uno dei suoi archetipi.

Creato il progetto possiamo importarlo in eclipse tramite la direttiva mvn eclipse:eclipse.

Secondo Passo: definire la servlet per l’export

A questo punto dichiaramo la servlet che si preoccuperà di esportare il report in formato pdf. Definiamo nel file web.xml la servlet e l’url pattern che la attiva

Terzo Passo: implementare la funzione di export.

Recuperiamo il file jrxml dal classpath e usiamo il metodo per esportare il report direttamente nell’output stream della response, con l’effetto di aprire il file direttamente nel browser quando invochiamo l’url http://localhost:9000/Report/manager

Qui sono disponibili i sorgenti per provare in locale.

JASPERREPORTS TUTORIAL – 6 – CREIAMO IL NOSTRO REPORT IN JAVA

Nell’articolo di oggi vedremo come generare il nostro report in pdf partendo dal modello generato con Ireport.

Il primo passo è quello di generare il nostro report a partire dal formato jrxml. Per fare questo JasperReports ci mette a disposizione la classe JasperCompileManager

JasperReport jasperReport = JasperCompileManager.compileReport(“reportFromXml.jrxml”);

Tale classe permette di compilare il report e ottenere un file .jasper, lo stesso file che otteniamo quando generiamo l’anteprima con Ireport.

A questo punto resta da riempire il report compilato con i dati che provengono da un datasource. Questo meccanismo viene realizzato dalla classe JasperFillManager

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(), ds );

La classe JasperFillManager mette a disposizione il metodo fillReport che permette di riempire il nostro report tramite una serie di parametri che vengono forniti tramite un oggetto di tipo Map e un datasource di tipo JRDataSource.

L’interfaccia JRDataSource è un’interfaccia che prevede la definizione di 2 metodi: il metodo next che permette di scorrere il datasource e il metodo getField che permette di recuperare la proprietà del bean del datasource.

Nel nostro esempio ho definito una semplice implementazione dell’interfaccia che permette di scorrere un elenco di libri e accedere ad alcune sue proprietà.

Il metodo next permette di scorrere il nostro datasource. Ritorna true se è presente un altro elemento all’interno del datasource, mentre il metodo getFieldValue permette di accedere alla singola proprietà del record.

A questo punto tramite la classe JasperExportManager possiamo estrarre il nostro report nel formato desiderato.

JasperExportManager.exportReportToPdfFile(jasperPrint, “c://Simple_Report.pdf”);

Qui trovate le classi per compilare il progetto

JASPERREPORTS TUTORIAL – 5 – DATASOURCE XML

L’articolo illustra come usare un datasource di tipo xml. Per prima cosa occorre disporre la sorgente dati: in questo usiamo un file xml così definito

A questo punto sfruttiamo il report definito per l’articolo precedente ma creiamo il nuovo datasource di tipo Xml File Datasource e tra le opzioni indichiamo il path del file xml creato e l’utilizzo di XPath per estrarre i dati.

Resta a questo punto da definire i campi e come essi vanno estratti dal file. Per far questo usiamo Xpath, per chi non lo conoscesse esso permette di individuare i nodi all’interno di un documento XML. Le espressioni XPath, a differenza delle espressioni XML, non servono a identificare la struttura di un documento, bensì a localizzarne con precisione i nodi. Ireport offre uno strumento che permette di individuare i nodi senza conoscere la sintassi Xpath. A questo punto non resta che lanciare l’anteprima e ottenere il nostro report.

Scaricate il file jrxml per replicare quanto descritto nell’articolo.

JASPERREPORTS TUTORIAL – 4 – DATASOURCE JDBC

Nell’articolo di oggi vedremo come integrare una sorgente datasource di tipo JDBC nel nostro report. Per prima cosa occorre disporre di una sorgente dati: è possibile utilizzare il database di esempio fornito con Ireport HSQLDB o procurarsi un altra DBMS, Nell’esempio ho usato Mysql fornito con Xampp.

In questo database ho definito lo schema REPORT e in esso ho definito la tabella LIBRI. Ecco lo script per generarlo agevolmente:

Una volta che abbiamo la nostra sorgente dati passiamo alla definizione del nostro Report. Usiamo IReport per generare un report vuoto e come prima operazione definiamo la connection verso il database appena configurato. Come parametri di configurazione usiamo i seguenti dati:

  • JDBC Driver: MySQL (com.mysql.jdbc.Driver)
  • JDBC URL: jdbc:mysql://localhost/report

Tramite la funzione Report Query individuiamo i campi della tabella LIBRI che vogliono mettere nel nostro report. Scegliamo come language l’SQL e definiamo la nostra query:

con cui recuperiamo i campi da visualizzare nel nostro report.

Aggiungiamo un testo statico nella banda Titolo, l’intestazione di colonne nella banda Testata di Colonna e nella banda Detail mettiamo i campi restituiti dalla nostra query.

A questo punto non resta che lanciare l’anteprima e avremo il risultato desiderato.

Per comodità trovate il file jrxml con cui fare subito qualche prova.

JASPERREPORTS TUTORIAL – 3 – STRUTTURA DEL REPORT JRXML

I report JasperReports sono dei file in formato xml, con estensione .jrxml. Nell’articolo precedente abbiamo usato il wizard per generare rapidamente il nostro report, adesso incominceremo ad analizzare la struttura del report.

Analizziamo la struttura base del report, che otteniamo con ireport quando scegliamo di generare un report vuoto.

Analizziamo in dettaglio gli elementi che compongono la struttura del report:

  • l’elemento jasperReport è la root del file xml
  • l’elemento background contiene i dati dello sfondo
  • l’elemento title viene stampato una sola volta all’inizio del report
  • l’elemento pageHeader viene stampato all’inizio di ogni pagina. Consiste nella testata di pagina.
  • l’elemento columnHeader viene stampato all’inizio di ogni pagina che contiene una banda di tipo detail. L’elemento viene stampato in testa ad ogni colonna
  • l’elemento detail viene stampato per ogni record del datasource
  • l’elemento columnFooter viene stampato alla fine di ogni pagina che contiene una banda di tipo detail. L’elemento viene stampato in coda ad ogni colonna.
  • l’elemento pageFooter viene stampato alla fine di ogni pagina. Consiste nel piè di pagina.
  • l’elemento summary viene stampato alla fine del report

L’utente può aggiungere elementi ad ogni sezione per costruire l’aspetto grafico del report.

Inoltre è possibile aggiungere i seguenti elementi per gestire il report:

  • stili (tag style) –> Gli stili intervengono sull’aspetto grafico del report
  • parametri (tag parameter) –> i parametri sono valori che vengono passati al report direttamente dall’utente
  • variabili (tag variable) –> le variabile vengono usate per elaborazioni interne al report
  • campi (tag field) –> i campi vengono estratti dal datasource associato al report

JASPERREPORTS TUTORIAL – 2 – USARE IREPORT

Nell’articolo di oggi creeremo il nostro primo report usando ireport, l’ottimo tool che permette di fare il design del nostro report senza scrivere una riga di codice.

Scaricate il tool dal sito http://jasperforge.org/projects/ireport. Ad oggi l’ultima versione è la 3.7.2.

Una volta installato procediamo alla creazione del nostro primo report, utilizzando il comodo wizard.

  1. Scegliamo il template a noi più congeniale da utilizzare dall’elenco proposto.
  2. Stabiliamo il nome del report e la posizione di salvataggio del file
  3. Scegliamo la sorgente dati da utilizzare. ireport mette a disposizione un database di test da poter sfruttare e per comodità usiamo questa connessione identificando una query sql che recupera i dati dalla tabella ADDRESS dello schema PUBLIC.
  4. Definiamo i campi da far visualizzare nel nostro report e per comodità li scegliamo tutti
  5. Saltiamo la scheda per raggruppare i dati
  6. Clicchiamo su Termina
A questo punto il sistema carica il template definito.
Nella nuova finestra sono visibili le seguenti sezioni:
  1. a sinistra è visibile la sezione report inspector che permette di navigare tra le sezioni del report e i suoi componenti
  2. al centro è presente la finestra di lavoro dove è possibile vedere il report in formato xml e la sua anteprima
  3. a destra è presente la sezione per aggiungere i componenti al report e modificare le loro proprietà
  4. in basso è presente la sezione con i messaggi di errore
Cliccando sul pulsante Anteprima il sistema genera l’anteprima del report all’interno di ireport. In ogni momento è possibile modificare il formato di output desiderato dal menù anteprima (ad esempio il formato pdf).

JASPERREPORTS TUTORIAL – 1 – INTRODUZIONE

JasperReports è un tool per la generazione e gestione dei report in ambiente JAVA. E ‘interamente scritto in Java ed è in grado di utilizzare dati provenienti da qualsiasi tipo di fonte di dati e di produrre documenti che possono essere visualizzati, stampati o esportati in una varietà di formati di documenti, tra cui HTML, PDF, Excel, Word e OpenOffice.

E’ possibile configurare JasperReports in modo da interrogare direttamente la fonte dati JDBC oppure, qualora non si voglia o non si possa interagire direttamente con il database, è possibile definire un Jasper Report DataSource.

Tra le fonti dati supportate le più comuni sono:

  • JDBC Connection
  • File XML
  • Java Bean Collection

Qualora non si volesse configurare un datasource è possibile inviare dei parametri direttamente in formato chiave, valore e generare il report in funzione di essi.

Nei prossimi articoli vedremo come integrare le fonti dati e generare il nostro report nel formato desiderato.

Faremo anche la conoscenza di un ottimo tool ireport, che ci consentirà di concentrarci sul design del report e tralasciare alcuni dettagli implementativi.

SPRING WS – TUTORIAL 10 – USARE LA VERSIONE 2.0

La versione 2.0 di Spring-ws introduce la dipendenza da Spring 3.0 e spinge verso l’uso delle annotation, lasciando il supporto deprecato delle classi che abbiamo imparato a conoscere nei precedenti articoli-

In questo articolo vedremo le nuove feature introdotte da Spring-ws.

Partiamo dalla creazione del progetto, che si avvale dei nuovi archetipi rilasciati da spring-ws e vediamo come creare il solito webservice per la libreria.

Con la direttiva indicata Spring-ws crea la directory libreriaservice

Spostiamoci all’interno della cartella e creaiamo la struttura per il nostro IDE tramite la direttiva mvn eclipse:eclipse. A questo punto possiamo importare il progetto in Eclipse. Come si può notare nel file xml associato al dispatchet spring-servlet.xml è stata esplicitata la dipendenza dalle annotation, tramite il tag <sws:annotation-driven/>

Recuperiamo lo schema xsd che abbiamo creato nei precedenti articoli e lo copiamo sotto la cartella resources.

Definiamo  il bean che si occupa della generazione del wsdl tramite il seguente tag

A questo punto definiamo l’endpoint che si preoccupa di gestire il servizio di Ricerca Libro. Nella definizione degli endpoint si cambia approccio, mentre prima il mapping veniva gestito tramite file xml, adesso tutto è demandato alle annotation:

l’annotazione @Endpoint definisce che una classe è un endpoint

l’annotazione @Autowired definisce il costruttore della costruttore qualora sia necessario fare l’injection di alcuni parametri

l’annotazione @PayloadRoot(localPart = “RicercaLibroRequest”, namespace = “http://finazzo.it/libreria/schema”) definisce la regola di mapping dell’endpoint

Una volta definiti gli endpoint passiamo alla definizione del mapping degli endpoint, tramite la classe PayloadRootAnnotationMethodEndpointMapping

Questa è la classe responsabile di instradare i messaggi verso l’opportuno endpoint in base all’analisi del messaggi soap ricevuti e le regole definite di attivazione definite tramite annotation.

Qui trovate l’archetipo estratto dal progetto appena descritto, in modo da poter provare di persona quanto fatto.

SPRING WS – TUTORIAL 9 – GESTIONE CLIENT

Nell’articolo di oggi vedremo le API che Spring-Ws mette a disposizione per la realizzazione di un client.
Alla base di tutto vi è la classe WebServiceTemplate che offre i metodi per l’invio e la ricezione dei messagi.I messaggi possono essere inviati e ricevuti come puro stream oppure possono essere soggetti al processo di marshalling e unmarshalling.

Occorre prima di tutto definire il nostro client nei file di configurazione di Spring, tramite la solita definizione di bean.

La property defautUrl indica la URL dei servizi da invocare, mentre la messageFactory individua la classe responsabile della generazione dei messaggi da inviare.

Come factory Spring mette a disposizione 2 implementazioni:

  • SaajSoapMessageFactory basata su SAAJ
  • AxiomSoapMessageFactory basata su Axiom

In assenza del valore Spring userà di default l’implementazione basata su SAAJ.

Nei file xml di Spring-Ws setteremo la factory desiderata come

A questo possiamo sfruttare il nostro client per invocare il servizio e gestirne il risultato.

In source è disponibile il messaggio nel formato atteso dal servizio remoto e nella System.out verrà riversato la risposta del server.

Invocazione coclusa con minimo sforzo. A questo punto andrebbe analizzata la risposta per gestire le nuove azioni da intraprendere.

Come ulteriore aiuto Spring-Ws ci da la possibilità di sfruttare le tecniche di marshalling e unmarshalling per ottenere degli oggetti già pronti per l’uso.

Per fare cià occorre valorizzare il marshaller e l’unmarshallere all’interno del nostro client.

Per la defizione del marshaller si rimanda all’articolo dedicato.

Definito il marshaller e l’unmarshaller verrà usato il seguente metodo che restituisce un oggetto valorizzato

dove requestPayload è il bean che descrive la richiesta del sistema opportunamente valorizzata.

Nel caso in cui dobbiate gestire gli header SOAP dovete definire una classe che implementi l’interfacciaWebServiceMessageCallback.

Tale interfaccia definisce il metodo public void doWithMessage(WebServiceMessage message) che consente di modificare il messaggio prima del suo invio al server.

In questo caso invocherete il metodo

SPRING WS – TUTORIAL 8 – AUTENTICAZIONE

Una volta creati i nostri servizi ci preoccuperemo di applicare delle policy di sicurezza al fine impedirne l’utilizzo a utenti non autorizzati

Le policy di sicurezza si basano su 3 aspetti:

  • l’autenticazione
  • la firma
  • la crittografia

Implementando meccanismi di autenticazione si limita l’accesso ad utenti conosciuti dal sistema, con l’utilizzo della firma si certifica un contenuto e con la crittografia si trasforma il flusso di dati in un flusso impossibile da leggere senza l’opportuna chiave.

Nell’articolo di oggi vedremo gli strumenti che offre Spring-ws per gestire l’autenticazione.

Spring-ws mette a disposizione 2 implementazioni dell’interfaccia Interceptor:

  • XwsSecurityInterceptor basato sull’implementazione della SUN XWSS Xml and Web Service Security
  • Wss4jSecurityInterceptor basato sull’implementazione di Apache WSS4J
Per iniziare vedremo il caso di autenticazione più semplice, ovvero quello che prevede di inviare come header della soap un tag chiamato UsernameToken che prevede 2 attributi in chiaro contenenti username e password.
E’ un meccanismo molto semplice da usare che va abbinato ad altre tecniche come la crittografia, visto che l’invio in chiaro dei dati di accesso non è cosa bella.
Scegliamo di usare l’implementazione XwsSecurityInterceptor, che prevede la definizione di un file contenente le policy di sicurezza.
All’interno del file definiamo la regola di sicurezza

Stiamo dicendo al nostro modulo che ogni richiesta per essere accettata deve contenere il token UsernameToken, che la password non deve essere crittografata e che non è richiesto il nonce. Per maggiori dettagli sugli attributi del token Username rimando alle specifiche di SUN. Per informazioni sul Nonce ripassate concetti di crittografia.

A questo punto definiamo l’interceptor e le sue regole

Il nostro interceptor carica le regole da applicare dal file di policy definito precedentemente, mentre con il bean passwordValidationHandler definiamo gli utenti che possono accedere ai nostri servizi, in questo caso username/password Valerio/Finazzo

Qualora nella nostra richiesta non sia presente il token usernameToken il server genera un FAULT specificando l’errore.
Per testare quanto fatto consiglio SoapUi con cui potete creare agevolmente le request e aggiungere gli header per la sicurezza, ottenendo qualcosa del genere

Nel prossimo articolo vedremo tecniche più avanzate per gestire l’autenticazione.