- sulla rete ;
- sull'architettura del software ;
- sui protocolli HTTP/HTTPS ;
- sulle nozioni di base di Maven .
Cos'è un servlet
Per prima cosa, scopriamo cos'è un servlet e perché ne senti parlare così spesso. L'API Java Servlet è un'API standardizzata progettata per l'implementazione sul server e per funzionare con il client utilizzando uno schema di richiesta-risposta. Una servlet è una classe che può ricevere richieste da un client e restituirgli risposte. Sì, le servlet in Java sono proprio gli elementi con cui è costruita l'architettura client-server. Se ricordi, ne abbiamo già parlato in uno degli articoli della serie. Non giriamo intorno al cespuglio: scriviamo subito un po' di codice.Cosa ti serve per creare un'applicazione web
Per lavorare comodamente con i servlet in Java, avrai bisogno di Intellij IDEA Ultimate Edition. È a pagamento, ma puoi attivare un periodo di prova di 30 giorni o utilizzare la versione ad accesso anticipato: è sempre gratuito. Installa anche il nostro server delle applicazioni: Apache Tomcat. Tomcat è un servlet container: è quello che elabora le richieste in arrivo dall'esterno e le trasmette alla nostra applicazione. Puoi scaricare Tomcat da questo link .Creazione della prima applicazione web
Se tutto è pronto, creiamo un progetto Maven. Se non hai familiarità con Maven, presta attenzione all'articolo precedente . Cominciamo!-
In pom.xml, aggiungi la dipendenza javax.servlet-api e imposta la guerra di packaging:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>servlets</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> </dependencies> </project>
Classe servlet semplice:
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/hello") public class MainServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter printWriter = resp.getWriter(); printWriter.write("Hello!"); printWriter.close(); } }
-
Per eseguire l'applicazione è necessario creare una configurazione Tomcat:
-
Successivamente indichiamo quale versione di Tomcat utilizzeremo, l'URL tramite il quale potremo accedere al server e la porta. Dovresti ottenere qualcosa del genere:
-
Tutto ciò che resta da fare è specificare l'artefatto (il progetto assemblato in un archivio jar), che verrà distribuito nel contenitore. Puoi cliccare sul pulsante Correggi e selezionare guerra esplosa : questo significa che dopo che il progetto sarà ricostruito, l'artefatto verrà automaticamente inserito nel contenitore servlet.
-
Il contesto dell'applicazione è impostato su servlets_war_exploded per impostazione predefinita , il che significa che è necessario accedere all'applicazione all'indirizzo: http://localhost:8080/servlets_war_exploded .
Perché abbiamo bisogno di testo extra? Eliminiamo le cose inutili. Ora l'indirizzo della nostra applicazione è: http://localhost:8080 .
-
Fare clic su OK. Vediamo che ora abbiamo l'opportunità di avviare l'applicazione:
Ora, quando avvii l'applicazione, il browser dovrebbe aprirsi e visualizzare un errore 404. Questo è logico, perché all'indirizzo http://localhost:8080/ dovrebbe esserci una servlet con la mappatura “/”, e la nostra unica servlet ha la mappatura “/hello” .
-
Lo contattiamo all'indirizzo http://localhost:8080/hello e riceviamo la risposta prevista: la stringa "Hello"!
Lavorare con parametri e sessione
Miglioriamo la nostra servlet in modo che possa elaborare i parametri della richiesta e funzionare con la sessione:import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hello")
public class MainServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
Integer visitCounter = (Integer) session.getAttribute("visitCounter");
if (visitCounter == null) {
visitCounter = 1;
} else {
visitCounter++;
}
session.setAttribute("visitCounter", visitCounter);
String username = req.getParameter("username");
resp.setContentType("text/html");
PrintWriter printWriter = resp.getWriter();
if (username == null) {
printWriter.write("Hello, Anonymous" + "<br>");
} else {
printWriter.write("Hello, " + username + "<br>");
}
printWriter.write("Page was visited " + visitCounter + " times.");
printWriter.close();
}
}
Il servlet sta attualmente eseguendo la sessione, incrementando visitCounter ogni volta che la pagina viene visitata. Se l'attributo visitCounter non è stato ancora creato (la prima volta che visiti la pagina), il metodo getAttribute() restituirà null, quindi devi verificare la presenza di null. Lo stesso vale per i parametri della richiesta. Se l'utente non ha passato il parametro nomeutente, il suo valore sarà nullo. In questo caso saluteremo l'utente come anonimo. Per passare un parametro in una richiesta GET, vengono utilizzate le variabili di percorso, ovvero è necessario accedere al collegamento http://localhost:8080/hello?username=Pavel . Puoi leggere ulteriori informazioni sulle richieste http nell'articolo precedente della serie. Ora la nostra applicazione ha una logica minima, ma l'errore 404 nel percorso root è un po' fastidioso. Per risolverlo, creiamo un altro servlet e mappiamolo alla pagina iniziale @WebServlet("/"). Il compito di questo servlet è reindirizzare le richieste al percorso "/hello". Esistono due modi per farlo: utilizzando l'inoltro o il reindirizzamento. Forse vale la pena capire qual è la differenza tra loro. forward : i delegati richiedono l'elaborazione a un altro servlet sul server, il client non è coinvolto. Per fare ciò è necessario aggiungere il seguente codice al metodo doGet() della nuova servlet:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
In questo codice, accediamo al contesto del servlet, otteniamo da esso il gestore delle richieste del servlet desiderato e gli chiediamo di elaborare una richiesta specifica con i parametri specificati (req, resp). reindirizzamento : restituisce al cliente l'indirizzo a cui deve contattare per elaborare la sua richiesta. La maggior parte dei browser accede automaticamente al collegamento trasmesso. Per implementare il reindirizzamento è necessario aggiungere questo codice:
resp.sendRedirect(req.getContextPath() + "/hello");
In HttpServletResponse chiamiamo il metodo redirezione() e gli passiamo l'indirizzo che il client deve contattare. Un dettaglio importante: i parametri http devono essere aggiunti anche alla fine del percorso completo di reindirizzamento, il che non è molto comodo. Nella nostra situazione è preferibile utilizzare forward, ma accade che sia meglio utilizzare il reindirizzamento. Se capisci la differenza nel loro lavoro, non sbaglierai la tua scelta. Il codice per la nuova servlet è simile al seguente:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// getServletContext().getRequestDispatcher("/hello").forward(req, resp);
resp.sendRedirect(req.getContextPath() + "/hello");
}
}
GO TO FULL VERSION