Fino a questo momento abbiamo visto come è possibile inserire il codice Java all'interno dei file Jsp per dare dinamicità alle nostre pagine. Gli esempi visti sono molto semplici, ma nella pratica di tutti i giorni il codice da scrivere potrebbe essere molto più lungo e laborioso. Per evitare di riempire le nostre pagine Jsp di centinaia di righe di codice e renderle quindi difficilmente manipolabili, c'è un modo per spostare totalmente sul server la parte di calcolo.
Il concetto è il seguente: quando il browser richiede di visualizzare una pagina Jsp, il server, individuato il file richiesto, interpreta il codice Java contenuto nella pagina ed invia al browser solamente la pagina HTML con il risultato. Allora potremmo spostare il codice in una classe Java e farla semplicemente richiamare dalla pagina Jsp. Cosicché il controllo verrebbe comunque fatto dal server, ma la progettazione risulta più semplice e scalabile.
Per fare questo possiamo mettere a punto delle Servlet ad hoc. Tomcat infatti è un "servlet container" ed una JavaServlet è una particolare applicazione Java che gestisce un flusso HTTP.
Possiamo costruire una servlet scrivendo una classe Java che erediti le caratteristiche della classe HttpServlet. Questa può essere richiamata da una pagina Jsp per effettuare lavori come calcoli, ricerche, elaborazioni di vario genere. In pratica può essere considerata una "estensione" dell'application server. Vediamo come crearne una.
Riprendiamo l'esempio del paragrafo precedente e rivediamolo utilizzando una Servlet che effettui il controllo sulla stringa digitata dall'utente e richiami la pagina corretta.
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class Main extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String categoria = request.getParameter("categoria");
String jspPage = "";
if ( categoria.equals("politica") )
{
jspPage = "pages/politica.jsp";
}
else if ( categoria.equals("finanza") )
{
jspPage = "pages/finanza.jsp";
}
else if ( categoria.equals("sport") )
{
jspPage = "pages/sport.jsp";
}
else
jspPage = "pages/error.jsp";
request.getRequestDispatcher( jspPage ).forward(request,response);
}
}
Come si può vedere la Servlet recupera dalla request il parametro "categoria", che corrisponde al campo input del form della pagina index.html (rimasta invariata rispetto all'esempio precedente) e in base al suo valore richiama una pagina Jsp differente.
Le pagine Jsp vanno raccolte in una cartella pages
. Il comando chiave della classe sopra esposta è
request.getRequestDispatcher( jspPage).forward(request,response);
Tramite questo comando infatti reindirizziamo il browser alla pagina Jsp voluta.
Una volta scritta e compilata bisognerà registrare questa classe come Servlet nella nostra applicazione. Per fare ciò creiamo, nella cartella Hello
della nostra applicazione, una cartella WEB-INF
ed all'interno una cartella classes. Dentro la cartella WEB-INF
andrà creato il file web.xml così fatto:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/Web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>MainServlet</servlet-name>
<servlet-class>Main</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MainServlet</servlet-name>
<url-pattern>/MainUrl</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
</web-app>
Questo file XML permette di registrare la servlet nella nostra applicazione. Da qui impostiamo il nome della servlet (MainServlet
), la classe corrispondente (Main
) e l'Url tramite il quale verrà richiamata dal form nelle pagine Web (MainUrl
).
Dopo aver creato questo file, spostiamo il file Main.class nella cartella WEB-INF/classes
e riavviamo Tomcat. Alla fine la struttra dovrà essere così fatta:
A questo punto non ci resta che riavviare Tomcat ed aprire nuovamente l'applicazione col browser. Quando cliccheremo sul tasto Show, il submit del form richiamerà la servlet Main.class
, questa verrà eseguita ed alla fine verrà richiamata la pagina Jsp corrispondente (error, finanza, politica o sport).