Web Framework (continua)

Marco Andreini

Ancora sul framework

  • database connection pooling

  • data-binding

  • validazione

  • notifiche flash

  • security

Connessioni al database

  1. l’utilizzo di una connessione JDBC per ciascuna richiesta web può rallentare

  2. si utilizza per questo un pool di connessioni JDBC disponibili per tutta l’applicazione

  3. eventualmente il pool può essere dinamico (min-max)

  4. 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.

Data Binding in Spring

  • 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, …​

Form in Spring

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>
 ...

Form in Spring(2)

@Controller
public class Articles {
  // ...

  @RequestMapping("/article", method=RequestMethod.POST)             (1)
  public String save(@ModelAttribute Article article, Model model) { (2)
    // ...
  }
}
1si indica che il percorso article è disponibile alle sole HTTP POST
2con @ModelAttribute si indica che i valori della form saranno utilizzati per riempire un article

Validazione

  • 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

javax.validation

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;
}

Vincoli

@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

Vincoli(2)

@NotNull

Il valore deve essere diverso da null

@Null

Il valore essere null

@Future

Il valore deve essere una data nel futuro

@Past

Il valore deve essere una data nel passato

Vincoli(3)

@Pattern

Il valore deve corrispondere alla regular expression indicata in regexp

@AssertTrue

il valore deve essere true

@AssertFalse

Il valore deve essere false

@Size

La lunghezza del valore deve corrispondere ai limiti min e max indicati

Cosa validare?

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() { ... }
}

Validazione esplicita

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.

Validatore dal framework

Il validator si può ottenere via injection dal framework di riferimento:

public class MyClass {
  @Resource
  Validator validator;
}

Validazione e JPA

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.

Validazione sui parametri web

@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)
  }
}
1indica che article deve essere validato
2contiene i risultati della validazione
3si può controllare se article è valido
4se ci sono errori, si restituisce la form da correggere
5dopo la POST corretta, si fa redirect all’elenco.

Spring Security

  • È 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

Spring Security(2)

  • 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.