JavaRush /Java Blog /Random-IT /Parte 5. Servlet, API servlet Java. Scrivere una semplice...

Parte 5. Servlet, API servlet Java. Scrivere una semplice applicazione web

Pubblicato nel gruppo Random-IT
Questo materiale fa parte della serie "Introduzione allo sviluppo aziendale". Articoli precedenti: Parte 5. Servlet, API servlet Java.  Scrivere una semplice applicazione web - 1Sai già come scrivere applicazioni Java che restituiscano testo alla console, ma non sai ancora come creare la tua prima applicazione web? Ottimo, mettiti comodo. In questo articolo faremo conoscenza con le servlet e scriveremo un'applicazione che potrai mostrare ai tuoi amici senza inviare loro un jarnik o costringerli a scaricare Java. Scriviamo un'applicazione web . Se non hai ancora familiarità con gli approcci utilizzati nella programmazione web, ti consiglio di iniziare a leggere dal primo articolo della serie “ Introduzione allo sviluppo aziendale ”.

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!
  1. 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();
       }
    }
  2. Per eseguire l'applicazione è necessario creare una configurazione Tomcat:

    Parte 5. Servlet, API servlet Java.  Scrivere una semplice applicazione web - 2 Parte 5. Servlet, API servlet Java.  Scrivere una semplice applicazione web - 3

  3. Successivamente indichiamo quale versione di Tomcat utilizzeremo, l'URL tramite il quale potremo accedere al server e la porta. Dovresti ottenere qualcosa del genere:

    Parte 5. Servlet, API servlet Java.  Scrivere una semplice applicazione web - 4
  4. 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. Parte 5. Servlet, API servlet Java.  Scrivere una semplice applicazione web - 5

  5. 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 .

    Parte 5. Servlet, API servlet Java.  Scrivere una semplice applicazione web - 6

  6. Fare clic su OK. Vediamo che ora abbiamo l'opportunità di avviare l'applicazione:

    Parte 5. Servlet, API servlet Java.  Scrivere una semplice applicazione web - 7

    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” .

  7. Lo contattiamo all'indirizzo http://localhost:8080/hello e riceviamo la risposta prevista: la stringa "Hello"!

Se tutto funziona, diamo un'occhiata al codice. Per creare un servlet http da una classe normale , è necessario ereditarlo dalla classe HttpServlet. Sopra la classe specifichiamo l'annotazione @WebServlet(), in cui leghiamo (mappiamo) la servlet a un percorso specifico (“/hello”). Questa annotazione è apparsa solo nella Java Servlet API 3.0, quindi ci sono molti esempi su Internet in cui la mappatura del servlet avviene tramite un file XML. Ora questo non è necessario. Per elaborare le richieste GET , sovrascriviamo il metodo doGet(). Presta attenzione agli argomenti del metodo: HttpServletRequest e HttpServletResponse. Dall'oggetto HttpServletRequest possiamo prendere tutte le informazioni necessarie sulla richiesta, in HttpServletResponse possiamo registrare la nostra risposta e impostare le intestazioni necessarie.

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");
   }
}

Linea di fondo

La tua prima applicazione web è pronta. Nel prossimo articolo imparerai come distribuirlo senza utilizzare Intellij IDEA. Abbiamo scritto un'applicazione che elabora solo le richieste GET. I restanti metodi http vengono elaborati allo stesso modo, sovrascrivendo i metodi corrispondenti della classe genitore. Utilizzando servlet così semplici è possibile creare applicazioni Web complesse e ricche. Naturalmente, utilizzando framework di grandi dimensioni come Spring, questo è molto più semplice da fare. Ma se vuoi davvero approfondire tutte le funzionalità delle servlet, puoi leggere le specifiche ufficiali . Parte 6. Contenitori servlet Parte 7. Introduzione al pattern MVC (Model-View-Controller) Parte 8. Scrivere una piccola applicazione in spring-boot
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION