Í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

  1. 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)

  2. a \WEB-INF könyvtáron belül vegyük fel a \classes, a \lib és az \src alkönyvtárakat

  3. a \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)

  4. a \test könyvtárban hozzunk létre a TestServlet.java osztályt (parancssorból touch TestServlet.java); javasolt a szerkesztéshez NotePad++ programot használni, de VS-Code vagy a Netbeans is jó erre a feladatra

  5. az 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
  6. 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
  7. 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>");

  8. 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
  9. 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
  10. 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 parancsot

  11. bö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

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