M.V.C. Pattern - Prof-Matteo-Palitto-Peano/Web-Services GitHub Wiki
MVC è una suddivisione logica del codice che separa la logica del programma, la presentazione dei dati all'utente e la struttura dati. In MVC,
- M sta per Modello (struttura dati)
- V sta per View (Presentazione)
- C sta per controller (logica del programma)
MVC è un modo sistematico di utilizzare l'applicazione in cui il flusso inizia dal livello VIEW, in cui la richiesta viene effettuata, per poi essere elaborata nel livello CONTROLLER(logica), e inviata al livello MODEL per memorizzare i dati e viceversa (i dati contenuti nel MODEL vengono prelevati dal CONTROLLER e inviati al VIEW).
Questo è il blocco di codice che si occupa di gestire i dati.
- È costituito da tutti i dati dell'applicazione (permanenti e non)
- Rappresenta anche lo stato dell'applicazione
- È costituito da classi che hanno la connessione anche all'eventuale database
- Il Model fornisce i dati al Controller, quando richiesti
- Il Model aggiorna la struttura dati quando richiesto dal Controller
Responsabile dell'interfaccia utente dell'applicazione.
- Si occupa di formattare e rendere efficace la comunicazione dei dati all'utente.
- Eventualmente richiede l'inserimento di dati.
Nel caso si parli di Servlet e tecnologie WEB, esso consiste in HTML, JSP, e Javascript.
Viene utilizzato per visualizzare i dati recuperati dal controller che a loro volta recupera i dati dalle classi del Model layer.
Funziona come un "man in the middle" tra View e Model.
- Intercetta tutte le richieste che provengono dal View Layer.
- Esegue la convalida della richiesta e Elabora i dati.
- Accede al Model Layer per memorizzare eventuali dati e/o per richiedere dati per soddisfare la richiesta ricevuta.
- Finalmente inoltra la risposta al Model View per la visualizzazione della risposta.
- Facile da mantenere
- Facile da estendere
- Facile da testare
Un semplice esempio per la realizzazione di un modulo di autenticazione.
Il modulo, generato dal View Layer ,ha due variabili "email" e "password".
Una volta che l'utente inserisce e-mail e password e fa clic su Invia, l'azione/richiesta viene passata al mvc_servlet dove i valori inseriti per e-mail e password vengono ricevuti sotto forma di parametri.
Questo mvc_servlet costituisce il controller.
Qui in mvc_servlet la richiesta viene inviata all'oggetto modelObj che funge da Model layer. I valori di e-mail e password vengono quindi memorizzati per ulteriore uso.
Il controller richiede quindi il valore dell'email e viene inviata al View Layer per generare la schermata di benvenuto.
Il form che richiede l'inserimento dell'email e password
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>MVC Guru Example</title>
</head>
<body>
<form action="Mvc_servlet" method="POST">
Email: <input type="text" name="email">
<br />
Password: <input type="text" name="password" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
Notate che in realta', anche se questo e' un file di tipo JSP, non contiene nessuna istruzione JAVA e quindi potrebbe essere semplicemente un file di tipo HTML.
La richiesta POST viene inviata al Web server quando il tasto SUBMIT viene premuto.
package mvc-example;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Mvc_servlet
*/
public class Mvc_servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
TestModel modelObj = new TestModel();
/**
* @see HttpServlet#HttpServlet()
*/
public Mvc_servlet() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Il Controller riceve i valori di email e password sotto forma di parametri
String email=request.getParameter("email");
String password=request.getParameter("password");
// memorizza i dati ricevuti passandoli al Model
modelObj.setEmail(email);
modelObj.setPassword(password);
//Utilizza il Dispatcher per passare il valore dell'email al View Layer
//aggiungo l'attributo che chiamo modelParam il cui valore e' l'oggetto modelObj
request.setAttribute("modelAttr",modelObj);
//invio la richiesta alla pagina "mvc_success.jsp"
RequestDispatcher rd=request.getRequestDispatcher("mvc_success.jsp");
rd.forward(request, response);
}
}
package mvc-example;
import java.io.Serializable;
public class ModelExample implements Serializable{
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private String email="null";
private String password="null";
}
Nota L'interfaccia Serializable viene comunemente utilizzata dai programmatori Java per creare oggetti persistenti. Normalmente infatti, un oggetto esiste fin tanto che la Java Virtual Machine (JVM) (ovvero la macchina virtuale tramite cui vengono eseguiti i programmi Java) è attiva.
Il meccanismo di persistenza, attivato dalla serializzazione, permette invece di creare oggetti che esistono indipendentemente dal fatto che la JVM sia o meno in esecuzione. In altre parole, il processo di serializzazione consente di salvare in modo permanente (in un file) lo stato di un oggetto in una serie di byte e di poter ricostruire l'oggetto stesso sulla base delle informazioni contenute in quei byte (da cui deriva il nome).
Visto che l'oggetto viene creato nel Mvc_servlet ma poi viene passato e usato nel Mvc_success JSP e' bene garantire la continuita' tra i due programmi della struttura dati rendendo l'oggetto Serializable.
Genera una semplice pagina che da il benvenuto all'utente
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %>
<%@ page import="mvc-example.ModelExample" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Success</title>
</head>
<body>
<%
ModelExample user=(ModelExample)request.getAttribute("modelAttr");
out.print("Welcome, "+user.getEmail());
%>
</body>
</html>