<html>
...
<form action="/article" method="POST">
<div>
<input type="string" name="title" id="name" />
<label for="name">Titolo</label>
</div>
...
</form>
...
Marco Andreini
database connection pooling
data-binding
validazione
notifiche flash
security
l’utilizzo di una connessione JDBC per ciascuna richiesta web può rallentare
si utilizza per questo un pool di connessioni JDBC disponibili per tutta l’applicazione
eventualmente il pool può essere dinamico (min-max)
per ogni nuova richiesta si può prelevare una delle connessioni JDBC libere
se non ce ne sono sarà possibile attendere che se ne liberi una
oppure attivare una nuova connessione al database, se possibile.
Il data binding è il processo di conversione dei dati presenti nelle richieste web (siano GET, POST, …) in parametri dei metodi dei controller
con @RequestMapping e @PathVariable abbiamo già visto un modo per impostare parametri semplici
interi, stringhe, …
si possono impostare anche Bean, quindi più campi, passandoli con una form
<html>
...
<form action="/article" method="POST">
<div>
<input type="string" name="title" id="name" />
<label for="name">Titolo</label>
</div>
...
</form>
...
@Controller
public class Articles {
// ...
@RequestMapping("/article", method=RequestMethod.POST) (1)
public String save(@ModelAttribute Article article, Model model) { (2)
// ...
}
}
1 | si indica che il percorso article è disponibile alle sole HTTP POST |
2 | con @ModelAttribute si indica che i valori della form saranno utilizzati per riempire un article |
Si incentra sulle specifiche Bean Validation (JSR-303 e JSR-349)
Si utilizzano le annotazioni sui campi dei bean per indicare la tipologia di validazione
È indipendente dal framework e dall’application server
I validatori si possono estendere e personalizzare
Ecco un esempio di annotazioni per la validazione:
public class MyEntry {
@NotNull // indica che è obbligatorio
String title;
@Min(1) // indica che il minimo è 1
int age;
@Past // indica che deve essere una data passata
Date date;
}
@Min | Il valore deve essere un intero maggiore o uguale al numero indicato |
@Max | Il valore deve essere un intero minore o uguale al numero indicato |
@Digits | Il valore deve essere un numero in un certo range |
@NotNull | Il valore deve essere diverso da |
@Null | Il valore essere |
@Future | Il valore deve essere una data nel futuro |
@Past | Il valore deve essere una data nel passato |
@Pattern | Il valore deve corrispondere alla regular expression indicata in |
@AssertTrue | il valore deve essere |
@AssertFalse | Il valore deve essere |
@Size | La lunghezza del valore deve corrispondere ai limiti |
Queste annotazioni sono applicabili su:
metodi, per validare i valori restituiti
campi, per validare i bean
parametri, per validare il passaggio di parametri nei metodi
costruttori, analogo al precedente
public class Expirer {
public Expirer(@Min(10) intt days, @Future @NotNull Date expire) { ... }
@AssertTrue
public boolean isValid() { ... }
}
Ottenuto il validatore si può validare un bean direttamente:
public class MyValidation {
public void run() {
ValidationFactory factory = Validation.buildDefaultValidationFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation> violations = validator.validate(myBlogEntry);
// ...
}
}
Il risultato è l’elenco delle violazioni della myBlogEntry
.
Il validator
si può ottenere via injection dal framework di riferimento:
public class MyClass {
@Resource
Validator validator;
}
Si possono annotare per la validazione i campi delle entity JPA
public class Person extends BaseEntity {
@NotNull // obbligatorio
@Size(min=2) // i nomi devono avere almeno 2 caratteri
@Column(nullable=false)
private String firstname;
@NotNull // obblligatorio
@Size(min=2) // i cognomi devono avere almeno 2 caratteri
@Column(nullable=false)
private String lastname;
//...
}
I framework JPA prima di persistere l’oggetto, solitamente, applicano la validazione.
@Controller
public class Articles {
@RequestMapping("/article", method=RequestMethod.POST)
public String save(@Valid Article article, (1)
BindingResult bindingResult, (2)
Model model) {
if (bindingResult.hasErrors()) { (3)
model.addAttribute("article", article);
return "article"; (4)
}
// ... save
return "redirect:/"; (5)
}
}
1 | indica che article deve essere validato |
2 | contiene i risultati della validazione |
3 | si può controllare se article è valido |
4 | se ci sono errori, si restituisce la form da correggere |
5 | dopo la POST corretta, si fa redirect all’elenco. |
È un framework potente e particolarmente personalizzabile per:
l’autenticazione
il controllo degli accessi
è lo standard per le applicazioni basate su Spring Framework
è impostabile come modulo aggiuntivo su Spring Boot
occorre soltanto aggiungere il modulo spring-boot-starter-security
Supporta vari sistemi di autenticazione con
HTTP Basic
HTTP Digest
HTTP X.509
Form/Session
inoltre integra tecnologie come LDAP, OpenID, OAuth, … e molti altre.