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!-
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(); } }
-
Az alkalmazás futtatásához létre kell hoznia egy Tomcat konfigurációt:
-
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:
-
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.
-
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 .
-
Kattintson az OK gombra. Látjuk, hogy most már elindíthatjuk az alkalmazást:
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 .
-
A http://localhost:8080/hello címen érhetjük el . Ha ezt megtesszük, megkapjuk a várt választ – a „Hello” karakterláncot!
@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 HttpServletRequest
objektum minden szükséges információt megad számunkra a kéréssel kapcsolatban. A -ban HttpServletResponse
megí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 visitCounter
az oldal minden egyes látogatásának értékét. Ha az visitCounter
attribú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 redirect
jobb 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");
}
}
GO TO FULL VERSION