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