Í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él | GET method | POST method |
---|---|---|
paraméterek küldése | az URL-címben küldi el | a request-body-ban küldi el |
nyilvánosság | böngésző keresősorában ki vannak írva az adatok | rejtett |
elmenthető? visszakereshető? | igen, könyvjelzőként | nem |
küldött adatok hossza | limitált, kb 3000 karakter | “bármekkora” |
minden adat küldhető? | csak ASCII ! | bármi |
jelszavak, bejelentkezés | nem !! | biztonságosabb |
felhasználás | lekérdezések, Google | adatküldés |
felhasználás | állandó nyilvános adatok | bejelentkezé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
- 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
- a
- ez egy adatbekérő form; ha változtatunk ezen a weblapon, nem kell újra-fordítani, viszont a Tomcat-et újra kell indítani
- a form meghívható:
http://localhost:8080/TestServlet/form_input.html
(az alkalmazás híján csak a form látható) - 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
- 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"
- 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>
- indítsuk el (vagy újra) a Tomcat-servert a CLI-ből
- a webform meghívható:
http://localhost:8080/TestServlet/form_input.html
- 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 - 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