Java. HTTP protokolas ir darbas su WEB

Servletai yra „Java“ programos, veikiančios žiniatinklio programos serverio pusėje. Kaip programėlės dinamiškai išplečia žiniatinklio naršyklės funkcionalumą, servletės dinamiškai išplečia žiniatinklio serverio funkcionalumą. Nors servletai gali aptarnauti bet kokią užklausą, jie paprastai naudojami žiniatinklio serveriams išplėsti. Tokioms programoms Java Servlet technologija apibrėžia HTTP specifines servletų klases. Paketai javax.servlet ir javax.servlet.http suteikia sąsajas ir klases serveriams kurti.

  • Kokia yra žiniatinklio projekto struktūra?

  • Kas yra servleto konteineris? Servleto gyvavimo ciklas.

Servletų talpykla yra programa, valdanti servletų gyvavimo ciklą.
Servleto gyvavimo ciklas: jį valdo servleto konteineris, pirmą kartą prisijungus prie serverio, jis įkeliamas į atmintį ir iškviečiamas init() metodas. Per visą programos veikimo laiką, norint apdoroti kliento užklausas, iškviečiamas service() metodas. Kai programa nutrūksta, iškviečiamas sunaikinimo () metodas ir servletas iškraunamas iš atminties.

  • Kokios yra servleto konteinerio užduotys, funkcionalumas?

Servleto konteineris gali veikti kaip visiškai atskiras žiniatinklio serveris, būti kito žiniatinklio serverio, pvz., „Apache“, puslapio teikėjas arba integruotas į „Java EE“ taikomųjų programų serverį. Teikia duomenų mainus tarp servleto ir klientų, atlieka tokias funkcijas kaip programinės įrangos aplinkos kūrimas veikiančiam servletui, klientų identifikavimas ir autorizavimas, kiekvieno iš jų seanso organizavimas.

  • Kuo skiriasi sendRedirect() ir forward()?

Norint iškviesti JSP naudojant santykinį kelią, naudojamas metodas forward() norint pasiekti JSP naudojant absoliutų kelią, naudojamas sendRedirect() metodas. Skirtumas tarp šių metodų yra tas, kad naudojant forward() metodą perduodamas jau esamas užklausos objektas, o kai iškviečiamas sendRedirect() metodas, generuojama nauja užklausa. Pastaruoju atveju informacija turėtų būti perduodama su kitais objektais. Be to, „forward()“ metodas veikia greičiau.

  • Ką žinote apie servlet filtrus?

Filtro sąsajos įdiegimas leidžia sukurti objektą, kuris perima užklausą ir gali pakeisti kliento užklausos antraštę ir turinį. Filtrai nekuria užklausos ar atsakymo, o tik juos modifikuoja. Filtras atlieka išankstinį užklausos apdorojimą prieš jai pasiekiant servletą, po to (jei reikia) apdoroja atsakymą, gaunamą iš serverio. Filtras gali sąveikauti su įvairių tipų ištekliais, ypač su servletais ir JSP puslapiais. Servleto filtrai gali:

  • perimti servleto inicijavimą prieš inicijuojant servletą.
  • nustatyti užklausos turinį prieš inicijuojant servletą.
  • pakeisti užklausų antraštes ir duomenis, į kuriuos supakuota gaunama užklausa.
  • pakeisti atsakymų antraštes ir duomenis, į kuriuos supakuotas gautas atsakymas.
  • perimti servleto inicijavimą po to, kai bus pasiektas serveris.

Servleto filtrą galima sukonfigūruoti taip, kad jis veiktų su vienu serveriu arba servletų grupe. Filtrų kūrimo pagrindas yra javax.servlet.Filter sąsaja, kuri įgyvendina tris metodus:

  • void init(FilterConfig config) meta ServletException;
  • galioti sunaikinti ();
  • void doFilter (ServletRequest užklausa, ServletResponse atsakymas, FilterChain grandinė) meta IOException, ServletException;

Metodas init() iškviečiamas prieš pradedant veikti filtrui ir nustatant filtro konfigūracijos objektą. DoFilter metodas atlieka tikrąjį filtro darbą. Taigi, serveris vieną kartą iškviečia init(), kad paleistų filtrą, o tada iškviečia doFilter() tiek kartų, kiek užklausos pateikiamos tiesiai šiam filtrui. Kai filtras baigia savo darbą, iškviečiamas sunaikinimo () metodas.

  • Kodėl mums reikia klausytojų servletuose?

Konteksto ir seanso klausytojai yra klasės, kurios gali sekti, kada buvo inicijuotas kontekstas arba seansas, arba sekti, kada jie turėtų būti sunaikinti ir kada atributai buvo įtraukti į kontekstą ar seansą arba pašalinami iš jų. „Servlet 2.4“ išplečia užklausų klausytojo modelį, leisdama stebėti, kaip sukuriama ir sunaikinama užklausa ir kaip atributai pridedami prie serverio ir pašalinami iš jo. Prie Servlet 2.4 buvo pridėtos šios klasės:

  • ServletRequestListener
  • ServletRequestEvent
  • ServletRequestAttributeListener
  • ServletRequestAttributeEvent

  • Kaip tvarkyti išimtis, kurias programoje pateikia kitas servletas?

Kadangi naršyklė supranta tik HTML, kai programa pateikia išimtį, servleto konteineris tvarkys išimtį ir sukurs HTML atsakymą. Tai panašu į tai, kas atsitinka su klaidų kodais, tokiais kaip 404, 403 ir kt. Servlet API palaiko vietinius servletus, kad būtų galima tvarkyti išimtis ir klaidas, kurias galime nurodyti diegimo deskriptoriuje. Pagrindinė tokių servletų užduotis yra sutvarkyti klaidą ar išimtį ir nusiųsti aiškų HTML atsakymą vartotojui. Pavyzdžiui, galite pateikti nuorodą į pagrindinį puslapį, taip pat kai kurios informacijos apie klaidą aprašymą.

  • Kas yra diegimo deskriptorius?

Diegimo aprašas yra artefakto, kuris bus įdiegtas į servlet talpyklą, konfigūracijos failas. „Java“ platformos Enterprise Edition specifikacijoje diegimo deskriptorius aprašo, kaip turėtų būti įdiegtas komponentas, modulis arba programa (pvz., žiniatinklio ar įmonės programa).

Šiame konfigūracijos faile nurodomos modulio ar programos diegimo parinktys su konkrečiais parametrais, saugos parinktis ir aprašomi konkretūs konfigūracijos reikalavimai. Diegimo deskriptorių failų sintaksė naudoja XML.

  • Kaip įdiegti servleto paleidimą su programos paleidimu?

Servleto konteineris paprastai įkelia servletą pirmą kartą kliento prašymu, tačiau kartais reikia įkelti servletą iškart programos pradžioje (pavyzdžiui, jei servletas yra didelis ir užtruks ilgai). Norėdami tai padaryti, deskriptoriuje turite naudoti elementą load-on-startup (arba loadOnStartup anotaciją), kuris nurodys, ar servlet turi būti įkeltas paleidžiant.

Reikšmė turi būti int. Jei reikšmė yra neigiama, tada servletas bus įkeltas, kai klientas to paprašys, o jei jis yra 0 ir daugiau, tada jis bus įkeltas programos pradžioje. Kuo mažesnis skaičius, tuo anksčiau servlet bus atsisiuntimo eilėje.

  • Kas yra „ServletConfig“ objektas?

Javax.servlet.ServletConfig sąsaja naudojama konfigūracijos informacijai perduoti į servlet. Kiekvienas servletas turi savo „ServletConfig“ objektą, už kurio generavimą atsakingas servleto konteineris. Norėdami nustatyti konfigūracijos parametrus, naudokite init parametrus web.xml (arba WebInitParam komentaruose). Metodas getServletConfig() naudojamas tam tikro servleto ServletConfig objektui gauti.

  • Kas yra „ServletContext“ objektas?

Sąsaja javax.servlet.ServletContext apibrėžia metodų rinkinį, kurį servlet naudoja bendraudamas su savo servleto konteineriu, pavyzdžiui, failo MIME tipo gavimą, užklausų siuntimą arba įrašymą į žurnalo failą. „ServletContext“ objektas yra unikalus ir prieinamas visiems žiniatinklio programos servletams. Objektą ServletContext galime naudoti, kai reikia suteikti prieigą prie vieno ar kelių servletų prie inicijuotų žiniatinklio programos parametrų. Tam naudojamas elementas web.xml. „ServletContext“ objektą galima gauti naudojant „ServletConfig“ sąsajos metodą getServletContext().

Servletų konteineriai taip pat gali pateikti konteksto objektus, kurie yra unikalūs servletų grupei. Kiekviena grupė bus susieta su savo prieglobos kelių URL rinkiniu.

ServletContext buvo išplėstas Servlet 3 specifikacijoje ir suteikia galimybę programiškai pridėti klausytojus ir filtrus prie programos. Šioje sąsajoje taip pat yra daug naudingų metodų, tokių kaip getMimeType(), getResourceAsStream() ir kt.

  • Kuo skiriasi „ServletContext“ ir „ServletConfig“?

Žemiau yra keletas skirtumų:

  • „ServletConfig“ yra unikalus kiekvieno serverio objektas, o „ServletContext“ yra unikalus visai programai.
  • ServletConfig naudojamas servlet inicijavimo parametrams teikti, o ServletContext naudojamas programos inicijavimo parametrams pateikti visuose serveriuose.
  • Neturime galimybės nustatyti atributų „ServletConfig“ objekte, o „ServletContext“ objekte galime nustatyti atributus, kurie bus prieinami kitiems servletams.

  • ServletResponse sąsaja.

ServletResponse sąsaja yra duomenų siuntimo klientui įrankis. Visi šio įrankio metodai yra skirti būtent šiam tikslui.

  • ServletRequest sąsaja.

ServletRequest sąsaja yra HTTP užklausos parametrų gavimo įrankis. Šioje sąsajoje yra keletas metodų, kurie savo pavadinimu ir paskirtimi yra identiški ServletContext.

  • Kas yra užklausų dispečeris?

„RequestDispatcher“ sąsaja naudojama užklausai perduoti kitam ištekliui (tai gali būti HTML, JSP arba kita toje pačioje programoje esanti servlet). Tai galime naudoti norėdami į atsakymą įtraukti turinį iš kito šaltinio. Ši sąsaja naudojama vidiniam ryšiui tarp servletų tame pačiame kontekste. Sąsaja įgyvendina du būdus:

  • void forward (ServletRequest var1, ServletResponse var2) – persiunčia užklausą iš servleto į kitą serveryje esantį šaltinį (servlet, JSP arba HTML failą).
  • void include(ServletRequest var1, ServletResponse var2) – į atsakymą įtraukiamas ištekliaus (servlet, JSP arba HTML puslapis) turinys.

Sąsają galima pasiekti naudojant ServletContext getRequestDispatcher(String s) metodą. Kelias turi prasidėti raide / , kuri bus interpretuojama atsižvelgiant į dabartinį konteksto šakninį kelią.

  • Kaip galite sukurti aklavietę servlete?

Aklavietę galima pasiekti įgyvendinus kilpinio metodo iškvietimą, pavyzdžiui, iškviečiant metodą doPost() metodu doGet() ir iškviečiant doGet() metodu doPost().

  • Kaip gauti servleto adresą serveryje?

Norėdami gauti tikrąjį serverio serverio kelią, galite naudoti šią konstrukciją: getServletContext().getRealPath(request.getServletPath()).

  • Kaip gauti serverio informaciją iš servleto?

Serverio informaciją galima gauti naudojant ServletContext objektą naudojant getServerInfo() metodą. Tie. getServletContext().getServerInfo().

  • Kaip gauti kliento IP adresą serveryje?

Naudokite request.getRemoteAddr(), kad gautumėte kliento IP serverle.

  • Ką žinote apie servlet įvyniojimo klases?

„Servlet HTTP API“ teikia dvi įpakavimo klases – „HttpServletRequestWrapper“ ir „HttpServletResponseWrapper“. Jie padeda kūrėjams įgyvendinti savo serverio užklausų ir atsakymų tipus. Galime išplėsti šias klases ir nepaisyti tik būtinų metodų, kad įgyvendintume savo atsakymo ir užklausų objektų tipus. Šios klasės nenaudojamos standartiniame servlet programavime.

Servleto pavyzdys apima patį HelloWorld.java servlet ir web.xml programos aprašą. Servletas leidžia sukurti atsakymo puslapį naudojant kirilicos abėcėlę. Eclipse IDE pavyzdinio servleto struktūra parodyta toliau pateiktoje ekrano kopijoje.

HelloWorld.java servlet pavyzdžių sąrašas

Žemiau pateiktas kodas įgyvendina paprastą servletą HelloWorld.java, kuris naršyklei grąžina statinį HTML puslapį. Pavyzdyje serveris paveldi sąsają įgyvendinančio HttpServlet savybes Servletas.

Importuoti java.io.IOException; importuoti java.io.OutputStream; importuoti javax.servlet.ServletConfig; importuoti javax.servlet.http.HttpServlet; importuoti javax.servlet.ServletException; importuoti javax.servlet.http.HttpServletRequest; importuoti javax.servlet.http.HttpServletResponse; viešoji klasė HelloWorld išplečia HttpServlet (privati ​​ServletConfig konfigūracija; @Override public void init (ServletConfig config) išmeta ServletException ( this.config = config; ) @Override public void häviti() () @Nepaisyti viešosios ServletConfig config; @Override public String getServletInfo() (grąžina „Paprastas serveris“; ) viešoji galios paslauga (HttpServletRequest užklausa, HttpServletResponse atsakymas) išmeta ServletException, IOException ( response.setContentType("text/html"); eilutės tekstas = " " + "" + " " + "Servleto pavyzdys!" + "" + "" + "

Sveiki, %s %s!

" + ""; text = String.format(tekstas, config.getInitParameter("pavadinimas"), config.getInitParameter("mname")); OutputStream outStream = response.getOutputStream(); outStream.write(text.getBytes(") UTF-8")); outStream.flush(); outStream.close(); ) )

Prieinant prie serverio, metodas iškviečiamas paslauga, kuris sugeneruoja atsakymo puslapį ir perduoda jį naršyklei per HttpServletResponse. Pirmosiose serverio atsakymo eilutėse yra antraštė Turinio tipas nurodant UTF-8 kodavimą. Be to, atsakymo šablonas užpildomas vardu ir pavarde, gautu iš web.xml programos deskriptoriaus. Tai yra, servlet konfigūracijos parametrai nuskaitomi.

Tam, kad būtų galima grąžinti puslapį su kirilicos abėcėle, ji naudojama OutputStream. Į išvesties srautą galite išvesti bet kokią informaciją (mūsų pavyzdyje paprastas HTML kodas).

Programos deskriptorių sąrašas web.xml

Servlet Hello World Sveiki pavyzdys.SveikasPasauliai vardas Ostapas mname Ibrahimovičius Sveiki /Sveiki

Paraiškos apraše web.xml nustatomi servlet parametrai (vardas servlet-name ir klasė servlet-class) ir inicijavimo parametrai (vardo pavadinimas, patroniminis mname). Servletas nuskaito šiuos parametrus naudodamas ServletConfig.

Norėdami paleisti pavyzdinį servlet iš Eclipse IDE, turite paleisti programų serverį ir naršyklės adreso juostoje įvesti šią eilutę:

Http://localhost:8080/ServletHello/hello

Naršyklė mums parodys sveikinimą, nurodantį pagrindinį Ilfo ir Petrovo kūrinių veikėją.


Norėdami atskirai sudaryti servletą, galite naudoti paketinį failą, kurio tekstas, skirtas Windows, gali atrodyti taip:

SET TOMCAT_LIB="C:\Programų failai\Apache Software Foundation\Tomcat\common\lib" SET JAVA_SDK=C:\Java\Sun\SDK\jdk\bin\ %JAVA_SDK%javac -classpath %TOMCAT_LIB%\servlet-api. stiklainis *.java

Sukūrę servletą SveikiPasaulio klasė turi būti patalpintas į katalogą WEB-INF/klasės/ WEB programas Tomcat serveryje ir užsiregistruokite pristatymo apraše web.xml.

Atsisiųsti pavyzdį

Puslapio tekste aptarto pavyzdinio servleto šaltinio kodas yra (191 KB).

Galima peržiūrėti servleto, naudojančio Chart.js grafikos biblioteką, dinamiškai generuoti puslapį su diagramomis, pavyzdį.

Vienas geriausių „Java“ dalykų yra jos universalumas. Žinoma, kurti tradicines darbalaukio ir net mobiliąsias programas yra puiku. Bet ką daryti, jei norite nukrypti nuo praminto kelio ir patekti į žiniatinklio programų kūrimo Java programoje teritoriją? Geros naujienos jums yra tai, kad kalba pateikiama su visaverte Servlet API, kuri leidžia be didesnio vargo kurti patikimas žiniatinklio programas.

„Java“ programų kūrimas naudojant „servletus“.

Taigi, mes jau sukūrėme programos konfigūracijos failus. Tačiau dabartinėje būsenoje ji tiesiogine prasme nieko nedaro. Norime, kad klientai galėtų registruotis naudodami HTML formą, todėl kitas dalykas, kurį turime padaryti, yra sukurti JSP failus, kuriuose bus rodoma aukščiau pateikta forma ir kliento informacija, kai registracija bus sėkmingai užbaigta. Tai mes dabar darysime.

Dirbame su išvaizda

Programos išvaizda bus apibrėžta dviem JSP failais – MVC kontekste jie vadinami rodiniais. Pirmasis bus atsakingas už registracijos formos atvaizdavimą ir galimas klaidas, atsiradusias patikrinus įvestus duomenis. Antrasis bus įprastas pasveikinimo puslapis, kuriame bus rodoma išsami informacija, kurią klientas įvedė sėkmingai užbaigus registracijos procesą.

Štai pirmasis JSP failas:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> Registracija

Registracija

$ (pažeidimas).