Servlety. Píšeme servlet na špehovanie používateľov sociálnych sietí Vami zadané údaje
Java Servlet je program na strane servera napísaný v programovacom jazyku s rovnakým názvom, ktorý prijíma signály od klienta a odosiela mu odpovede. Je to kľúčový prvok, ktorý popri JSP, EJB, XML a ďalších súvisiacich technológiách tvorí typický Java EE. Aplikácia môže byť zabalená do súboru WAR (Web AR chive) na nasadenie na webovom serveri. Server, ktorý môže spúšťať servlet Java, sa nazýva kontajner. Program, ktorý beží na takomto serveri, dokáže vytvárať dynamické webové stránky.
Základy Java Servlet
Najpopulárnejšie a najpoužívanejšie kontajnery sú Tomcat a JBoss. Technicky je Servlet normálna trieda Java, ktorá má rozšírenie pre Common Client/Server Protocol alebo HTTP. V praxi sa používa na spracovanie požiadaviek prostredníctvom prepisov HttpServlet GET a POST. Kontajner Java Servlet poskytuje Http.ServletRequest a Http.ServletResponse, čo sú objekty typu žiadosť-odpoveď. A zvyčajne sa používa v spojení s JSP na generovanie dynamického obsahu.
Typický modelový scenár:
Filtre servletov Java sú doplnky Java, ktoré sa používajú na zachytenie a spracovanie požiadaviek pred ich odoslaním na servlet a odpoveďou po dokončení jeho kódu a predtým, ako kontajner odošle odpoveď späť klientovi.
Bežné úlohy, ktoré je potrebné vykonať s filtrami:
Filtre sú zahrnuté a nakonfigurované v súbore deskriptora nasadenia (web.xml). Servlety a filtre o sebe nevedia, takže môžete pridať alebo odstrániť filter jednoduchou úpravou web.xml. Je prijateľné mať viacero filtrov pre jeden zdroj alebo reťazové filtre pre web.xml alebo spúšťať filtre Java Servlet implementáciou rozhrania javax.servlet.Filter.
Paralelné požiadavky na server sú spracovávané vláknami, čo poskytuje dôležité vlastnosti webu - multithreading a paralelizmus.
Hlavné funkcie:
Potreba dynamických webových stránok
Existuje mnoho dôvodov, prečo by firma chcela vytvárať dynamické webové stránky za chodu, napríklad keď sa údaje na webovej lokalite často menia. Stránky so správami a počasím sa zvyčajne spoliehajú na CGI, aby udržali obsah čerstvý bez neustálej pozornosti vývojárov. Webové stránky elektronického obchodu, ktoré uvádzajú aktuálne ceny a úrovne zásob, využívajú CGI na získanie tohto obsahu na požiadanie, pričom ho získavajú z internej infraštruktúry spoločnosti.
Mnoho používateľov má skúsenosti s používaním technológie Java na vytváranie webových služieb založených na CGI, ale servlety Java sú efektívnejšie, výkonnejšie, ľahšie sa používajú a sú lacnejšie ako tradičné alternatívy CGI.
Výhody Java servletov:
Servlet je java program, ktorý beží na strane servera webovej aplikácie. Tak ako aplety dynamicky rozširujú funkčnosť webového prehliadača, servlety dynamicky rozširujú funkčnosť webového servera.
práca servlet"a dá sa opísať takto: keď príde požiadavka od klienta, webový server môže určiť, ktorý servlet je potrebné vykonať pomocou špeciálneho konfiguračného súboru. Potom webový server spustí JVM, ktorý následne spustí servlet." Servlet spracuje požiadavku a odovzdá obsah webového servera (prípadne vo forme HTML stránky). Webový server odošle odpoveď (HTML stránku vygenerovanú servletom) klientovi.
WEB server je v podstate druh kontajnera, ktorý sa sťahuje servlet"s, vykoná ich a po prijatí výsledku ich odošle klientovi.
Servlet v architektúre webových aplikácií
Vďaka svojej sile a flexibilite, servlet"s môžu hrať významnú úlohu v architektúre systému. Môžu vykonávať aplikačné úlohy určené pre strednú vrstvu, fungovať ako proxy server pre klienta a dokonca zlepšiť funkčnosť strednej vrstvy pridaním podpory nových protokolov a Ďalšie funkcie Stredná vrstva funguje ako aplikačný server v takzvanom trojvrstvovom systéme klient-server a nachádza sa medzi „ľahkým“ klientom, ako je webový prehliadač, a zdrojom údajov.
Servlet ako proxy
Na podporu apletov môžu servlety fungovať ako ich proxy servery. To môže byť dôležité, pretože bezpečnostný systém Java umožňuje iba appletom pripojiť sa k serveru, z ktorého boli stiahnuté. Ak sa aplet potrebuje pripojiť k databázovému serveru umiestnenému na inom počítači, servlet môže vytvoriť toto pripojenie pre applet.
Dočasné a trvalé servlet"s
Servlety je možné spustiť a zastaviť pre každú požiadavku klienta. Môžu byť spustené aj pri spustení webového servera a existujú, kým sa nezastaví. Dočasné servlet"S sa načítavajú na požiadanie a ponúkajú dobrý spôsob, ako ušetriť prostriedky servera pre zriedka používané funkcie. Trvalé servlety sa načítajú pri spustení webového servera a trvajú, kým sa nezastaví. Servlety sa inštalujú ako trvalé rozšírenia na server, ak náklady na spustenie sú veľmi vysoké (napr. nadviazanie databázového pripojenia), ak ponúkajú trvalú funkčnosť na strane servera (napr. služba RMI), alebo v prípadoch, keď potrebujú čo najrýchlejšie reagovať na požiadavky klientov. Neexistuje žiadny špecifický kód na priradenie servlet ale trvalé alebo dočasné; toto je funkcia nastavenia webového servera.
Životný cyklus servletu, javax.servlet.Servlet
Servlety bežia na platforme webového servera ako súčasť rovnakého procesu ako samotný webový server. Webový server je zodpovedný za inicializáciu, volanie a zničenie každej inštancie servletu. Webový server komunikuje so servletom prostredníctvom jednoduchého rozhrania: javax.servlet.Servlet.
Rozhranie javax.servlet.Servlet obsahuje tri hlavné metódy:
- init()
- služba()
- zničiť ()
a dve pomocné metódy:
- getServletConfig()
- getServletInfo()
Podobnosti medzi rozhraniami servlet"a applet Java je zrejmý. Tak bol navrhnutý! Java servlety sú pre webové servery tým, čím sú aplety pre webové prehliadače. Applet beží vo webovom prehliadači a vykonáva akcie na základe jeho požiadavky cez špeciálne rozhranie. Servlet robí to isté pri práci na webovom serveri.
Inicializácia servletu, metóda init().
Pri prvom načítaní servletu sa zavolá metóda init(). To umožňuje servletu vykonávať akúkoľvek inštalačnú prácu, ako je otváranie súborov alebo vytváranie pripojení k ich serverom. Ak je servlet natrvalo nainštalovaný na serveri, načíta sa pri spustení servera. V opačnom prípade server vyvolá servlet pri prvej požiadavke klienta na vykonanie služby poskytovanej týmto servletom.
Je zaručené, že metóda init() skončí pred akýmkoľvek iným volaním servletu, ako je napríklad volanie metódy služba(). poznač si to init() bude zavolaný iba raz; nezavolá sa, kým sa servlet neuvoľní a potom ho server znova nenačíta.
Metóda init() berie jeden argument - odkaz na objekt ServletConfig, ktorý obsahuje argumenty na inicializáciu servletu. Tento objekt má metódu getServletContext(), ktorý vráti objekt ServletContext A, ktoré obsahuje informácie o prostredí servletu.
Jadro servletu, metóda service().
Metóda služba() je srdcom servletu. Každá požiadavka od klienta vedie k jednému volaniu metódy služba(). Táto metóda prečíta požiadavku a vygeneruje správu s odpoveďou pomocou svojich dvoch argumentov ServletRequest a ServletResponse:
Existujú teda dva spôsoby, ako odovzdať informácie z klienta do servletu. Prvým je odovzdávanie hodnôt v parametroch požiadavky. Hodnoty parametrov je možné vložiť do adresy URL. Druhý spôsob, ako odovzdať informácie z klienta do servletu, je cez InputStream (alebo Reader).
Operácia metódy služba() je v podstate jednoduchý – vytvára odpoveď na každú požiadavku klienta, ktorá mu bola odovzdaná zo servera. Majte však na pamäti, že môže byť súčasne spracovávaných niekoľko paralelných požiadaviek. Ak metóda služba() vyžaduje akékoľvek externé zdroje, ako sú súbory, databázy, potom je potrebné zabezpečiť, aby bol prístup k zdrojom bezpečný pre vlákna.
Uvoľnenie servletu, metóda zničit().
Metóda zničiť () volaný na uvoľnenie všetkých prostriedkov (ako sú otvorené súbory a databázové pripojenia) pred uvoľnením servletu. Táto metóda môže byť prázdna, ak nie je potrebné vykonávať žiadne konečné operácie. Pred volaním metódy zničiť () server čaká buď na dokončenie všetkých servisných operácií, alebo na uplynutie určitého času. To znamená, že metóda zničiť () možno volať počas vykonávania akejkoľvek zdĺhavej metódy služba().
Je dôležité formalizovať metódu zničiť () takým spôsobom, aby sa predišlo uzavretiu potrebných zdrojov až do všetkých hovorov služba() neskončí.
Konfigurácia servletu, metóda getServletConfig().
Metóda getServletConfig() vráti odkaz na objekt, ktorý implementuje rozhranie ServletConfig. Tento objekt poskytuje prístup k informáciám o konfigurácii servletu, t.j. prístup k parametrom inicializácie servletu a objektu kontextu servletu ServletContext, ktorý umožňuje prístup k servletu a jeho prostrediu.
Informácie o servlete, metóda getServletInfo().
Metóda getServletInfo() definované programátorom vytvárajúcim servlet, aby vrátil reťazec obsahujúci informácie o servlete, ako je autor a verzia servletu.
Rozhranie ServletRequest
ServletRequest poskytuje klientovi informácie o parametroch HTTP požiadavky servletu, t.j. poskytuje údaje vrátane názvu a hodnôt parametrov, atribútov a vstupného toku. Tieto informácie sa odovzdávajú metóde služba().
Ďalšie príklad servletu ukazuje, ako získať informácie z parametra žiadosť metóda služba():
čítačka BufferedReader; String param1; String param2; public void service (požiadavka ServletRequest, odpoveď ServletResponse) ( reader = request.getReader(); param1 = request.getParameter("First"); param2 = request.getParameter("Second"); )
Ďalšie informácie o požiadavke má servlet k dispozícii prostredníctvom metód, z ktorých hlavné sú uvedené v nasledujúcej tabuľke:
getAttribute() | Vráti hodnotu zadaného atribútu tejto požiadavky. |
getContentLength() | Veľkosť požiadavky, ak je známa. |
getContentType() | Vráti typ MIME tela požiadavky. |
getInputStream() | Vráti InputStream na čítanie binárnych údajov z tela požiadavky. |
GetParameterNames() | Vráti pole reťazcov s názvami všetkých parametrov. |
getParameterValues() | Vráti pole hodnôt pre zadaný parameter. |
getProtocol() | Vráti protokol a verziu požiadavky ako reťazec formulára |
getReader() | Vráti BufferedReader na prijatie textu z tela požiadavky. |
getRealPath() | Vráti skutočnú cestu pre zadanú virtuálnu cestu. |
getRemoteAddr() | IP adresa klienta, ktorý odoslal túto požiadavku. |
getRemoteHost() | Názov hostiteľa klientskeho počítača, ktorý odoslal požiadavku. |
getScheme() | Vráti schému použitú v adrese URL tejto požiadavky (napríklad https, http, ftp atď.). |
getServerName() | Názov hostiteľa servera, ktorý prijal túto požiadavku. |
getServerPort() | Vráti číslo portu použité na prijatie tejto požiadavky. |
Rozhranie ServletResponse
Rozhranie ServletResponse je nástroj na odosielanie dát klientovi. Všetky metódy tohto nástroja slúžia presne na túto úlohu:
Public java.lang.String getCharacterEncoding() public void setLocale(java.util.Locale loc) public java.util.Locale getLocale()
Prvá metóda vráti typ kódovania MIME (napríklad UTF8), v ktorom budú informácie zobrazené. Druhé dve metódy tiež pracujú so znakovou sadou. Označujú jazyk použitý v dokumente (napríklad ruština).
Verejný ServletOutputStream getOutputStream() vyvolá výnimku java.io.IOException
Metóda getOutputStream vracia výstupný tok pre servlet. Tento prúd sa používa napríklad na výstup binárnych súborov. Textové údaje možno vygenerovať pomocou java.io.Writer:
Verejná java.io.PrintWriter getWriter() vyvolá výnimku java.io.IOException
Metóda getWriter() automaticky konvertuje reťazce na znakovú sadu špecifikovanú v metódach getCharacterEncoding() a getLocale().
public void setLength(int len)
Metóda setContentLength nastavuje hodnotu poľa hlavičky HTTP "Content-Length"
public void setContentType (typ reťazca)
Metóda setContentType sa používa na odoslanie typu obsahu MIME dokumentu. Pole hlavičky HTTP "Content-Type".
Výstupný tok sa ukladá do vyrovnávacej pamäte. To znamená, že časť údajov bude klientovi odoslaná až po naplnení vyrovnávacej pamäte.
public void setBufferSize(int size) public int getBufferSize() public void flushBuffer() vyvolá java.io.IOException public void resetBuffer()
Vyššie uvedené 4 metódy umožňujú nastaviť veľkosť vyrovnávacej pamäte na odosielanie, získať jej veľkosť, inicializovať odosielanie obsahu vyrovnávacej pamäte klientovi bez čakania na jej naplnenie a vymazať túto vyrovnávaciu pamäť z údajov.
Verejná logická hodnota isCommitted()
Pomocou metódy isCommitted môžete získať príznak, či už sa začalo odosielanie údajov klientovi. Príznak bude kladný, ak už bola odoslaná hlavička odpovede HTTP.
public void reset()
Ak hlavička HTTP ešte nebola odoslaná, metóda reset "resetuje" hlavičku HTTP na predvolené hodnoty.
Grafy JFreeChart v servletoch
Grafickú knižnicu JFreeChart možno použiť v servletoch na vytváranie grafov a ich zobrazovanie ako obrázky na webových stránkach. Uvádzajú sa podrobnosti popisu a príklady použitia JFreeChart v servletoch.
Servlet s grafickou knižnicou Chart.js
JNI v Servlet
V niektorých prípadoch možno budete musieť použiť JNI vo webovej aplikácii. Je uvedený príklad použitia JNI v servletoch.
Správy JMS v servlete
Servlet je možné použiť na výmenu JMS správy medzi aplikáciami. Je poskytnutý príklad použitia servletu na odosielanie a čítanie správ JMS v kontajneri JBoss.
Servlety sú programy Java, ktoré bežia na strane servera webovej aplikácie. Tak ako aplety dynamicky rozširujú funkčnosť webového prehliadača, servlety dynamicky rozširujú funkčnosť webového servera. Hoci servlety môžu obsluhovať akúkoľvek požiadavku, bežne sa používajú na rozšírenie webových serverov. Pre takéto aplikácie technológia Java Servlet definuje triedy servletov špecifické pre HTTP. Balíky javax.servlet a javax.servlet.http poskytujú rozhrania a triedy na vytváranie servletov.
- Aká je štruktúra webového projektu?
- Čo je kontajner na servlety? Životný cyklus servletov.
Kontajner servletov je program, ktorý riadi životný cyklus servletov.
Životný cyklus servletu: je riadený kontajnerom servletu, pri prvom prístupe k servletu sa načíta do pamäte a zavolá sa metóda init(). Počas behu aplikácie sa volajú metódy service() na spracovanie požiadaviek klientov. Keď sa aplikácia ukončí, zavolá sa metóda cancel() a servlet sa uvoľní z pamäte.
- Aké sú úlohy, funkčnosť kontajnera servletov?
Kontajner servletu môže fungovať ako úplný samostatný webový server, poskytovať stránky inému webovému serveru, ako je Apache, alebo sa môže integrovať do aplikačného servera Java EE. Zabezpečuje výmenu dát medzi servletom a klientmi, vykonáva také funkcie, ako je vytváranie softvérového prostredia pre fungujúci servlet, identifikácia a autorizácia klientov, organizácia relácie pre každého z nich.
- Ako sa sendRedirect() líši od forward()?
Ak chcete volať JSP pomocou relatívnej cesty, použite metódu forward(), ak chcete získať prístup k JSP pomocou absolútnej cesty, použite metódu sendRedirect(). Rozdiel medzi týmito metódami je v tom, že už existujúci objekt požiadavky sa odovzdá pomocou metódy forward() a pri volaní metódy sendRedirect() sa vytvorí nová požiadavka. Informácie v druhom prípade by sa mali prenášať s inými objektmi. Metóda forward() je navyše rýchlejšia.
- Čo viete o filtroch servletov?
Implementácia rozhrania Filter umožňuje vytvoriť objekt, ktorý zachytí požiadavku, dokáže transformovať hlavičku a obsah požiadavky klienta. Filtre nevytvárajú požiadavku ani odpoveď, ale iba ich upravujú. Filter predbežne spracuje požiadavku predtým, ako zasiahne servlet, a potom (ak je to potrebné) spracuje odpoveď zo servletu. Filter môže interagovať s rôznymi typmi zdrojov, najmä so servletmi a stránkami JSP. Filtre servletov môžu:
- zachytiť iniciáciu servletu pred spustením servletu.
- určiť obsah požiadavky pred vyvolaním servletu.
- upraviť hlavičky a údaje požiadavky, v ktorých je zabalená prichádzajúca požiadavka.
- upraviť hlavičky a údaje odpovede, v ktorých je prijatá odpoveď zabalená.
- zachytiť spustenie servletu po volaní na servlet.
Filter servletov možno nakonfigurovať tak, aby fungoval na jednom servlete alebo skupine servletov. Základom pre tvorbu filtrov je rozhranie javax.servlet.Filter, ktoré implementuje tri metódy:
- void init(FilterConfig config) vyhodí ServletException;
- void zničit();
- void doFilter(požiadavka ServletRequest, odpoveď ServletResponse, reťazec FilterChain) vyvolá IOException, ServletException;
Pred spustením filtra sa zavolá metóda init() a nastaví konfiguračný objekt filtra. Metóda doFilter vykonáva skutočnú prácu filtra. Server teda raz zavolá init() na spustenie filtra a potom zavolá doFilter() toľkokrát, koľkokrát je priamo na tento filter odoslaných požiadaviek. Keď filter dokončí svoju prácu, zavolá sa metóda cancel().
- Prečo potrebujeme poslucháčov v servletoch?
Poslucháči kontextu a relácie sú triedy, ktoré môžu sledovať, kedy bol kontext alebo relácia inicializovaná, alebo sledovať, kedy by mala byť zničená a kedy boli atribúty pridané alebo odstránené z kontextu alebo relácie. Servlet 2.4 rozširuje model poslucháča požiadaviek tak, aby sledoval, ako je požiadavka vytvorená a zničená a ako sa atribúty pridávajú a odstraňovajú zo servletu. Servlet 2.4 pridal nasledujúce triedy:
- ServletRequestListener
- ServletRequestEvent
- ServletRequestAttributeListener
- ServletRequestAttributeEvent
- Ako spracovať výnimky vyvolané iným servletom v aplikácii?
Keďže prehliadač rozumie iba HTML, keď aplikácia vyvolá výnimku, kontajner servletu túto výnimku spracuje a vygeneruje HTML odpoveď. Je to podobné ako pri chybových kódoch ako 404, 403 atď. Servlet API poskytuje podporu pre natívne servlety na spracovanie výnimiek a chýb, ktoré môžeme nastaviť v deskriptore nasadenia. Hlavnou úlohou takýchto servletov je spracovať chybu alebo výnimku a odoslať používateľovi odpoveď HTML čitateľnú pre človeka. Môžete napríklad uviesť odkaz na hlavnú stránku, ako aj popis niektorých podrobností o chybe.
- Čo je deskriptor nasadenia?
Deskriptor nasadenia je konfiguračný súbor artefaktu, ktorý bude nasadený do kontajnera servletu. V špecifikácii Java Platform, Enterprise Edition deskriptor nasadenia opisuje, ako sa má komponent, modul alebo aplikácia (napríklad webová alebo podniková aplikácia) nasadiť.
Tento konfiguračný súbor špecifikuje voľby nasadenia pre modul alebo aplikáciu so špecifickými nastaveniami, bezpečnostnými voľbami a popisuje špecifické konfiguračné požiadavky. Syntax pre súbory deskriptorov nasadenia je XML.
- Ako implementovať spustenie servletu so spustením aplikácie?
Kontajner servletu zvyčajne načíta servlet pri prvej požiadavke od klienta, ale niekedy je potrebné načítať servlet hneď pri štarte aplikácie (napríklad ak je servlet veľký a jeho načítanie bude trvať dlho). Ak to chcete urobiť, musíte použiť prvok load-on-startup v deskriptore (alebo anotáciu loadOnStartup), ktorý bude indikovať, že servlet by sa mal načítať pri spustení.
Hodnota musí byť int. Ak je hodnota záporná, servlet sa načíta na žiadosť klienta a ak 0 a ďalej, načíta sa pri štarte aplikácie. Čím nižšie číslo, tým skôr bude servlet vo fronte sťahovania.
- Čo je objekt ServletConfig?
Rozhranie javax.servlet.ServletConfig sa používa na odovzdanie konfiguračných informácií servletu. Každý servlet má svoj vlastný objekt ServletConfig, za ktorého vytvorenie je zodpovedný kontajner servletu. Parametre init vo web.xml (alebo anotácie WebInitParam) sa používajú na nastavenie konfiguračných parametrov. Metóda getServletConfig() sa používa na získanie objektu ServletConfig tohto servletu.
- Čo je objekt ServletContext?
Rozhranie javax.servlet.ServletContext definuje množinu metód, ktoré servlet používa na komunikáciu so svojim kontajnerom servletov, ako je získanie typu MIME súboru, odosielanie požiadaviek alebo zápis do protokolového súboru. Objekt ServletContext je jedinečný a dostupný pre všetky servlety vo webovej aplikácii. Objekt ServletContext môžeme použiť, keď potrebujeme udeliť prístup k jednému alebo viacerým servletom k inicializovaným parametrom webovej aplikácie. Ak to chcete urobiť, použite prvok
Kontajnery servletov môžu tiež poskytovať kontextové objekty, ktoré sú jedinečné pre skupinu servletov. Každá zo skupín bude spojená s inou sadou adries URL hostiteľskej cesty.
ServletContext bol rozšírený v špecifikácii Servlet 3, aby poskytoval programové pridávanie poslucháčov a filtrov do aplikácie. Toto rozhranie má tiež mnoho užitočných metód ako getMimeType(), getResourceAsStream() atď.
- Aký je rozdiel medzi ServletContext a ServletConfig?
Nižšie sú uvedené niektoré rozdiely:
- ServletConfig je jedinečný pre každý servlet, zatiaľ čo ServletContext je jedinečný v celej aplikácii.
- ServletConfig sa používa na poskytnutie inicializačných parametrov servletu a ServletContext sa používa na poskytnutie inicializačných parametrov aplikácie pre všetky servlety.
- Nemáme možnosť nastaviť atribúty objektu ServletConfig, zatiaľ čo môžeme nastaviť atribúty objektu ServletContext, ktoré budú dostupné pre iné servlety.
- Rozhranie ServletResponse.
Rozhranie ServletResponse je nástroj na odosielanie údajov klientovi. Všetky metódy tohto nástroja slúžia na tento účel.
- Rozhranie ServletRequest.
Rozhranie ServletRequest je nástroj na získanie parametrov požiadavky HTTP. Toto rozhranie má niekoľko metód, ktoré sú svojím názvom a účelom rovnaké ako ServletContext.
- Čo je to Dispečer žiadostí?
Rozhranie RequestDispatcher sa používa na odovzdanie požiadavky inému zdroju (môže to byť HTML, JSP alebo iný servlet v tej istej aplikácii). Môžeme to použiť na pridanie obsahu iného zdroja do odpovede. Toto rozhranie sa používa na internú komunikáciu medzi servletmi v rovnakom kontexte. Rozhranie má dva spôsoby:
- void forward(ServletRequest var1, ServletResponse var2) - prepošle požiadavku zo servletu na iný zdroj (servlet, JSP alebo súbor HTML) na serveri.
- void include(ServletRequest var1, ServletResponse var2) – zahŕňa obsah zdroja (servlet, stránku JSP alebo HTML) v odpovedi.
Rozhranie je prístupné pomocou metódy ServletContext getRequestDispatcher(String s). Cesta musí začínať znakom / , ktorý bude interpretovaný vo vzťahu k aktuálnej koreňovej ceste kontextu.
- Ako je možné vytvoriť zablokovanie v servlete?
Deadlock (deadlock) možno dosiahnuť implementáciou volania metódy v slučke, napríklad volaním metódy doPost () v metóde doGet () a volaním doGet () v metóde doPost ().
- Ako získať adresu servletu na serveri?
Ak chcete získať skutočnú cestu servletu na serveri, môžete použiť túto konštrukciu: getServletContext().getRealPath(request.getServletPath()).
- Ako získať informácie o serveri zo servletu?
Informácie o serveri možno získať pomocou objektu ServletContext pomocou metódy getServerInfo(). Tie. getServletContext().getServerInfo().
- Ako získať IP adresu klienta na serveri?
Použite request.getRemoteAddr() na získanie IP klienta v servlete.
- Čo viete o triedach obalu servletov?
Servlet HTTP API poskytuje dve triedy wrapperov, HttpServletRequestWrapper a HttpServletResponseWrapper. Pomáhajú vývojárom implementovať ich vlastné implementácie typov požiadaviek a odpovedí servletu. Tieto triedy môžeme rozšíriť a prepísať iba nevyhnutné metódy na implementáciu vlastných typov objektov odpovedí a požiadaviek. Tieto triedy sa nepoužívajú v štandardnom programovaní servletov.
Jednou z najpríjemnejších vlastností Java je jej mnohostranná povaha. Samozrejme, vytváranie tradičných desktopových a dokonca aj mobilných aplikácií je skvelé. Ale čo ak chcete vyjsť zo zabehnutých koľají a vstúpiť do oblasti vývoja webu Java? Dobrou správou pre vás je, že jazyk prichádza s kompletným Servlet API, ktoré vám umožňuje vytvárať robustné webové aplikácie bez prílišných problémov.
Vytváranie aplikácií Java pomocou servletov
Takže sme už vytvorili konfiguračné súbory aplikácie. V súčasnom stave však nerobí doslova nič. Chceme, aby sa klienti mohli zaregistrovať pomocou formulára HTML, takže ďalšia vec, ktorú musíme urobiť, je vytvoriť súbory JSP, ktoré po úspešnej registrácii zobrazia vyššie uvedený formulár a podrobnosti o klientovi. To je to, čo teraz urobíme.
Práca na vzhľade
Vzhľad aplikácie bude definovaný dvoma súbormi JSP – v kontexte MVC sa nazývajú pohľady. Prvý bude zodpovedný za zobrazenie registračného formulára a prípadné chyby spôsobené po validácii zadaných údajov. Druhá bude bežná uvítacia stránka, na ktorej sa zobrazia údaje zadané zákazníkom po úspešnom dokončení procesu registrácie.
Tu je prvý súbor JSP:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Registrácia
$ (porušenie).
Súbor obsahuje jednoduchý HTML s niekoľkými doplnkami. To je krása JSP v kombinácii s JSTL a JEL. Všimnite si, aké ľahké je skontrolovať chyby overenia pomocou štandardných značiek, ako sú<с:if>A
Atribút akcie registračného formulára ukazuje na nasledujúcu adresu URL: $(pageContext.request.contextPath)/processcustomer . To znamená, že pri každom pokuse klienta o registráciu budú údaje odoslané spracovateľovi bez ohľadu na URL, kde je formulár dostupný. Dosahuje sa to prostredníctvom funkčnosti objektov dostupných zo súboru JSP, ako napríklad request .
Čoskoro uvidíme, ako sa servlet viaže na adresu URL zákazníka procesu a ako interaguje so vstupom. Zatiaľ sa pozrime na súbor JSP, ktorý je zodpovedný za uvítaciu stránku:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Ďakujeme za registráciu!
Vaše zadané údaje:
Názov:$(krstné meno)
Priezvisko:$(priezvisko)
Email:$(e-mail)
Teraz, keď sme sa zaoberali vykresľovaním stránok, ďalším krokom je vytvorenie servletu zodpovedného za zhromažďovanie klientskych údajov z požiadaviek POST a overovanie údajov jednoduchým spôsobom.
Píšeme ovládač
Napísať servlet, ktorý dokáže prijímať údaje z registračného formulára, je rovnako jednoduché ako lúskanie hrušiek. Všetko, čo musíme urobiť, je napísať podtriedu triedy HttpServlet a implementovať jej metódy doGet() alebo doPost() (alebo obe, ak je to potrebné). V tomto prípade bude servlet interagovať s údajmi pochádzajúcimi z požiadaviek POST.
Vyzerá to takto:
@WebServlet(name = "CustomerController", urlPatterns = "/processcustomer") verejná trieda CustomerController rozširuje HttpServlet (@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) ; vyvolá ServletException, IOException = RequestParmeterCustomerfromRequest .setAsRequestAttributes(požiadavka); Porušenia zoznamu = customer.validate(); if (!violations.isEmpty()) ( request.setAttribute("poruchy", porušenia); ) String url =determinUrl(poruchy); request.getRequestDispatcher(url ).forward(požiadavka, odpoveď); ) private String DeterminUrl(Zoznam porušení) ( if (!violations.isEmpty()) ( return "/"; ) else ( return "/WEB-INF/views/customerinfo.jsp"; ) ) súkromná statická trieda RequestCustomer ( private final String firstName; private final String lastName; private final String email; private RequestCustomer(String firstName, String lastName, String email) ( this.firstName = firstName; th is.priezvisko = priezvisko; this.email = email; ) public static RequestCustomer fromRequestParameters(HttpServletRequest request) ( return new RequestCustomer(request.getParameter("firstname"), request.getParameter("priezvisko"), request.getParameter("e-mail")); ) public void setAsRequestAttributes(Request request) ( request.setAttribute("krstne meno", meno); request.setAttribute("priezvisko", priezvisko); request.setAttribute("e-mail", email); ) public List validate() ( Porušenie zoznamu = nový ArrayList<>(); if (!StringValidator.validate(firstName)) ( porušenie.add("Krstné meno je povinné pole"); ) if (!StringValidator.validate(priezvisko)) (porušenia.add("Priezvisko je povinné pole") ; ) if ( !EmailValidator.validate(email)) ( porušenie.add("E-mail musí mať správny tvar"); ) vrátiť porušenia; )))
Prvá vec, ktorú si tu všimnite, je použitie anotácie @WebServlet(name ="CustomerController", urlPatterns = "/processcustomer"). Hovorí kontajneru servletu, aby použil triedu CustomerController na spracovanie požiadaviek HTTP na /processcustomer . Rovnaký efekt možno dosiahnuť pridaním direktív na mapovanie servletov do web.xml, ako napríklad , ale keďže používame špecifikáciu servletov 3.1, nemusíme sa uchýliť k tejto metóde.
Tu sme pomenovali servlet CustomerController, pretože sa považuje za osvedčený postup použiť názov triedy servletu ako hodnotu atribútu name v anotácii @WebServlet. V opačnom prípade sa niektoré kontajnery nezhodujú, čo bude mať za následok chybu 404.
Samotná trieda CustomerController vykonáva niekoľko jednoduchých úloh. Najprv zhromažďuje vstup z formulára pomocou implementácie rozhrania HttpServletRequest, ktoré obsahuje hodnoty zodpovedajúce poliam krstné meno, priezvisko a e-mail formulára. Potom nastaví tieto hodnoty ako atribúty dotazu, aby ich bolo možné znova vykresliť vo formulári alebo na stránke s výsledkami. Na záver validátori skontrolujú správnosť zadaných údajov.
Validátory sú jednoduché triedy, ktoré kontrolujú určité vlastnosti, napríklad či je reťazec prázdny alebo či e-mail vyzerá ako e-mail. Na autorskom GitLabe si môžete pozrieť ich implementáciu.
Výsledok validácie ovplyvňuje ďalší priebeh udalostí: ak údaje nie sú platné, klient je presmerovaný cez objekt RequestDispatcher na registračnú stránku, kde sa zobrazia zodpovedajúce chyby. Ak je všetko v poriadku, zobrazí sa uvítacia stránka.
Takže sme vytvorili kompletnú Java webovú aplikáciu, ktorá vám umožňuje registrovať klientov pomocou HTML formulára, základného servletu a niekoľkých súborov JSP. Je čas to spustiť.
Spustenie aplikácie
Ak chcete spustiť aplikáciu, musíte vykonať nasledujúce kroky:
IntelliJ IDEA). Keď nasadíte projekt a spustíte ho, mal by sa spustiť predvolený prehliadač s prihlasovacím oknom.
Záver
Takže ste získali všetky zručnosti, ktoré potrebujete na vytvorenie vlastnej webovej aplikácie Java bez toho, aby ste sa museli uchýliť k zložitým rámcom. Všetko, čo potrebujete, je Servlet API, technológia ako JSP na vykresľovanie, a vstavané zariadenia Java. Je to skvelé, však?
Stojí za zmienku, že implementácia triedy CustomerController zvýrazňuje výhody a nevýhody servletov: na jednej strane stručne ukazuje, aké ľahké je spracovávať parametre požiadavky a odosielať odpovede klientovi v rôznych formátoch. Táto funkcia však niečo stojí: obe implementácie rozhraní HttpServletResponse a HttpServletResponse sú bežnými lokátormi služieb. To neznamená, že je to zlé, pretože lokátory jednoducho obsahujú údaje. Majte však na pamäti, že tieto implementácie budú vždy viazané na servlet.
Príklad servletu zahŕňa samotný servlet HelloWorld.java a deskriptor aplikácie web.xml. Servlet vám umožňuje vygenerovať stránku s odpoveďou pomocou cyriliky. Štruktúra príkladu servletu v Eclipse IDE je zobrazená na nasledujúcom obrázku.
Výpis príkladu servletu HelloWorld.java
Nižšie uvedený kód implementuje jednoduchý servlet HelloWorld.java, ktorý prehliadaču vráti statickú HTML stránku. V tomto príklade servlet zdedí vlastnosti HttpServlet, ktorý implementuje rozhranie Servlet.
Importovať java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletConfig; import javax.servlet.http.HttpServlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorld rozširuje HttpServlet ( private ServletConfig config; @Override public void init (ServletConfig config) vyhodí ServletException ( this.config = config; ) @Override public void cancel() () @Override public ServletConfig getServletConfig;) () @Override public String getServletInfo() ( return "A Simple Servlet"; ) public void service (požiadavka HttpServletRequest, odpoveď HttpServletResponse) vyvolá výnimku ServletException, IOException ( response.setContentType("text/html"); Text reťazca = " " + "
" + " " + "Dobrý deň, %s %s!
" + ""; text = String.format(text, config.getInitParameter("názov"), config.getInitParameter("mname")); OutputStream outStream = response.getOutputStream(); outStream.write(text.getBytes(" UTF-8")); outStream.flush(); outStream.close(); ) )Pri prístupe k servletu sa volá metóda služby, ktorý vykreslí stránku odpovede a odošle ju prehliadaču cez HttpServletResponse. Hlavička je definovaná v prvých riadkoch odpovede servera Druh obsahu s kódovaním UTF-8. Okrem toho sa do šablóny odpovede nahradí krstné meno a priezvisko získané z deskriptora aplikácie web.xml. To znamená, že sa načítajú konfiguračné parametre servletu.
Aby ste mohli vrátiť stránku s azbukou, použite OutputStream. Do výstupného toku je možné dostať akúkoľvek informáciu (v našom príklade jednoduchý HTML kód).
Výpis deskriptora aplikácie web.xml
V deskriptore aplikácie web.xml Parametre servletu (názov-názov-servletu a trieda-trieda-servletu) a inicializačné parametre (meno krstného mena, stredné meno mname) sú definované. Servlet načíta tieto parametre pomocou ServletConfig.
Ak chcete spustiť príklad servletu z IDE Eclipse, musíte spustiť aplikačný server a do panela s adresou prehliadača zadať nasledujúci riadok:
http://localhost:8080/ServletHello/hello
Prehliadač nám zobrazí pozdrav označujúci hlavnú postavu diel Ilfa a Petrova.
Na samostatnú kompiláciu servletu môžete použiť dávkový súbor, ktorého text pre Windows môže vyzerať takto.
SET TOMCAT_LIB="C:\Program Files\Apache Software Foundation\Tomcat\common\lib" SET JAVA_SDK=C:\Java\Sun\SDK\jdk\bin\ %JAVA_SDK%javac -classpath %TOMCAT_LIB%\servlet-api. jar*.java
Po skompilovaní servletu HelloWorld trieda musí byť umiestnený v adresári WEB-INF/triedy/ WEB aplikácie na serveri Tomcat a zaregistrujte sa v deskriptore distribúcie web.xml.
Stiahnite si príklad
Zdrojový kód pre vzorový servlet diskutovaný v texte stránky je dostupný (191 Kb).
Môžete si pozrieť príklad servletu, ktorý používa grafickú knižnicu Chart.js na dynamické generovanie stránky s grafmi.