Upload
others
View
29
Download
0
Embed Size (px)
Citation preview
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ì
9
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)
10
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
11
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
12
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
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"/>
16
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)
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