CodeGym /Java blog /Véletlen /5. rész. Szervletek és a Java Servlet API. Egyszerű webal...
John Squirrels
Szint
San Francisco

5. rész. Szervletek és a Java Servlet API. Egyszerű webalkalmazás írása

Megjelent a csoportban
Ez az anyag a "Bevezetés a vállalkozásfejlesztésbe" sorozat része. Korábbi cikkek: 5. rész. Szervletek és a Java Servlet API.  Egyszerű webes alkalmazás írása - 1Tudja már, hogyan kell olyan Java-alkalmazásokat írni, amelyek szöveget jelenítenek meg a konzolon, de még mindig nem igazán tudja, hogyan kell elkészíteni első webes alkalmazását? Remek, érezd jól magad. Ebben a cikkben megismerkedünk a szervletekkel, és írunk egy alkalmazást, amellyel eldicsekedhet barátainak anélkül, hogy JAR-fájlt küldene nekik, és nem kényszeríti őket a Java letöltésére. Írjunk egy egyszerű webes alkalmazást . Ha még nem ismeri a webfejlesztésben használt megközelítéseket, azt javaslom, hogy kezdje el a „ Bevezetés a vállalatfejlesztésbe ” sorozat első cikkének elolvasásával.

Mi az a servlet?

Először is nézzük meg, mik azok a szervletek, és miért hallunk róluk olyan gyakran. A Java Servlet API egy szabványos API, amelyet a szerveren valósítanak meg. Egy kérés-válasz séma szerint kommunikál az ügyfelekkel. A szervlet egy olyan osztály, amely kéréseket fogadhat az ügyfelektől, és válaszokat küldhet az ügyfélnek. Valójában a szervletek pontosan azok az építőelemek, amelyeket a kliens-szerver architektúra Java nyelven történő létrehozásához használunk. Talán emlékszel arra, hogy a sorozat egy másik cikkében már beszéltünk erről az építészetről. Nem fogunk vergődni: azonnal írjunk valami kódot.

Mire van szüksége egy webes alkalmazás létrehozásához

A Java szervletekkel való munkavégzés legnagyobb kényelme érdekében IntelliJ IDEA Ultimate Edition szükséges. Ez egy fizetős termék, de aktiválhat egy 30 napos próbaverziót, vagy használhatja a korai hozzáférésű verziót, amely mindig ingyenes. Telepítse továbbá az Apache Tomcat alkalmazásunk szerverét. A Tomcat egy szervlet konténer: feldolgozza a bejövő kéréseket és továbbítja azokat az alkalmazásunknak. Töltse le a Tomcat programot innen .

Készítsük el az első webes alkalmazásunkat

Ha minden készen áll, hozzon létre egy Maven projektet. Ha nem ismeri a Maven-t, vessen egy pillantást az előző cikkre . Kezdjük!
  1. A pom.xml fájlban adjon hozzá egy javax.servlet-api függőséget, és adja meg a WAR-csomagolást:

    
    <?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>
    

    Egyszerű szervlet osztály:

    
    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. Az alkalmazás futtatásához létre kell hoznia egy Tomcat konfigurációt:

    5. rész. Szervletek és a Java Servlet API.  Egyszerű webes alkalmazás írása - 25. rész. Szervletek és a Java Servlet API.  Egyszerű webes alkalmazás írása - 3

  3. Ezután jelezzük, hogy a Tomcat melyik verzióját fogjuk használni, valamint az URL-t és a portot a szerverrel való kommunikációhoz. Valami ilyesmi kellene:

    5. rész. Szervletek és a Java Servlet API.  Egyszerű webes alkalmazás írása - 4
  4. Most már csak meg kell adnunk azt a mellékterméket (az összeállított projektet egy JAR archívumban), amelyet a tárolóban telepíteni fogunk. Kattintson a Javítás gombra, és válassza ki a war exploded lehetőséget : ez azt jelenti, hogy a projekt újraépítése után a műtermék automatikusan a szervlet tárolójába kerül. 5. rész. Szervletek és a Java Servlet API.  Egyszerű webes alkalmazás írása - 5

  5. Az alkalmazáskörnyezet alapértelmezett értéke servlets_war_exploded . Ez azt jelenti, hogy az alkalmazást a következő címen érjük el: http://localhost:8080/servlets_war_exploded .

    Miért kérnénk extra szöveget? Töröljük, ami felesleges. Most a webalkalmazásunk címe: http://localhost:8080 .

    5. rész. Szervletek és a Java Servlet API.  Egyszerű webes alkalmazás írása - 6
  6. Kattintson az OK gombra. Látjuk, hogy most már elindíthatjuk az alkalmazást:

    5. rész. Szervletek és a Java Servlet API.  Egyszerű webalkalmazás írása - 7

    Most, amikor megnyitja az alkalmazást a böngészőben, 404-es hibaüzenetet kell kapnia. Ez logikus, mert a http://localhost:8080/ címhez szükség van egy servletre, amely a "/"-re van leképezve, de az egyetlen szervlet a "/hello" -ra van leképezve .

  7. A http://localhost:8080/hello címen érhetjük el . Ha ezt megtesszük, megkapjuk a várt választ – a „Hello” karakterláncot!

Ha minden működik, elemezzük a kódot. Ha egy átlagos osztályból HTTP-servletet szeretne létrehozni , annak örökölnie kell a HttpServlet osztályt. Az osztálydeklaráció felett a megjegyzést jelöljük @WebServlet(). Itt kötjük (vagy leképezzük) a servletet egy adott útvonalhoz ("/hello"). Ez a megjegyzés csak a Java Servlet API 3.0-ban jelent meg, így az interneten számos példa van arra, hogy a szervlet-leképezés XML-fájlon keresztül történik. Erre már nincs szükség. A GET kérések kezeléséhez felülírjuk a doGet()metódust. Ügyeljen a módszer paramétereire: HttpServletRequestés HttpServletResponse. Az HttpServletRequestobjektum minden szükséges információt megad számunkra a kéréssel kapcsolatban. A -ban HttpServletResponsemegírjuk a válaszunkat, és beállítjuk a szükséges fejléceket.

Munka paraméterekkel és munkamenettel

Javítsuk ki a servletünket, hogy képes legyen feldolgozni a kérésparamétereket és működjön együtt egy munkamenettel:

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();
   }
}
Most a servlet munkamenettel működik, növelve visitCounteraz oldal minden egyes látogatásának értékét. Ha az visitCounterattribútum még nem jött létre (az oldal első látogatásakor), a getAttribute()metódus nullát ad vissza, ezért ellenőriznünk kell a nullát. Ugyanez vonatkozik a kérési paraméterekre is. Ha a felhasználó nem adja át a felhasználónév paramétert, akkor annak értéke null lesz. Ebben az esetben anonim látogatóként köszöntjük a felhasználót. Paraméter átadásához egy GET-kérésben egy lekérdezési karakterláncot használnak. Például használhatjuk a következő URL-t: http:// localhost:8080/hello? Felhasználónév=Paul. A HTTP-kérésekről az előző cikkben olvashat bővebbensorozatban. Alkalmazásunk jelenleg nem sok logikával rendelkezik, de kicsit bosszantó, hogy 404-es hibát kapunk a gyökérútvonalon. Ennek kijavításához létrehozunk egy másik szervletet, és leképezzük a kezdőlapra: @WebServlet("/"). Ennek a szervletnek az a célja, hogy a kéréseket a „/hello” elérési útra irányítsa. Ennek két módja van: a "továbbítás" vagy az "átirányítás" használatával. Talán érdemes megérteni a köztük lévő különbséget. A továbbítás átruházza a kérés feldolgozását egy másik szervletre a kiszolgálón. Az ügyfél nem érintett. Ehhez adja hozzá a következő kódot az új szervlet doGet() metódusához:

getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Ebben a kódban elérjük a servlet kontextust, lekérjük a vonatkozó servlet kérés diszpécserét, és megkérjük egy adott kérés feldolgozására a megadott argumentumokkal (req, ill.). Az átirányítás visszaküldi az ügyfélnek azt a címet, amelyet az ügyfélnek a kérésének feldolgozásához használnia kell. A legtöbb böngésző automatikusan a visszaadott URL-re navigál. Az átirányítás megvalósításához hozzá kell adnia ezt a kódot:

resp.sendRedirect(req.getContextPath() + "/hello");
Meghívjuk a paraméteren redirect()szereplő metódust HttpServletResponse, és átadjuk neki azt a címet, amelyet az ügyfélnek használnia kell. Itt van egy fontos részlet: a HTTP paramétereket is hozzá kell adni a teljes átirányítási útvonal végéhez, ami nem túl kényelmes. A mi helyzetünkben előnyösebb a használata forward, de néha redirectjobb a használata. Ha megérti a különbséget a működésükben, akkor nem fog rosszul választani. Az új szervlet kódja így néz ki:

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

Összegzés

Elkészült az első webes alkalmazásod. A következő cikkből megtudhatja, hogyan telepítheti az IntelliJ IDEA használata nélkül. Írtunk egy alkalmazást, amely csak a GET kéréseket dolgozza fel. A többi HTTP metódust is hasonló módon kezeljük – a szülőosztály megfelelő metódusainak felülbírálásával. Az ehhez hasonló egyszerű szervleteket kifinomult, sokoldalú webalkalmazások készítésére használhatja. Természetesen a nagy keretek, például a tavasz használata ezt sokkal könnyebbé teszi. De ha valóban mélyebben szeretne elmélyülni a servletek összes lehetőségében, akkor elolvashatja a hivatalos specifikációt . 6. rész. Szervlet-tárolók 7. rész: Az MVC (Model-View-Controller) minta bemutatása
Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION