Interfaccia 1.1 Servlet
Oggi iniziamo un nuovo e interessante argomento: i servlet . È stata l'aggiunta di servlet a Java che ha portato Java a diventare lo standard de facto per le applicazioni server di grandi dimensioni. L'80% di tutto il software aziendale nel mondo è scritto in Java. E in Cina, tutto è al 100%. Quindi cosa sono i servlet?
Un servlet è esattamente ciò che trasforma un programma Java in un servizio Web e gli consente di elaborare le richieste dei client. Ed è stato così...
Negli anni '90, subito dopo l'avvento del World Wide Web, sono comparsi web client (browser) e web server. I server Web di solito distribuivano semplicemente il file che avevano memorizzato su Internet: pagine html, script, immagini, ecc.
Ad un certo punto, tutti sono giunti alla conclusione che sarebbe stato necessario rendere entrambe le parti più intelligenti. JavaScript è stato aggiunto alle pagine HTML e ai server sono stati aggiunti plug-in, script speciali che sono stati chiamati in risposta a determinate richieste e hanno reso il comportamento del server più flessibile e intelligente.
Quindi un servlet è un tale plug-in Java che è stato integrato Java web-server
e gli ha permesso di eseguire codice Java quando richiesto per determinate pagine. E già questo codice Java, rappresentato da una classe ereditata dalla classe Servlet, ha fatto ciò che intendevano i suoi sviluppatori.
E come già sai, il server web Java più popolare è Tomcat . Chiamato, tra l'altro, in onore del gatto Tom del cartone animato "Tom e Jerry".
In che modo Tomcat interagisce con i servlet? In effetti, questo processo è standardizzato ed è chiamato ciclo di vita del servlet . In esso, un servlet è un oggetto caricabile e un server Web è un contenitore servlet .
Se il servlet non è stato ancora caricato , allora:
- La classe servlet viene caricata dal contenitore.
- Il contenitore crea un'istanza della classe (oggetto) del servlet.
- Il contenitore chiama un metodo
init()
sull'oggetto servlet. Il metodo viene chiamato solo una volta.
Ciclo di lavoro standard - evasione di una richiesta del cliente :
- Ogni richiesta viene elaborata in un thread separato.
- Il contenitore chiama un metodo
service()
sul servlet e vi passa gli oggetti ServletRequest e ServletResponse. - Per terminare il servlet, viene chiamato un metodo
destroy()
sull'oggetto servlet. Si chiama una sola volta.
Ci possono essere molte ragioni per cui un servlet termina:
- Il programmatore riavvia il server Web, è necessario chiudere con garbo tutti i servlet.
- Il programmatore carica una nuova versione della servlet, quella vecchia deve essere scaricata correttamente.
- E così via.
Ricorda la cosa principale: il server Web e i suoi servlet dovrebbero funzionare senza errori e riavvii per mesi, servendo migliaia di richieste al minuto. Pertanto, il codice sia per il caricamento che per il funzionamento e lo scaricamento di un servlet dovrebbe essere sempre scritto di altissima qualità.
1.2 Classe HttpServlet
La classe Servlet esiste per standardizzare il funzionamento di un servlet e di un contenitore. I programmatori non lavorano direttamente con questa classe. Beh, raramente funzionano. La classe più comunemente usata HttpServlet
è ereditata da Servlet.
Questa classe ha diversi metodi che ci saranno utili. Li userai spesso:
Metodo | Descrizione | |
---|---|---|
1 | init() |
Chiamato una volta quando il servlet viene caricato |
2 | destroy() |
Chiamato una volta quando il servlet viene scaricato |
3 | service(HttpRequest, HttpResponse) |
Chiamato per ogni nuova richiesta al servlet |
4 | doGet(HttpRequest, HttpResponse) |
Chiamato per ogni nuova richiesta GET al servlet |
5 | doPost(HttpRequest, HttpResponse) |
Chiamato per ogni nuova richiesta POST al servlet |
6 | doHead(HttpRequest, HttpResponse) |
Chiamato per ogni nuova richiesta HEAD al servlet |
7 | doDelete(HttpRequest, HttpResponse) |
Chiamato per ogni nuova richiesta DELETE al servlet |
8 | doPut(HttpRequest, HttpResponse) |
Chiamato per ogni nuova richiesta PUT al servlet |
I metodi init()
e destroy()
sono ereditati dalla classe Servlet. Pertanto, se decidi di sovrascriverli nel tuo servlet, dovrai anche chiamare la loro implementazione dalla classe base. Il comando è usato per questo super.method name()
.
Esempio di servlet:
public class FirstHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Getting the parameter “secret” from request
String secret = request.getParameter("secret");
// Put parameter “secret” into Http-session
HttpSession session = request.getSession(true);
session.setAttribute("secret", secret);
// Print HTML as response for browser
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Header</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet example "+ secret +"</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
1.3 metodo di servizio (HttpServletRequest, HttpServletResponse)
Se guardi l'elaborazione di una richiesta client dal punto di vista di un servlet, allora le cose stanno così.
Per ogni richiesta client, il contenitore (server Web) crea HttpServletRequest
e oggetti HttpServletResponse
e quindi chiama un metodo service(HttpServletRequest request, HttpServletResponse response)
sul servlet corrispondente. Questi oggetti gli vengono passati in modo che il metodo possa prendere i dati necessari request
e inserire il risultato del lavoro in response
.
Il metodo service()
ha un'implementazione predefinita. Se non viene ridefinito, verrà eseguito. Questo è quello che fa.
Il metodo service()
determina il tipo di metodo HTTP dalla richiesta (GET, POST, ...) e chiama il metodo corrispondente alla richiesta.
Metodo | Descrizione | |
---|---|---|
1 | service(HttpRequest, HttpResponse) |
Chiamato per ogni nuova richiesta al servlet |
2 | doGet(HttpRequest, HttpResponse) |
Chiamato per ogni nuova richiesta GET al servlet |
3 | doPost(HttpRequest, HttpResponse) |
Chiamato per ogni nuova richiesta POST al servlet |
4 | doHead(HttpRequest, HttpResponse) |
Chiamato per ogni nuova richiesta HEAD al servlet |
5 | doDelete(HttpRequest, HttpResponse) |
Chiamato per ogni nuova richiesta DELETE al servlet |
6 | doPut(HttpRequest, HttpResponse) |
Chiamato per ogni nuova richiesta PUT al servlet |
Nella tua classe, puoi ridefinire un metodo service()
o lasciarlo da solo, ma poi ridefinire i metodi doGet()
, doPost()
, ... secondo necessità.
GO TO FULL VERSION