Un piccolo tutorial MVC

Il terzo capitolo di Head First - Servlets and JSP edito dalla O'Reilly, é dedicato alla creazione di una piccola web application usando il pattern MVC.

L'applicazione ha lo scopo di fornire suggerimenti su quale birra scegliere, usa:
  • BeerExpert.java (un POJO che fa da Model);
  • beerForm.html e result.jsp (View);
  • una servlet (Controller).
Le componenti suddette interagiscono tra loro in questo modo:
  • l'utente richiede l'accesso alla pagina web beerForm.html;
  • il container reperisce la risorsa;
  • il container rende disponibile beerForm.html all'utente;
  • l'utente specifica le informazioni richieste quindi genera una request per il container;
  • il container determina quale servlet richiamare e le passa la request;
  • la servler chiama BeerExpert per determinare la risposta;
  • la servlet aggiunge il risultato ottenuto da BeerExpert alla request;
  • la servlet inoltra le request a result.jsp;
  • la JSP legge la risposta dalla request;
  • la JSP genera una pagina che passa al container;
  • il container ritorna la pagina all'utente.
Per la creazione dell'ambiente di sviluppo utilizzo Netbeans, per il rilascio su Tomcat uso le funzionalità amministrative di Tomcat che permettono di fare il deploy di una web application (in formato WAR) con estrema semplicità.

Continuo a lavorare sullo stesso progetto creato nel capitolo precedente, HeadFirstWeb.

Iniziamo da beerForm.html, una pagina che contiene un form che richiama, via POST, la servlet SelectBeer.do, che creeremo in seguito. L'unico attributo che possiamo variare é il colore della birra, i cui possibili valori sono presentati in un menù a tendina:
<html>
<head>
<title>Beer selector</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>Beer Selection Page</h1>
<form method="POST" action="SelectBeer.do">
Select beer color:
<select name="color">
<option value="light">light</option>
<option value="amber">amber</option>
<option value="brown">brown</option>
<option value="dark">dark</option>
</select>
<p><input type="SUBMIT"></p>
</form>
</body>
</html>
Facciamo il test la pagina, modificando leggermente il layout secondo il gusto personale. Evidentemente se clicchiamo sul bottone otteremo un messaggio di errore che ci dice che la risorsa che abbiamo richiesto non é disponibile.

Pensiamo ora alla servlet. Decidiamo di darle il nome interno BeerSelector, di mettere il file che la implementa nel package hf.beer con nome BeerSelect.java. L'URL utilizzato dall'utente per accederla é, come abbiamo già visto, SelectBeer.do.

Creo dunque la servlet hf.beer.BeerSelect.java e specifico i nomi come indicato sopra a Netbeans che mi aggiorna il DD, web.xml, in questo modo:
<web-app ...>
...
<servlet>
<servlet-name>BeerSelector</servlet-name>
<servlet-class>hf.beer.BeerSelect</servlet-class>
</servlet>
...
<servlet-mapping>
<servlet-name>BeerSelector</servlet-name>
<url-pattern>/SelectBeer.do</url-pattern>
</servlet-mapping>
</web-app>
Faccio un nuovo test del progetto, e verifico che ora cliccare sul bottone non mi dà un errore ma mi visualizza una pagina bianca. Questo perché l'ho lasciato creare la servlet da Netbeans che mi ha generato il codice di default che non fa nulla.

Dal nome logico al file del servlet:
  • Dalla pagina HTML il browser genera la richiesta di /HeadFirstWeb/SelectBeer.do dove la prima parte del path é la root della Web App e la parte finale é il nome logico della risorsa.
  • Il container cerca nel DD il nome logico della servlet tra gli url-pattern negli elementi servlet-mapping trovando il servlet-name (nome interno).
  • Andiamo a cercarci tra gli elementi servlet quello che ha il servlet-name che abbiamo trovato nel passo precedente.
  • E finalmente troviamo il servlet-class (nome fisico) che viene usato dal container. Se la servlet non é già stata inizializzata la classe viene caricata e la servlet inizializzata.
  • Il container inizia un nuovo thread per gestire la richiesta e passa l'oggetto request al thread.
  • Al termine dell'elaborazione da parte della servlet il container manda la risposta al cliente.
Prima versione della servlet

Modifico il codice di default proposto da Netbeans in questo modo:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Beer Selection Advice</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Got beer color: " + request.getParameter("color") + "</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
Il punto fondamentale é che si usa il metodo getParameter() sulla request per accedere il parametro color passato dall'utente, che viene scritto nella response.

Compilo, faccio il deploy, e adesso cliccando sul bottone possiamo avere un primo feedback positivo.

Nessun commento:

Posta un commento