Programmazione Java Avanzata Struts2 Avanzato Ing. Giuseppe D'Aquì Struts2 Action Method ● ● ● Struts2 permette di definire metodi diversi da execute() per l'esecuzione del codice delle Action Può capitare, infatti, che due operazioni siano molto vicine tra loro e non abbia senso fare una classe per ciascuna Nella definizione xml delle Action possiamo aggiungere l'attributo “method”: ● <action name=”actionSalva” class=”...” method=”salva” /> – Questo fa si che venga chiamato il metodo salva() invece di execute() Action Dynamic Method ● ● Estensione dell'approccio precedente, possiamo assegnare un insieme di metodi all'esecuzione Tramite le wildcards (asterisco) possiamo scrivere espressioni che corrispondano ai metodi da chiamare in caso di esecuzione della Action Action Dynamic Method ● <action name=”miaAction_*” class=”...” method=”{1}”> ● ● ● ● <result … /></action> Quando usiamo l'asterisco intendiamo “tutti i termini” Il simbolo “{1}” indica il termine presente al posto dell'asterisco Esempio: se la nostra url è “/miaAction_salva.action” verrà chiamato il metodo salva() della classe action Struts2 File Upload ● Il default package di Struts2 contiene un interceptor utile per semplificare l'upload di file FileUploadInterceptor Si occupa di intercettare i parametri Http che corrispondono ad upload di file, trasformandoli in oggetti Java più gestibili ● ● ● Si abbina con il tag <s:file> delle viste Struts2 File Upload ● La form deve avere l'attributo enctype=”multipart/form-data” (richiesto da HTML per l'invio di file) Impostato l'attributo, possiamo usare il tag <s:file />, che genera una casella di input con pulsante “sfoglia...” ● ● ● <s:file /> permette due attributi: – name: il nome che verrà usato per passare i dati alla Action – label: Messaggio per l'utente Struts2 File Upload ● ● Il FileUploadInterceptor interviene fornendo tre parametri Supponendo che abbiamo impostato name=”avatar” in <s:file /> della form, avremo: ● ● ● avatar : di tipo File [viene inserito nella Action tramite setAvatar(File file)] avatarContentType: di tipo String avatarFileName: di tipo String, è il nome del file Programmazione Java Avanzata Struts2 e Ajax Ing. Giuseppe D'Aquì AJAX ● AJAX è un acronimo che significa ● ● Asynchronous Javascript And Xml E' un insieme di tecnologie per l'aggiornamento asincrono delle pagine web (ovvero, aggiornamento senza intervenire sullo stato corrente della pagina) 9 AJAX ● Ajax è composto dalle seguenti tecnologie: ● ● ● HTML e CSS per gli aspetti di presentation DOM (Document Object Model, la struttura dati che rappresenta i tag HTML sotto forma di albero) XML per l'interscambio di dati (molto usato anche JSON) ● XmlHttpRequest ● Javascript 10 Javascript ● ● ● A dispetto del nome, c'entra poco e niente con Java È un linguaggio ad oggetti, ma dall'impronta prettamente funzionale È usato per effettuare le varie request asincrone e manipolare il DOM con le risposte 11 Struts2 e Ajax ● ● ● Struts2 ha cambiato più volte la modalità di inserimento di funzionalità ajax Nelle versioni 2.0.x e 2.1.x si sfrutta il Dojo Plugin Nelle ultime versioni (2.2.x), è stato riscritto il supporto ajax 12 Double Select ● ● //doubleselect è un componente composto da due select box, in cui la seconda cambia il suo contenuto a seconda della scelta della prima <s:doubleselect label="doubleselect test1" name="menu" list="{'fruit','other'}" doubleName="dishes" doubleList="top == 'fruit' ? {'apple', 'orange'} : {'monkey', 'chicken'}" /> Datetimepicker ● ● Struts2 (2.1.x) e Dojo Toolkit [ http://dojotoolkit.org/] Per utilizzarli, è necessario impostare all'apertura del JSP la seguente riga: ● <%@ taglib prefix="sx" uri="/struts-dojo-tags" %> ● ● ● //esempio <sx:datetimepicker name="delivery.date" label="Delivery Date" displayFormat="yyyy-MM-dd" /> Autocomplete ● ● //autocompletamento a partire da una lista predefinita <sx:autocompleter name="test" list="{'apple','banana','grape','pear'}" autoComplete="false"/> jQuery ● ● ● È una famosissima libreria Javascript Si basa su concetti molto semplici (come i selettori css) per manipolare l'albero DOM, permettendo di fare query elaborate senza dover scrivere interi algoritmi da zero Ha la possibilità di essere estesa tramite plugin che fanno di tutto (effetti grafici, animazioni, ajax, ecc) 16 Struts2 jQuery ● ● ● Il jQuery plugin permette di sfruttare jQuery per utilizzare tag con comportamento Ajax [ http://code.google.com/p/struts2-jquery/w/list ] Si introduce una nuova taglib “sj” come nel caso di dojo toolkit Struts2 jQuery ● <%@ taglib prefix="s" uri="/struts-tags"%> ● <%@ taglib prefix="sj" uri="/struts-jquery-tags"%> ● <html> ● ● <head> <sj:head/> ● </head> ● <body> ● <div id="div1">Div 1</div> ● <s:url id="ajaxTest" value="/AjaxTest.action"/> ● <sj:a id="link1" href="%{ajaxTest}" targets="div1">Update Content</sj:a> ● ● </body> </html> JSON Result Type ● Implementare una risposta “ajax” in Struts2 prevede l'uso di un result di tipo Stream (Struts2 2.2.x) Ricordiamo che i result di default sono JSP JSON è semplicemente un formato per scrivere oggetti in Javascript sotto forma di stringa (come la serializzazione) ● ● ● { "doubleValue": 10.10, ● "list": ["A", 10, 20.20], ● "array": [10, 20] ● } Struts Ajax Plugin ● ● ● Il JSON restituito non rappresenta una pagina intera, ma spesso una parte di pagina (quella da aggiornare) Dal javascript facciamo una richiesta per avere oggetti di tipo JSON Struts può avere result di tipo JSON usando un plugin apposito (che si chiama Struts Ajax Plugin) Programmazione Java Avanzata Struts2 Advanced Views Ing. Giuseppe D'Aquì Velocity ● Apache Velocity è un motore di templating per Java ● (vedi pattern “Template View”) ● Alternativo a JSP ● Esempio: ● ## Velocity Hello World ● <html><body> ● #set( $foo = "Velocity" ) ● ## followed by ● Hello $foo World! ● </body></html> Velocity ● I “tag” Velocity sono scritti premettendo # ● Esempi: #if( condizione ) ● #set( $variabile = “valore” ) ● #foreach( $array_Collection ) Rispetto al JSP “puro” permettono di inserire funzionalità nell'Html in modo poco invasivo ● ● Struts2 e Velocity ● In Struts2 possiamo avere delle result che usano Velocity al posto di JSP ● Basta installare il Jar di Velocity e configurare un result-type: – ● <result-type name=”velocity” class=”org.apache.struts2.dispatcher.VelocityResult” default=”true” /> Se vogliamo usarlo solo per alcuni result, basta inserire l'attributo type=”velocity” nel tag <result /> Struts2 e Velocity ● Tutti i tag che conosciamo di Struts2 “cambiano forma”, usando lo stile Velocity ● ● ● <s:property value=”...”> diventa: – #sproperty(“value=...”) <s:url> diventa #surl E così via Struts2 Form Token ● ● ● Ogni volta che un utente preme un tasto di invio della form, i dati vengono inviati Se il pulsante viene premuto due volte per sbaglio o perché l'utente è impaziente, viene richiamata la stessa action due volte Questo comportamento in alcuni casi potrebbe provocare grossi danni all'utente, se non gestito ● Ad es. ordini doppi, messaggi duplicati eccetera Struts2 Form Token (2) ● La soluzione è inserire un “id” temporaneo valido per la form corrente (detto “token”), che sia generato per ogni form e che venga accettato solo una volta Il secondo invio arriverà da una form con lo stesso token di una precedente e quindi sarà ignorato Struts2 prevede il tag <s:token /> da inserire dentro le form ● ● ● Questo genera un id temporaneo Struts2 Form Token (3) ● Il controllo del token viene fatto da un interceptor, che non fa parte dello stack di default e quindi deve essere specificato manualmente nelle action che devono controllare il token ● <action … > <interceptor-ref name=”tokenStack” /> – <result … /> – … </action> – ● JFreeChart Plugin ● ● JFreeChart è una libreria Java per la generazione di grafici Esiste un plugin (“struts2-jfreechart-plugin”) che definisce un tipo di result-type (=”chart”) che permette di sfruttare JFreeChart per generare grafici nelle nostre pagine web Programmazione Java Avanzata Altri Framework Ing. Giuseppe D'Aquì Apache Commons ● ● ● Apache Commons è una collezione di librerie “minimali”, che si focalizzano su un certo compito e lo svolgono bene Essendo minimali e non-invasive, possono essere usate con pochi problemi in progetti preesistenti Riguardano operazioni comuni (da qui il nome) che sono spesso presenti in molti progetti ● Invio email, gestione file compressi (zip), uso dei protocolli di rete ecc... Inviare Email ● //Con Apache Commons Email ● Email email = new SimpleEmail(); ● email.setHostName("smtp.gmail.com"); ● email.setSmtpPort(587); ● email.setAuthenticator(new DefaultAuthenticator("username", "password")); ● email.setTLS(true); ● email.setFrom("[email protected]"); ● email.setSubject("TestMail"); ● email.setMsg("This is a test mail ... :-)"); ● email.addTo("[email protected]"); ● email.send(); Eseguire Applicazioni Esterne ● //Con Apache Commons Exec ● String line = "AcroRd32.exe /p /h " + file.getAbsolutePath(); ● CommandLine cmdLine = CommandLine.parse(line); ● DefaultExecutor executor = new DefaultExecutor(); ● int exitValue = executor.execute(cmdLine); Apache Commons ● Altre librerie Commons: ● ● ● ● ● Logging Sanselan (manipolazione immagini) Compress VFS (Virtual File System, permette di accedere a dischi remoti) http://commons.apache.org/components.html Spark ● ● ● ● Spark è un micro web framework È utilizzato per aggiungere funzionalità web senza dover scomodare un Servlet Container o un Application Server Al suo interno c'è sempre un servlet container (Jetty) ma è embedded e parte contemporaneamente all'applicazione Con Spark si associano delle URL (dette Route) a delle funzioni Spark ● public class HelloWorld { public static void main(String[] args) { ● spark.Spark.get(new Route("/hello") { ● ● @Override ● public Object handle(Request request, Response response) { return "Hello World!"; ● } ● }); ● } ● ● } PHP/Java Bridge ● ● ● PHP/Java Bridge è un wrapper per eseguire applicazioni PHP all'interno di un Servlet Container In questo ambiente, l'applicazione PHP può accedere a tutte le librerie Java Viceversa, l'applicazione Java può utilizzare le procedure definite in PHP PHP/Java Bridge PHP/Java Bridge ● ● ● <?php ● require_once("http://localhost:8080/JavaBridge/java/Java.inc"); ● $System = java("java.lang.System"); ● echo $System->getProperties(); ?> L'uso principale è l'integrazione di applicazioni PHP esistenti e testate (come Wordpress, Joomla, ecc.) in siti o applicazioni web scritte in Java HSQLDB ● HSQLDB (conosciuto anche come HyperSQL) è un DBMS scritto interamente in Java ● È molto veloce e possiede un codice compatto ● Implementa SQL:2008 e le transazioni ● Può essere usato in modalità client/server (come gli altri DBMS) oppure embedded HSQLDB embedded ● In modalità embedded mostra tutto il suo potenziale, non essendo necessaria la configurazione di un servizio esterno Il controllo del DBMS può avvenire interamente dall'interno del codice della nostra applicazione Usato come embedded può salvare i dati in due modalità: ● ● ● ● Su file In memoria HSQLDB embedded ● ● Quando si salvano i dati su file, verranno creati file per ogni tabella che creiamo (in pratica il db è una cartella) Quando salviamo i dati in memoria, verranno persi al prossimo riavvio ● Questa modalità è molto potente per salvare dati temporanei in modo molto veloce, vedi caching o testing HSQLDB Database Manager ● ● HSQLDB ha al suo interno un'applicazione per gestire i database e per sperimentare Si lancia con: ● java -cp /path/to/hsqldb.jar org.hsqldb.util.DatabaseManagerSwing GWT ● ● ● Google Web Toolkit è un framework per la scrittura di applicazioni ajax in Java L'obiettivo principale è l'introduzione delle seguenti caratteristiche: ● asynchronous remote procedure calls ● history management ● Bookmarking ● Internationalization ● cross-browser portability Tutto utilizzando gli strumenti classici usati per sviluppare una applicazione Desktop GWT ● ● Abbiamo visto che Ajax è un insieme di tecnologie Uno sviluppatore, per creare una web app Ajax, deve conoscere: Java ● Html ● CSS ● Javascript ● …e tutte le incompatibilità tra i vari browser Mentre per creare una app desktop basta conoscere Java! ● ● GWT ● ● Il principio ispiratore di GWT è scrivere applicazioni web come se fossero desktop Questo risultato viene ottenuto separando il codice Java in due parti ● ● Una parte Server, che non contiene interfaccia, che viene scritta utilizzando Java normalmente Una parte client, sempre in Java, che però viene compilata in un insieme di HTML/CSS/Javascript GWT ● ● Il principio ispiratore di GWT è scrivere applicazioni web come se fossero desktop Questo risultato viene ottenuto separando il codice Java in due parti ● ● Una parte Server, che non contiene interfaccia, che viene scritta utilizzando Java normalmente Una parte client, sempre in Java, che però viene compilata in un insieme di HTML/CSS/Javascript GWT Eclipse GWT Plugin ● Vedi esempio Lucene ● Apache Lucene è una libreria per l'Information Retrieval Motore di ricerca Lucene funziona con qualunque sorgente dati, indipendentemente da: ● ● Formato ● Lingua ● Tipo di Sorgente Basta che sia convertibile in testo ● ● Lucene Lucene ● ● ● Per ricercare su grandi quantità di testo, Lucene crea degli indici di ricerca I dati vengono dapprima convertiti dal loro formato originale a testo puro, tramite parsing Poi vengono analizzati tutti assieme, si crea qualcosa di molto simile all'indice analitico di un libro ● Le parole vengono ordinate insieme ai riferimenti di dove sono state trovate Lucene Lucene ● L'indice può anche essere creato a partire da dati strutturati ● Es: per un libro, vorremmo gestire differentemente il campo “autore” dal campo “titolo” Lucene ● Lucene ha, infine, classi usate per la ricerca ● ● QueryParser Classi che si occupano di analizzare la stringa di ricerca inserita dall'utente, e tradurla nelle opportune query sull'indice creato ● Es di query di ricerca: – Java – Cerca la parola “Java” Java Spring – Cerca i documenti che contengono “Java” oppure “Spring” Java AND Spring – Java* – title:Java ● ● Hibernate e Lucene ● Tra Lucene e gli oggetti c'è lo stesso disadattamento che c'è con i RDBMS Lucene è progettato per lavorare su grandi quantità di testo Il progetto Hibernate Search prova ad eleminare queste problematiche, aggiungendo annotazioni che permettono di segnalare a Lucene gli oggetti da indicizzare ● ● ● Inoltre permette di tradurre le query Lucene in query HQL, permettendo la ricerca full-text