Írta: tom1964h

HTML formból meghívott Java servlet fejlesztése

Ebben a fejezetben egy weblapot és egy Java alkalmazást készítünk el. A weblap egy űrlapot tartalmaz, amely a SEND gomb hatására elküldi az adatokat a szerverünknek és echo néven meghív egy EchoServlet nevű JAVA-alkalmazást. Az echo visszadja ezeket egy generált HTML-ben. Az adatküldés a POST/GET problémát érinti.

Szerver-erőforrások és a HTTP-metódusok

A klienstől a szerver felé küldött HTTP-request első sora mindíg három hivatkozást tartalmaz: METÓDUS ERŐFORRÁS VERZIÓ, ahol:

  • a metódus egy hivatkozás egy HTTP-metódusra
  • az erőforrás egy URL-link (lásd Deployment Descriptor!)
  • a *verzió az verzió (forrás Wikipedia)

Az első sort követi tetszőleges számú további header sor, amelyekben KULCS: ÉRTÉK módon további request-információk érkeznek a szerverhez, pl.: User-Agent (milyen böngészőt használ a kliens), Accept-Charset (milyen karakter-kódolásban várja az adatokat), Accept-Language (milyen nyelven fogadja el a választ), Cache-Control (lehet-e használni chache-elést a válasz visszaküldésében?).

A HTML-lapon az űrlap-adatainak feldolgozása szempontjából a <form> action és a <form> method tag-ek a legfontosabbak:

  • az action leír egy servlet hivatkozást, melyik programot hívja meg a weblap a SEND gomb hatására
  • a method pedig előírja, hogy mindezt hogyan tegye, azaz meghív egy HTTP-metódust.

A HTTP-metódusokat a kliens kéri le a szerverről. Ezek a HEAD, a GET, a POST, a PUT, a DELETE, a TRACE, az OPTIONS és a CONNECT (bővebben lásd Tutorialspoint HTTP methods).

A GET és a POST HTTP-metódusok

Bár hasonló céllal kerültek bevezetésre, jelentős különbség van a két metódus között! Érzékeny adatok bekérésére, kiadására csak a POST metódus használandó!

Használati célGET methodPOST method
paraméterek küldéseaz URL-címben küldi ela request-body-ban küldi el
nyilvánosságböngésző keresősorában ki vannak írva az adatokrejtett
elmenthető? visszakereshető?igen, könyvjelzőkéntnem
küldött adatok hosszalimitált, kb 3000 karakter“bármekkora”
minden adat küldhető?csak ASCII !bármi
jelszavak, bejelentkezésnem !!biztonságosabb
felhasználáslekérdezések, Googleadatküldés
felhasználásállandó nyilvános adatokbejelentkezés

Feladatok

Feladatunk ebben a részben:

  • egy weblap készítése, amely tartalmaz egy http-method hivatkozást
  • a hivatkozásnak megfelelő servlet alkalmazás elkészítése és fordítása
  • a web.xml (Deployment Descriptor) kibővítése az /echo - EchoServlet hivatkozással, hogy az új megoldás kívülről is működjön
  1. töltsük le a projekt GitHub oldaláról az előkészített működő mintát : a form_input.html állományt és mentsük el a ..\webapps\TestServlet\ könyvtárba (azaz a tesztprojektünk gyökér-könyvtárába); ez elérhető a kliens oldaláról; kommentek a form-hoz:
    • a <legend>Personal Particular</legend> címet nyugodtan átírhatjuk, módosíthatjuk
    • a többi elnevezést is módosíthatjuk
    • a form fejlécben a <form method="get" action="echo"> sor: ez mondja meg, mit csináljon az adatokkal és milyen eljárást hívjon meg (action=)
    • a keresett echo akcióhoz készítünk egy EchoServlet.java állományt
    • a HTTP-method alapján a server automatikusan felismeri a feladatot (pl. get vagy post)
    • a formban a rádió-gomb előre be van ikszelve a “male” állapotba
    • a “hidden” típusú form-alkotórészek rejtettek, viszont elküldésre kerülnek ezek is - ezzel rejtett tokeneket lehet küldeni a szervernek, de ezek felhasználhatósága erősen korlátozott
    • a formban minden mezőnek külön neve van!
    • amikor elküldjük a requestet, a szerveren példányosul egy request-objektum, amelynek az attributumaiból ugyanilyen név-hivatkozással lekérdezhetőek a beküldött adatok
    • a szerver (backend) azt vizsgálja, ami “átjön” a beküldött adatokkal; csak kódokat és értékeket vizsgál, azt nem, ami a html-ben a frontendben ki volt írva
  2. ez egy adatbekérő form; ha változtatunk ezen a weblapon, nem kell újra-fordítani, viszont a Tomcat-et újra kell indítani
  3. a form meghívható: http://localhost:8080/TestServlet/form_input.html (az alkalmazás híján csak a form látható)
  4. töltsük le a projekt GitHub oldaláról az előkészített EchoServlet.java mintát és mentsük el a ..\webapps\TestServlet\WEB-INF\src\test könyvtárba (azaz a tesztprojektünk forráskönyvtárába); ez nem elérhető a kliens oldaláról; kommentek az alkalmazáshoz:
    • a “javax” importok átírandók “jakarta”-ra
    • ebben is egy doGet() metódus “dolgozik”
    • beállítandó a MIME-type: response.setContentType(“text/html; charset=UTF-8”);
    • beállítandó a karakter-kódolás: response.setCharacterEncoding(“UTF-8”);
    • minden másban nagyon hasonló a TestServlet megoldásaihoz
    • alapból a bejövő adatokat lekérjük a .getParameter("…") metódussal és string-ekbe adjuk ki
    • a html formban ha a szövegmező megnevezése “username”, azaz amikor itt hivatkozunk rá a .getParameter() metódussal, akkor annak a “username” attibutumot adjuk át
    • a rádió-gomboknak csak a kódolása “jön át”, azaz csak a kódokra vizsgálunk, “m” vagy “p”
    • ha lenyíló menüből választható többes értékről van szó, akkor a .getParameterValues("…") metódussal String[] tömböt kapunk vissza
    • vizsgáljuk a beérkező mezők adat-tartalmát
    • a beküldött paraméterek-neveket a .getParameterNames() metódussal kapjuk vissza egy Enum példányba - ezzel a feldolgozás elején kinyerhető az adatmezők sora, rugalmasabban feldolgozható a request
    • figyeljünk arra, hogy a try-catch-finally szerkezet végén le kell zárni a response-t
    • ha nem .doGet() metódussal hívjuk meg az EchoServlet-et, akkor a .doPost() metódus vissza átirányít a .doGet() metódusba
    • a doPost() metódusba is fel kell venni: request.setCharacterEncoding("UTF-8"); a helyes karakter-kódolás miatt
  5. ha készen vagyunk a módosításokkal, akkor le kell fordítani a kódot a javac programmal javac -d classes src\test\EchoServlet.java -encoding "utf-8"
  6. a Deployment Descriptorba fel kell vennünk az EchoServlet-et is (ki kell ajánlani, azaz publikálni):
<servlet> 
  <servlet-name>EchoServlet</servlet-name>
  <servlet-class>test.EchoServlet</servlet-class>
</servlet>
...
<servlet-mapping>
  <servlet-name>EchoServlet</servlet-name>
  <url-pattern>/echo</url-pattern>
</servlet-mapping>
  1. indítsuk el (vagy újra) a Tomcat-servert a CLI-ből
  2. a webform meghívható: http://localhost:8080/TestServlet/form_input.html
  3. az EchoServlet önállóan is meghívható: http://localhost:8080/TestServlet/echo csakhogy ekkor nem látunk majd semmit, mert az EchoServlet nem kapott érdemi form-adatokat
  4. a böngészőben F12-ben a NETWORK-ben a tételsorra kattintva a HEADERS-ben is ellenőrizhetők a kommunikáció elemei