Írta: tom1964h
Java servlet építése, XML (DD)
Ebben a fejezetben egy Java alkalmazást készítünk el. Ez egy response HTML-oldalt generál le, ha elindítják. Az indítási jelzés az a request, amit a Tomcat servernek küld a böngésző, hogy egy bizonyos oldalt kéri megküldeni. A web.xml gondoskodik arról, hogy erre a kérésre a mi alkalmazásunk generáljon le egy HTML-oldalt. Ez az alkalmazás egy klasszikus html-lapot állít elő, amelyet a body-t soronként egy request objektumba nyomtatja bele, mint egy sornyomtató vagy írógép.
Feladatsor magyarázatokkal
a
C:\Users\user\apache-tomcat-10.0.6\webapps
könyvtárba vegyünk fel egy\TestServlet
könyvtárat, amelyben hozzuk létre a\WEB-INF
és egy\META-INF
alkönyvtárakat (lásd Tomcat-könyvtárszerkezet)a
\WEB-INF
könyvtáron belül vegyük fel a\classes
, a\lib
és az\src
alkönyvtárakata
\src
könyvtárban (ide kerülnek a forrásállományok) vegyük fel a\test
alkönyvtárat (ez lesz a package neve, erre hivatkozunk majd az osztályban is)a
\test
könyvtárban hozzunk létre a TestServlet.java osztályt (parancssorbóltouch TestServlet.java
); javasolt a szerkesztéshez NotePad++ programot használni, de VS-Code vagy a Netbeans is jó erre a feladatraaz NTU tutorial 3.2 pontjából másoljuk be a template-et a TestServlet.java osztályba, majd alakítsuk kicsit át:
- a package -ot javítsuk át test -re
- a javax importokat javítsuk át jakarta importra
ez az osztály kiterjeszti az importált HttpServlet osztályt
- amelynek a .doGet() metódusát felülírja
- a .doGet() metódusnak két paramétere van, a request és a response (a klienstől kap és a kliensnek küld vissza)
- példánkban a visszaadott html-t soronként legyártja, amelyet részben a request objektumból kinyert adatokkal tölti fel (ez csak a kommunikáció demonstrációja), részben saját adatokkal lát el
- beállítja a válasz típusát (MIME-típus):
response.setContentType()
- “kér” egy PrintWriter-t a response-ból:
response.getWriter()
- ezzel a PrintWriter-rel állítja össze a HTML-választ, egy try-catch szerkezetben
- generál egy véletlen-számot, amit szintén berak a válaszba
- a finally ágban lezárja a PrintWriter-t, merthogy le kell zárni
módosítgassunk:
a fülszöveget találjuk ki és írjuk be:
out.println("<title>....</title>");
a címszöveget találjuk ki és írjuk be:
out.println("<h1> ... </h1>");
szúrjuk be az importok végére:
import java.time.LocalDateTime;
szúrjuk be a try-catch szerkezet elé:
LocalDateTime now = LocalDateTime.now();
szúrjuk be a random számot kiíró sor után:
out.println("<br><p>Datum - idö: " + now.toString() + "</p>");
ha készen vagyunk a módosításokkal, akkor le kell fordítani a kódot:
- az elkészített TestServlet.java kódot elmentjük a
..\webapps\TestServlet\WEB-INF\src\test
könyvtárba, mert a package-szerkezetet tartani kell - probléma, hogy a servlet függőség (servlet-api.jar) nincs benne az alap Java-telepítőkészletben, ezért a
..\apache-tomcat-10.0.6\bin
folderből ezt a file-t át kell másolni a JDK könyvtárban találhatóJRE/lib/ext
mappába: C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext - a CLASSPATH-ban szerepelnie kell ennek a könyvtárnak
- nyissunk egy CLI-t (parancssori ablakot) és lépjünk át a
..\webapps\TestServlet\WEB-INF
könyvtárba - fordíttassuk le a javac programmal az elkészült kódot:
javac -d classes src\test\TestServlet.java -encoding "utf-8"
- a fordító a -d paraméterrel megkapja, hova fordítson: a
\classes
könyvtárba - a fordító a src\test\TestServlet.java paraméterrel megkapja, mit fordítson
- a fordító az -encoding “utf-8” paraméterrel megkapja, hogyan fordítson
- az elkészített TestServlet.java kódot elmentjük a
a fordítás után publikálni kell a servletet, erre szolgál a web.xml állomány (Deployment Descriptor), amelyben beparaméterezzük a Tomcat-nek, hogy milyen címre érkező kérésre melyik servletet indítsa el:
- előírja, milyen servlet létezik és mi a belépő osztály
- előírja, melyik címen érhető el a WEB-ről ez a servlet (servlet-mapping):
<servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>test.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/mutasd</url-pattern> </servlet-mapping>
``
- a friss servletünk a http://localhost:8080/TestServlet/mutasd címen érhető el a böngészőnkből
- két lépéses az összekötés:
- mit fog keresni a felhasználó (mit engedünk neki) (URL-pattern)
- melyik servletre irányítsuk, ami melyik package-n belül van
indítsuk el (vagy újra) a Tomcat-servert a CLI-ből:
C:\Program Files\Java\jdk1.8.0_111\bin\startup.bat
hatására a Tomcat nyit egy új ablakot; ha le akarjuk állítani, akkor ebben az ablakban adjuk ki a CTRL-C parancsotböngészőn át keressük fel a TestServlet-et; figyeljük meg, hogy minden frissítésre friss véletlenszámot és friss dátum-időt ad ki a szerver; a megkapott HTML nem létezik, a Java-kód hatására generálódik le: statikusnak tűnik, de valójában dinamikusan generált
ha a TestServlet.java forrásállományba beleírjuk a
finally{...}
rész után, hogy:
System.out.println("Protocol:" + request.getProtocol());
System.out.println("A Random Number:" + Math.random());
System.out.println("Datum-idö:" + now.toString());
Akkor újra-fordítást és szerver-restartot követően minden lekérdezés után a servlet a saját ablakába (azaz a standard output-ra) kiírja a HTTP-ben már kiadott adatokat. De ugyanezeket az adatokat a nyomtatás helyett egy log-állományba is beleírhatja: meg tudjuk tenni, hogy a request-IP-címeket dátum és idő adatokkal együtt egy file-ba (log) írjuk ki: mindig csak hozzá-appendeli a TestServlet alkalmazás, honnan kérték le az oldalt.
a kép forrása draw.io