Implementare il design pattern MVC in Java con le servlet – 3a parte

Java
In questo articolo vedremo come processare e validare i form con il nostro mini-framework MVC. Per il codice e la configurazione vi rimandiamo alla prima e seconda parte.

Processamento dei form

La gestione dei form è sicuramente la più importante funzionalità di una web application, in effetti è ciò che distingue un sito statico da un’applicazione vera e propria. In genere le fasi di elaborazione sono le seguenti:

  • all’utente viene presentata una pagina con un form. Questa pagina viene spesso indicata come form view;
  • l’utente inserisce dei dati e preme un pulsante per l’invio;
  • se ha commesso degli errori nella compilazione il form gli viene riproposto, aggiungendo uno o più messaggi d’errore. A questo punto l’utente re-invia il form;
  • se i dati sono corretti l’applicazione continua il suo flusso di lavoro, che può essere una nuova pagina, lo stesso form, un file da scaricare, e così via.

Realizzazione del controller

Questo è il codice del controller:

package it.artera.webtut.mvc;

import java.util.*;

import javax.servlet.http.*;

public class HelloController implements Controller {

  private String formView    = "/WEB-INF/pages/helloForm.jsp";
  private String successView = "/WEB-INF/pages/helloSuccess.jsp";

  public String action(HttpServletRequest request, HttpServletResponse response) {

    String viewName = formView;

    // se il form  stato inviato il metodo HTTP  POST
    if ("POST".equalsIgnoreCase(request.getMethod())) {
      // validazione dei dati
      String name = request.getParameter("name");
      String age = request.getParameter("age");

      List<String> errors = new ArrayList<String>();
      // controlla campi obbligatori
      if (name == null || name.trim().length() == 0) {
        errors.add("\"Nome\"  un campo obbligatorio");
      }
      if (age == null || age.trim().length() == 0) {
        errors.add("\"Eta'\"  un campo obbligatorio");
      }

      // se non ci sono stati errori...
      if (errors.size() == 0) {
        // ... mostra la pagina di destinazione
        viewName = successView;
      } else {
        request.setAttribute("errors", errors);
      }

    }

    return viewName;
  }

}

Il suo funzionamento è molto semplice:

  • quando viene eseguita una richiesta HTTP GET al client viene inviata la pagina con il form da compilare;
  • a fronte di una POST, ovvero il submit di un form, il controller valida l’input e agisce di conseguenza.

Il form

La pagina JSP che ospita il form è /WEB-INF/pages/helloForm.jsp, il cui codice è:

<html xmlns="http://www.w3.org/1999/xhtml">
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<head>
  <title>helloForm.jsp</title>
</head>
<body>

<c:if test="${! empty(errors)}">
  <h4>Correggere questi errori</h4>
  <ul>
    <c:forEach items="${errors}" var="msg">
      <li>${fn:escapeXml(msg)}</li>
    </c:forEach>
  </ul>
</c:if>

<form action="hello.do" method="post">
  <p>
    <label for="name">Nome</label>
    <input id="name" name="name" value="${param.name}" />
  </p>
  <p>
    <label for="age">Et</label>
    <input id="age" name="age" value="${param.age}" />
  </p>
  <button type="submit">Invia</button>
</form>

</body>
</html>

La pagina finale, ovvero quella che verrà mostrata dopo il submit del form, è /WEB-INF/pages/helloSuccess.jsp, il cui contenuto (per gli scopi dell’articolo) è ininfluente.

Test

Ora è possibile testare il nostro controller, è sufficiente aprire la “pagina virtuale” /hello.do sulla nostra applicazione, per vedere un form con i campi Nome ed Età vuoti. Se proviamo ad inviarlo senza compilare uno dei due campi, la pagina ci restituirà una lista degli errori da correggere.

Linkografia