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
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 = " " + "
" + " " + "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
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
$ (pažeidimas).
Faile yra paprastas HTML su keliais priedais. Tai yra JSP grožis kartu su JSTL ir JEL. Atkreipkite dėmesį, kaip lengva patikrinti, ar nėra patvirtinimo klaidų naudojant standartines žymas, pvz.,<с:if>Ir
Registracijos formos veiksmo atributas nurodo šį URL: $(pageContext.request.contextPath)/processcustomer . Tai reiškia, kad kiekvieną kartą, kai klientas bando registruotis, duomenys bus siunčiami apdorotiam klientui, neatsižvelgiant į URL, kuriame pasiekiama forma. Tai pasiekiama naudojant JSP faile pasiekiamų objektų, pvz., užklausos, funkcionalumą.
Netrukus pamatysime, kaip servlet susiejamas su proceso kliento URL ir kaip jis sąveikauja su įvestimi. Kol kas pažvelkime į JSP failą, kuris yra atsakingas už pasveikinimo puslapį:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Ačiū, kad užsiregistravote!
Jūsų įvesti duomenys:
Vardas:$(vardas)
Pavardė:$(pavardė)
El. paštas:$(el. paštas)
Dabar, kai supratome puslapio atvaizdavimą, kitas žingsnis yra sukurti servletą, atsakingą už klientų duomenų rinkimą iš POST užklausų ir duomenų patvirtinimą paprastu būdu.
Valdiklio rašymas
Parašyti servletą, galintį gauti duomenis iš registracijos formos, negali būti lengviau. Viskas, ką turime padaryti, tai parašyti HttpServlet klasės poklasį ir įdiegti jo doGet() arba doPost() metodus (arba abu, jei reikia). Tokiu atveju servletas sąveikaus su duomenimis, gaunamais iš POST užklausų.
Štai kaip tai atrodo:
@WebServlet(pavadinimas = "CustomerController", urlPatterns = "/processcustomer") viešoji klasė "CustomerController" išplečia HttpServlet ( @Override apsaugotas tuštumas doPost(HttpServletRequest užklausa, HttpServletResponseResponseResponse (atsakymas mRequestParameters (užklausa); .setAsRequestAttributes(request) Sąrašas pažeidimai = customer.validate(); jei , atsakymas ) private String detectUrl(Sąrašo pažeidimai) ( if (!violations.isEmpty()) ( grąžinti "/"; ) else ( grąžinti "/WEB-INF/views/customerinfo.jsp"; ) ) privati statinė klasė RequestCustomer ( privati galutinė eilutė vardas vardas; privati galutinė eilutė pavardė; privati galutinė eilutės el. paštas; privati RequestCustomer (Eilutės vardas vardas, eilutė pavardė, eilutės el. pašto adresas) ( this.firstName = vardas; tai.pavardė = pavardė; this.email = el. paštas; ) vieša statinė RequestCustomer fromRequestParameters(HttpServletRequest užklausa) (grąžina naują RequestCustomer(request.getParameter("vardas"), request.getParameter("pavardė"), request.getParameter("email")); ) vieša negalioja setAsHletRestAttributes requestS(HletRestAttributes ( request.setAttribute("vardas", vardas); request.setAttribute("pavardė", pavardė); request.setAttribute("el. paštas", el. paštas); ) viešasis sąrašas validate() ( Sąrašo pažeidimai = naujas ArrayList<>(); if (!StringValidator.validate(firstName)) ( pažeidimai.add("Vardas yra privalomas laukas"); ) if (!StringValidator.validate(pavardė)) (breaks.add("Pavardė yra privalomas laukas") ; ) if ( !EmailValidator.validate(email)) ( pažeidimai.add("El. laiškas turi būti gerai suformuotas"); ) grąžina pažeidimus; ) ) )
Pirmas dalykas, į kurį reikia atkreipti dėmesį, yra @WebServlet(pavadinimas ="CustomerController", urlPatterns = "/processcustomer") anotacija. Tai nurodo servlet konteineriui naudoti „CustomerController“ klasę, kad būtų galima apdoroti HTTP užklausas į /processcustomer. Tą patį efektą galima pasiekti į web.xml taip įtraukus servlet susiejimo direktyvas, tačiau kadangi mes naudojame Servlet specifikaciją 3.1, to daryti nereikia.
Čia mes pavadinome servlet „CustomerController“, nes manoma, kad gera praktika yra naudoti servlet klasės pavadinimą kaip @WebServlet anotacijos pavadinimo atributo reikšmę. Priešingu atveju kai kurie sudėtiniai rodiniai negalės atitikti, todėl bus 404 klaida.
Pati „CustomerController“ klasė atlieka keletą paprastų dalykų. Pirma, ji renka formos įvestį naudodama HttpServletRequest sąsają, kurioje yra reikšmės, atitinkančios formos vardo, pavardės ir el. pašto laukus. Tada jis nustato šias reikšmes kaip užklausos atributus, kad jas būtų galima iš naujo pateikti formoje arba rezultatų puslapyje. Galiausiai tikrintojai patikrina įvestų duomenų teisingumą.
Tikrinimo priemonės yra paprastos klasės, kurios tikrina tam tikras ypatybes, pvz., ar eilutė tuščia, ar el. laiškas atrodo kaip el. Jų įgyvendinimą galite peržiūrėti autoriaus „GitLab“.
Patvirtinimo rezultatas turi įtakos tolimesnei įvykių eigai: jei duomenys neteisingi, klientas per RequestDispatcher objektą nukreipiamas į registracijos puslapį, kuriame rodomos atitinkamos klaidos. Jei viskas tvarkoje, rodomas pasveikinimo puslapis.
Taigi, sukūrėme visą žiniatinklio programą Java, kuri leidžia registruoti klientus naudojant HTML formą, pagrindinį servletą ir kelis JSP failus. Laikas jį paleisti.
Paleiskite programą
Norėdami paleisti programą, turite atlikti šiuos veiksmus:
IntelliJ IDĖJA). Kai įdiegiate projektą ir paleidžiate jį, numatytoji naršyklė turėtų būti paleista su registracijos langu.
Išvada
Taigi, jūs įgijote visus įgūdžius, reikalingus sukurti savo žiniatinklio programą Java, nesinaudodami sudėtingomis sistemomis. Viskas, ko jums reikia, yra „Servlet“ API, tokia technologija kaip JSP atvaizdavimui ir vietiniai „Java“ įrankiai. Puiku, tiesa?
Verta paminėti, kad įdiegus „CustomerController“ klasę, išryškinamos servletų stipriosios ir silpnosios pusės: viena vertus, trumpai parodoma, kaip paprasta apdoroti užklausų parametrus ir siųsti klientui atsakymus įvairiais formatais. Tačiau ši funkcija turi savo kainą: tiek HttpServletResponse, tiek HttpServletResponse sąsajos yra įprasti paslaugų ieškikliai. Tai nereiškia, kad tai yra blogai, nes lokatoriuose tiesiog yra duomenų. Tačiau reikia atsiminti, kad šie diegimai visada bus susieti su servletu.
Servletas yra java programa, kuri veikia ž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ą.
Darbas servletas"ir gali būti apibūdinta taip: kai iš kliento gaunama užklausa, žiniatinklio serveris, naudodamas specialų konfigūracijos failą, gali nustatyti, kurį servletą reikia vykdyti. Po to žiniatinklio serveris paleidžia JVM, kuris savo ruožtu vykdo Servletas apdoroja užklausą ir perduoda turinį į serverį (galbūt HTML puslapio pavidalu Web serveris siunčia atsakymą klientui (servleto sugeneruotas HTML puslapis).
WEB serveris iš esmės yra įkeliamas konteineris servletas“, juos vykdo ir, gavęs iš jų rezultatą, išsiunčia klientui.
Servletas žiniatinklio programų architektūroje
Dėl savo galios ir lankstumo, servletas"S gali atlikti svarbų vaidmenį sistemos architektūroje. Jie gali atlikti tarpinei programinei įrangai skirtas taikomųjų programų užduotis, veikti kaip kliento tarpinis serveris ir netgi pagerinti tarpinės programinės įrangos funkcionalumą, palaikydami naujus protokolus ir kitas funkcijas. Tarpinė programinė įranga veikia kaip taikomųjų programų serveris vadinamojoje trijų pakopų kliento-serverio sistemoje ir yra tarp lengvo kliento, pvz., žiniatinklio naršyklės, ir duomenų šaltinio.
Servletas kaip tarpinis serveris
Norėdami palaikyti programėles, servletės gali veikti kaip jų įgaliotieji serveriai. Tai gali būti svarbu, nes Java sauga leidžia programėlėms prisijungti tik prie serverio, iš kurio jos buvo atsisiųstos. Jei programėlė turi prisijungti prie duomenų bazės serverio, esančio kitame kompiuteryje, servletas gali sukurti šį programėlės ryšį.
Laikinas ir nuolatinis servletas"s
Servletus galima paleisti ir sustabdyti pagal kiekvieną kliento užklausą. Jie taip pat gali būti paleisti, kai paleidžiamas žiniatinklio serveris, ir egzistuoti tol, kol sustoja. Laikinas servletas"S yra įkeliami pagal poreikį ir yra geras būdas taupyti serverio išteklius retai naudojamoms funkcijoms. Nuolatiniai servletai įkeliami, kai paleidžiamas žiniatinklio serveris ir veikia tol, kol jis sustabdomas. Servletai diegiami kaip nuolatiniai serverio plėtiniai, jei eksploatavimo kaina kainuoja jos yra labai didelės (pvz., duomenų bazės ryšio užmezgimas), jei jos siūlo nuolatines serverio funkcijas (pvz., RMI paslaugą) arba tais atvejais, kai reikia kuo greičiau atsakyti į kliento užklausas. Nėra konkretaus kodo priskirti. servletas"ir nuolatinė ar laikina; tai yra žiniatinklio serverio nustatymo funkcija.
Servlet gyvavimo ciklas, javax.servlet.Servlet
Servletai veikia žiniatinklio serverio platformoje kaip dalis to paties proceso kaip ir pats žiniatinklio serveris. Žiniatinklio serveris yra atsakingas už kiekvieno serverio egzemplioriaus inicijavimą, iškvietimą ir sunaikinimą. Žiniatinklio serveris sąveikauja su servletu per paprastą sąsają: javax.servlet.Servlet.
Javax.servlet.Servlet sąsaja apima tris pagrindinius metodus:
- init ()
- paslauga ()
- sunaikinti ()
ir du pagalbiniai metodai:
- getServletConfig()
- gautiServletInfo()
Sąsajų panašumai servletas"ir Java programėlė yra akivaizdi. Būtent taip ji buvo sukurta! Java servletės yra žiniatinklio serveriams tokios pat kaip programėlės žiniatinklio naršyklėms. Programėlė veikia žiniatinklio naršyklėje, atlikdama veiksmus pagal jos užklausą per specialią sąsają. Servletė atlieka tas pats, kai dirbate žiniatinklio serveryje.
Servleto inicijavimas, init() metodas
Kai pirmą kartą įkeliamas servletas, iškviečiamas metodas init(). Tai leidžia servletui atlikti bet kokius sąrankos darbus, pvz., atidaryti failus arba užmegzti ryšius su savo serveriais. Jei serveris yra visam laikui įdiegtas serveryje, jis įkeliamas serveriui paleidus. Kitu atveju serveris suaktyvina servletą, kai gauna pirmą kliento užklausą atlikti to serverio teikiamą paslaugą.
Garantuojama, kad metodas init () baigsis prieš bet kokį kitą serverio iškvietimą, pvz., metodo iškvietimą paslauga (). Prisimink tai init () bus skambinama tik vieną kartą; jis nebus iškviestas tol, kol servletas nebus iškrautas ir vėl neįkeltas serverio.
Metodas init () ima vieną argumentą – nuorodą į objektą ServletConfig, kuriame yra servlet inicijavimo argumentai. Šis objektas turi metodą getServletContext() grąžinant daiktą ServletContext, kuriame yra informacijos apie servleto aplinką.
Servleto branduolys, service() metodas
Metodas paslauga () yra servleto širdis. Kiekviena kliento užklausa sukelia vieną metodo iškvietimą paslauga (). Šis metodas nuskaito užklausą ir generuoja atsakymo pranešimą naudodamas du argumentus ServletRequest ir ServletResponse:
Taigi yra du būdai perduoti informaciją iš kliento į servletą. Pirmasis yra perduoti reikšmes užklausos parametruose. Parametrų reikšmes galima įterpti į URL. Antrasis būdas perduoti informaciją iš kliento į servletą yra per InputStream (arba skaitytuvą).
Kaip veikia metodas paslauga () iš esmės yra paprastas – sukuria atsakymą į kiekvieną kliento užklausą, perduodamą jam iš serverio. Tačiau turite atsiminti, kad vienu metu gali būti apdorojamos kelios lygiagrečios užklausos. Jei metodas paslauga () reikia bet kokių išorinių išteklių, tokių kaip failai, duomenų bazės, tada būtina užtikrinti, kad prieiga prie išteklių būtų saugi.
Iškraunant servletą, sunaikinti() metodas
Metodas sunaikinti () Iškviesta, kad būtų atlaisvinti visi ištekliai (pvz., atidaryti failai ir duomenų bazės jungtys) prieš iškraunant servlet. Šis metodas gali būti tuščias, jei nereikia atlikti jokių apdailos operacijų. Prieš skambinant metodu sunaikinti () serveris laukia, kol bus baigtos visos priežiūros operacijos arba pasibaigs tam tikras laikas. Tai reiškia, kad metodas sunaikinti () galima iškviesti vykdant kokį nors ilgai veikiantį metodą paslauga ().
Svarbu įforminti metodą sunaikinti () tokiu būdu, kad nebūtų uždaryti reikiami ištekliai iki visų skambučių paslauga () neužbaigs.
Servlet konfigūracija, getServletConfig() metodas
Metodas getServletConfig() grąžina nuorodą į objektą, kuris įgyvendina sąsają ServletConfig. Šis objektas suteikia prieigą prie servleto konfigūracijos informacijos, t.y. prieiga prie servleto inicijavimo parametrų ir servlet kontekstinio objekto ServletContext, kuri suteikia prieigą prie servleto ir jo aplinkos.
Servlet informacija, getServletInfo() metodas
Metodas gautiServletInfo() apibrėžė programuotojas, kuriantis servletą, kad grąžintų eilutę su informacija apie servletą, pvz., servleto autorių ir versiją.
ServletRequest sąsaja
ServletRequest teikia kliento informaciją apie HTTP užklausos parametrus servletui, t.y. pateikia duomenis, įskaitant parametro pavadinimą ir reikšmes, atributus ir įvesties srautą. Ši informacija perduodama metodui paslauga ().
Kitas servleto pavyzdys parodo, kaip gauti informaciją iš parametro prašymas metodas paslauga ():
Buferinis skaitytuvo skaitytuvas; Styga param1; Styga param2; viešoji galios paslauga („ServletRequest“ užklausa, „ServletResponse“ atsakymas) ( skaitytuvas = request.getReader(); param1 = request.getParameter("Pirmasis"); param2 = request.getParameter("Antras"); )
Papildomą informaciją apie užklausą serveris gali gauti naudojant metodus, kurių pagrindiniai pateikti šioje lentelėje:
getAttribute() | Grąžina nurodyto šios užklausos atributo vertę. |
getContentLength() | Prašyti dydžio, jei žinoma. |
getContentType() | Grąžina užklausos turinio MIME tipą. |
getInputStream() | Pateikia „InputStream“, skirtą dvejetainiams duomenims iš užklausos turinio nuskaityti. |
GetParameterNames() | Grąžina eilučių masyvą su visų parametrų pavadinimais. |
getParameterValues() | Grąžina nurodyto parametro reikšmių masyvą. |
getProtocol () | Grąžina užklausos protokolą ir versiją kaip eilutę |
getReader () | Grąžina BufferedReader, kad gautų tekstą iš užklausos turinio. |
getRealPath() | Grąžina tikrąjį nurodyto virtualaus kelio kelią. |
getRemoteAddr() | Kliento, kuris atsiuntė šią užklausą, IP adresas. |
getRemoteHost() | Kliento kompiuterio, kuris išsiuntė šią užklausą, pagrindinio kompiuterio pavadinimas. |
getScheme () | Grąžina schemą, naudojamą šios užklausos URL (pvz., https, http, ftp ir kt.). |
getServerName() | Serverio, kuris priėmė šią užklausą, prieglobos pavadinimas. |
getServerPort() | Grąžina prievado numerį, naudotą šiai užklausai gauti. |
„ServletResponse“ sąsaja
Sąsaja „ServletResponse“. yra duomenų siuntimo klientui įrankis. Visi šio įrankio metodai yra skirti konkrečiai šiai problemai išspręsti:
Vieša java.lang.String getCharacterEncoding() public void setLocale(java.util.Locale loc) vieša java.util.Locale getLocale()
Pirmasis metodas grąžina MIME kodavimo tipą (pavyzdžiui, UTF8), kuriuo bus rodoma informacija. Antrieji du metodai taip pat veikia su simbolių rinkiniu. Jie nurodo dokumente vartojamą kalbą (pavyzdžiui, rusų).
Viešasis ServletOutputStream getOutputStream() meta java.io.IOException
Metodas getOutputStream grąžina servlet išvesties srautą. Šis srautas naudojamas, pavyzdžiui, dvejetainiams failams išvesti. Tekstinius duomenis galima išvesti naudojant java.io.Writer:
Viešoji java.io.PrintWriter getWriter() meta java.io.IOException
Metodas getWriter() automatiškai konvertuoja eilutes į simbolių rinkinį, nurodytą getCharacterEncoding() ir getLocale() metoduose.
Viešas negaliojantis nustatymasTurinio ilgis (int len)
Metodas setContentLength nustato HTTP antraštės lauko „Content-Length“ reikšmę.
Vieša galia setContentType (eilutės tipas)
Metodas setContentType naudojamas dokumento MIME turinio tipui siųsti. HTTP antraštės laukas „Content-Type“.
Išvesties duomenų srautas yra buferinis. Tai reiškia, kad duomenų dalis klientui bus išduodama tik užpildžius buferį.
Public void setBufferSize(int size) public int getBufferSize() public void flushBuffer() meta java.io.IOException public void resetBuffer()
Minėti 4 metodai leidžia atitinkamai nustatyti siuntimo buferio dydį, gauti jo dydį, inicijuoti buferio turinio siuntimą klientui nelaukiant, kol jis bus užpildytas, taip pat išvalyti šį buferį nuo duomenų.
Viešoji loginė vertė isCommitted()
Naudodami isCommitted metodą galite gauti vėliavėlę, rodančią, ar duomenų siuntimas klientui jau pradėtas. Vėliava bus teigiama, jei HTTP atsakymo antraštė jau išsiųsta.
Viešas negaliojantis nustatymas iš naujo ()
Jei HTTP antraštė dar neišsiųsta, atstatymo metodas „atkuria“ HTTP antraštės numatytąsias reikšmes.
JFreeChart diagramos servletuose
JFreeChart grafikos biblioteka gali būti naudojama servletuose diagramoms kurti ir rodyti jas svetainių puslapiuose kaip vaizdus. Pateikiamas išsamus aprašymas ir JFreeChart naudojimo servletuose pavyzdžiai.
Servletas su grafikos biblioteka Chart.js
JNI servlete
Kai kuriais atvejais gali prireikti naudoti JNI žiniatinklio programoje. Pateikiamas JNI naudojimo servletuose pavyzdys.
JMS pranešimai servlete
Servletas gali būti naudojamas bendrauti JMS pranešimus tarp programų. Pateikiamas servleto naudojimo JMS žinutėms siųsti ir skaityti JBoss konteineryje pavyzdys.
Kas yra servletai? Servletai iš tikrųjų yra HTTP ir FTP užklausų apdorojimo moduliai, naudojami portalams (žiniatinklio vartams) kurti.
Šių portalų pagrindas yra pats WEB serveris – programa, kuri turi serverio lizdą, priima ir perduoda duomenis. Dažniausiai, norint pagreitinti darbą, serveris rašomas ne Java, o kokia nors kita programavimo kalba (pavyzdžiui, C++).
Pagrindinis servletas veikia kartu su serveriu. Būtent jam serveris siunčia duomenis ir iš jo gauna klientui siunčiamą atsakymą. Tiesą sakant, pagrindinis servletas yra serverio „smegenys“. Pagrindinė šio servleto funkcija yra nuskaityti kliento užklausą, ją iššifruoti ir pagal iššifravimą perduoti darbą servletui, atsakingam už tokio tipo prašomą informaciją. Dažnai norint pasiekti greitį, pagrindinio servleto vaidmenį atlieka pats serveris. Būtent taip veikia, tarkime, Jacarta Tomcat.
Paveikslėlyje parodyta skambučių (užklausos) ir atsakymų (atsakymų) perdavimo tarp serverio ir servletų diagrama. Šioje diagramoje pavaizduotas HTTP serverio veikimas, turintis kelis JSP puslapius ir du išteklius „/sample1“ ir „/sample2“, už kurių apdorojimą atsakingi du servletai – atitinkamai „Sample1 Servlet“ ir „Sample2 Servlet“.
Žingsnis po žingsnio pažvelkime į tai, kas parodyta paveikslėlyje:
- klientas prisijungia prie serverio
- serveris perduoda užklausą pagrindiniam serveriui („Basic Servlet“)
- pagrindinis serveris ištraukia išteklių URI iš užklausos
- jei URI nurodo „/sample1“, tada užklausa visiškai(be pakeitimų) perduodamas serveriui „Sample1 Servlet“, kuris vėliau apdoroja šią užklausą
- jei URI nurodo „/sample2“, serveris perduoda užklausą „Sample2 serveriui“
- visais kitais atvejais užklausa perduodama „JSP Servlet“ moduliui
- Servletas, į kurį buvo perkeltas valdymas, apdoroja duomenis, sukuria atsakymą, po kurio atsakymas siunčiamas atgal į bazinį servletą.
- pagrindinis servletas, neapdorodamas gautų duomenų, iš karto siunčia juos atgal į serverį
- serveris išduoda duomenis klientui
Tokiu būdu užklausos apdorojimo užduotis yra padalinta į logines dalis, kurių kiekviena yra atsakinga už savo modulį, savo „programinės įrangos plytelę“. Tiesą sakant, apdorojant užklausą gali būti daug daugiau veiksmų. Pavyzdžiui, už „GET“ ir „POST“ metodus gali būti atsakingi skirtingi moduliai.
Servleto sąsaja
Visiems šiems moduliams bendra yra tai, kad jie yra tarpusavyje sujungti naudojant javax.servlet.Servlet sąsają
Pažvelkime į šią sąsają. Jame išvardyti tik 5 būdai:
Public void init (ServletConfig config) meta ServletException Šis metodas iškviečiamas informuoti servlet, kad jis įjungtas kaip modulis aptarnauti kliento užklausas. Konfigūracijos parametras dalijasi javax.servlet.ServletConfig sąsaja, kuri neša informaciją apie serverio aplinką, serverio pavadinimą, pradinius parametrus ir kitas gėrybes. Javax.servlet.ServletConfig sąsaja bus aptarta šiek tiek toliau. Tikimasi, kad iškvietus šią funkciją servletas atidžiai išsaugos šią konfigūraciją kintamajame ir grąžins ją naudodamas kitą metodą: public ServletConfig getServletConfig() Gavęs sistemos informaciją naudodamas "getServletConfig()", serveris gali norėti žinoti autoriaus vardas, sukūrimo data, kita informacija apie servletą, kuri pasiekiama iškviečiant viešą eilutę getServletInfo()
Norėdami apdoroti užklausą ir gauti jos apdorojimo rezultatą, naudokite funkciją
Viešoji galios paslauga (ServletRequest užklausa, ServletResponse atsakymas) išmeta ServletException, java.io.IOException. Šioje funkcijoje kodui, kuris apdoros duomenis, perduodami du įrankiai: vienas duomenims gauti iš serverio, kitas rezultatui siųsti. servletas. Atitinkamai tai yra užklausos ir atsakymo parametrai, atskiriantys javax.servlet.ServletRequest ir javax.servlet.ServletResponse sąsajas Visas darbas su duomenimis atliekamas per šias sąsajas, todėl apie jas pakalbėkime vėliau.
Kai serveriui šio modulio nebereikia, iškviečiamas metodas
Viešoji galia sunaikinti(), kuri užbaigia visas servleto objekto operacijas.
ServletConfig sąsaja
4 metodai, kurių pavadinimai kalba patys už save, sudaro javax.servlet.ServletConfig sąsajos esmę:
Viešoji eilutė getServletName() public ServletContext getServletContext() vieša eilutė getInitParameter(Eilutės pavadinimas) vieša java.util.Enumeration getInitParameterNames()
Manau, kad visų funkcijų paskirtis yra aiški, išskyrus
Public ServletContext getServletContext() Šis metodas grąžina nuorodą į labai naudingą darbo su serveriu įrankį:
ServletContext sąsaja
ServletContext yra sąsaja, apibrėžianti prieigą prie šių naudingų funkcijų:
Viešasis objektas getAttribute(Eilutės pavadinimas) public java.util.Enumeration getAttributeNames() public void setAttribute(Eilutės pavadinimas, Objekto objektas) public void removeAttribute(Eilutės pavadinimas) Keturi darbo su atributais metodai. Atributų vaidmenį atlieka bet kuris bet kurios klasės objektas. Šių funkcijų tikslas – perkelti skirtingus objektus tarp nesusijusių servletų. public String getInitParameter(Eilutės pavadinimas) public java.util.Enumeration getInitParameterNames() Pasiekite parametrus, su kuriais buvo paleistas serveris. Čia taip pat gali būti pagrindinio kompiuterio pavadinimas, prievadas ir kita naudinga informacija. public int getMajorVersion() public int getMinorVersion() Pateikia Servlet API versijas. public String getMimeType(String file) Pateikia MIME tipą, susietą su failu, kurio kelias nurodytas failo kintamajame. Prisiminkite, kaip turėjote apibrėžti MIME programoje SimpleWEBServer ir įvertinkite patogumą! public java.util.Set getResourcePaths() public java.net.URL getResource(String path) meta java.net.MalformedURLException public InputStream getResourceAsStream(String path) Grąžina kelius į serveriui prieinamus išteklius ir pačius išteklius kaip URL ir kaip srautus duomenis. public RequestDispatcher getRequestDispatcher(path) public RequestDispatcher getNamedDispatcher(name) RequestDispatcher yra įrankis, skirtas užklausai persiųsti į kitą šaltinį. Šios funkcijos reikalingos norint gauti nurodytų išteklių įrankio objektą. Tai yra, tarkime, norėdami peradresuoti užklausą į servlet "sample1" iš servleto korpuso, galite tai padaryti: getServletConfig().getServletContext().getNamedDispatcher("sample1").forward(request, response);
Pati „RequestDispatcher“ klasė apima tik du metodus:
Public void forward (ServletRequest užklausa, ServletResponse atsakymas) meta ServletException, java.io.IOException public void include (ServletRequest užklausa, ServletResponse atsakymas) meta ServletException, java.io.IOException Be to, pirmasis skirtas užklausai peradresuoti, o antrasis vienas skirtas darbo rezultatui įtraukti į iškviestą servletą kaip dabartinį. Pavyzdžiui, servlet 1 išspausdina žodį "test 1", tada iškviečiamas servlet du, po kurio išspausdinamas žodis "test 2". „Servlet 2“ tiesiog išspausdina žodį „ir“. Servlet 1 išvestis bus eilutė "test 1 and test 2". public void log (String msg) Įrašykite ką nors į serverio žurnalą. public void log (Eilutės pranešimas, Metamas metamas) Apibrėžkite išimtį ir frazę, kuri bus įrašyta į žurnalą, kai bus gauta ši išimtis. public String getRealPath(String path) Paverčia kelią, pvz., "/index.html" į "http://host/contextPath/index.html" viešąją eilutę getServerInfo() Pateikia serverio pavadinimą. public ServletContext getContext(String uripath) Šis metodas leidžia keistis ServletContext tarp skirtingų išteklių tame pačiame serveryje. public String getServletContextName() Pateikia serverio, kuriam priklauso šis ServletContect sąsajos objektas, pavadinimą.
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:
Viešasis objektas getAttribute(Eilutės pavadinimas) public java.util.Enumeration getAttributeNames() public void setAttribute(String name, Object o) public void removeAttribute(java.lang.String name) public String getServerName() public RequestDispatcher getRequestDispatcher(String path)
Likę metodai leidžia patogiai dirbti su HTTP užklausos antrašte:
Viešoji eilutė getCharacterEncoding() public void setCharacterEncoding(String env) išmeta java.io.UnsupportedEncodingException Simbolių kodavimas HTTP antraštės laukuose. Funkcijos nurodo CGI užklausų iš %NN formos dekodavimo į įprastus simbolius metodą. Pavyzdžiui, kuris standartas - KOI8-R, windows-1251 ar UTF-8 turėtų būti naudojamas kirilicos simboliams iššifruoti. public int getContentLength() public String getContentType() Nuskaito HTTP užklausos laukus "Content-Length", "Content-Type". public jString getParameter(Eilutės pavadinimas) public java.util.Enumeration getParameterNames() public String getParameterValues(Eilutės pavadinimas) public java.util.Map getParameterMap() Funkcijos, skirtos gauti lauką iš HTTP antraštės ir jo reikšmę. public ServletInputStream getInputStream() meta java.io.IOException public java.io.BufferedReader getReader() meta java.io.IOException Gaukite gaunamų duomenų srautą arba jo skaitytuvą. Skaitytojas naudojamas tekstinei informacijai skaityti – jis automatiškai iššifruos eilutes pagal nurodytą simbolių rinkinį. Dėmesio! J2EE 1.3 versijoje yra rimta klaida: dekoduojant %25 simbolį (% simbolį Post and Get užklausose), Reader sukuria klaidą (klaida pastebėta Tomcat 4 ir Resign serveriuose). Gali būti, kad panaši klaida egzistuoja su kitais simboliais. public String getProtocol() Gaukite užklausos HTTP protokolo versiją (pvz., „HTTP/1.1“). public String getScheme() Grąžina užklausos schemos pavadinimą. Pavyzdžiui, „http“, „https“ arba „ftp“. public int getServerPort() public String getRemoteAddr() public String getRemoteHost() public loginis isSecure() Serverio prievadas, kliento IP adresas, kliento prieglobos pavadinimas ir ar ryšys saugus (per HTTPS) vieša java.util.Locale getLocale() vieša java .util.Enumeration getLocales() Kliento pageidaujama dokumento kalba (lauko „Accept-Language“ apdorojimo rezultatas)
„ServletResponse“ sąsaja
ServletResponse sąsaja yra duomenų siuntimo klientui įrankis. Visi šio įrankio metodai yra skirti būtent šiam tikslui:
Public java.lang.String getCharacterEncoding() public void setLocale(java.util.Locale loc) public java.util.Locale getLocale() Pirmasis metodas grąžina MIME kodavimo tipą (pvz., UTF8), kuriame bus rodoma informacija . Antrieji du metodai taip pat veikia su simbolių rinkiniu. Jie nurodo dokumente vartojamą kalbą (pavyzdžiui, rusų). public ServletOutputStream getOutputStream() išmeta java.io.IOException Pateikia servleto išvesties srautą. Šis srautas naudojamas, pavyzdžiui, dvejetainiams failams išvesti. Tekstinius duomenis galima išvesti naudojant java.io.Writer: public java.io.PrintWriter getWriter() išmeta java.io.IOException Šis metodas automatiškai konvertuoja eilutes į simbolių rinkinį, nurodytą getCharacterEncoding() ir getLocale() metoduose. public void setContentLength(int len) Šis metodas nustato HTTP antraštės lauko "Content-Length" reikšmę public void setContentType(String type) Metodas, skirtas dokumento MIME turinio tipui siųsti. HTTP antraštės laukas „Content-Type“. public void setBufferSize(int size) public int getBufferSize() public void flushBuffer() meta java.io.IOException public void resetBuffer() Faktas yra tas, kad išvesties srautas yra buferinis. Tai reiškia, kad kita duomenų dalis klientui bus išduodama tik užpildžius buferį. Šie metodai leidžia atitinkamai nustatyti siuntimo buferio dydį, gauti jo dydį, inicijuoti buferio turinio siuntimą klientui nelaukiant, kol jis bus užpildytas, taip pat išvalyti šį buferį nuo duomenų. public boolean isCommitted() Šis metodas gali būti naudojamas norint gauti vėliavėlę, rodančią, ar duomenų siuntimas klientui jau pradėtas. Vėliava bus teigiama, jei HTTP atsakymo antraštė jau išsiųsta. public void reset() Jei HTTP antraštė dar nebuvo išsiųsta, šis metodas „atkuria“ HTTP antraštės numatytąsias reikšmes.
Iš anksto nustatyti serverio tipai
„Java Servlet“ API, be pačios sąsajos, taip pat turi keletą servletų klasių, kurios gali būti jūsų programų pagrindas.
Pagrindinė visų šių klasių klasė yra abstrakčioji klasė javax.servlet.GenericServlet:
Viešoji abstrakčioji klasė „GenericServlet“ įgyvendina „Servlet“, „ServletConfig“, java.io.Serializable
Kaip matote iš šios klasės apibrėžimo, ji turi visus „Servlet“ ir „ServletConfig“ sąsajų metodus. Vienintelis neįgyvendintas metodas buvo
Vieša abstrakčių galių paslauga (ServletRequest req, ServletResponse res) išmeta ServletException, java.io.IOException, kuri buvo paskelbta abstrakčia.
Remiantis šia klase, buvo sukurta kita abstrakti klasė - javax.servlet.http.HttpServlet:
Viešoji abstrakčioji klasė „HttpServlet“ išplečia „GenericServlet“ įgyvendina java.io.Serializable
Ši klasė buvo sukurta pagal „dar daugiau patogumo programuotojui“ koncepciją ir turi daug naudingų metodų:
Protected void doDelete(HttpServletRequest req, HttpServletResponse resp) meta ServletException, java.io.IOException protected void doGet(HttpServletRequest req, HttpServletResponse resp) meta ServletRequest resp.HevletResponse q, HttpServletResponse resp ) išmeta ServletException, java .io.IOException protected void doOptions(HttpServletRequest req, HttpServletResponse resp) išmeta ServletException, java.io.IOException Protected void doPost(HttpServletRequest req, HttpServletResponse Protected ServletEx) „ServletRequest“ užklausa, resp.) išmeta ServletException, java.io.IOException protected void doTrace (HttpServletRequest req, HttpServletResponse) meta ServletException, java.io.IOException apsaugotą negaliojančią paslaugą (HttpServletRequest req, HttpServletRequest (ServletRequest req , ServletResponse res) pateikia ServletException, java.io.IOException Įvairių parinkčių paslaugą (ServletRequest req, ServletResponse res) skirtingiems HTTP metodams nuo DELETE ir GET iki PUT ir TRACE. O norint patogiai gauti duomenis per CGI sąsają neiššifruojant antraštės, buvo sukurtos HttpServletRequest ir HttpServletResponse klasės, įtrauktos su HttpServlet į javax.servlet paketą.http apsaugotas ilgai getLastModified(HttpServletRequest grąžina paskutinio užklausos laiką) HttpServletRequest objekto modifikavimas. Tai paima laiko reikšmę iš HTTP užklausos antraštės lauko „Data“. Jei laukas nerastas, jis grąžina -1.
Atitinkamai, mes analizuosime HttpServletRequest ir HttpServletResponse sąsajas. Jie yra atitinkamai ServletRequest ir ServletResponse palikuonys.
HttpServletRequest, be metodų, paveldėtų iš ServletRequest, taip pat turi šiuos naudingus metodus:
Cookie getCookies() Grąžina slapukų rinkinį, kurį klientas siunčia serveriui.
Slapukų klasėje, įtrauktoje į tą patį javax.servlet.http paketą, yra visa įmanoma informacija apie slapuką. Svarbiausi šios klasės metodai yra
Int getMaxAge() String getName() String getValue(), kuri atitinkamai grąžina, kiek šiam slapukui liko gyvuoti, slapuko pavadinimą ir vertę. Taip pat slapukas (Eilutės pavadinimas, eilutės reikšmė) void setValue (Eilutė nauja vertė) void setMaxAge(int expiry), kad sukurtumėte slapuką, nustatytumėte jo vertę ir maksimalų amžių. long getDateHeader(String name) Grąžina datą iš HTTP antraštės, jei tokia yra. int getIntHeader(java.lang.String name) Grąžina skaitinę lauko pavadinimu name reikšmę iš HTTP užklausos antraštės String getMethod() Pateikia HTTP užklausos metodą. Eilutė getQueryString() String getRequestURI() StringBuffer getRequestURL() Pateikia eilutę, esančią dokumento URL po simbolio "?", dokumento URI ir visą URL. HttpSession getSession() HttpSession getSession(loginis sukurti) loginis isRequestedSessionIdFromCookie() loginis isRequestedSessionIdFromURL() loginis isRequestedSessionIdValid() Functions. leidžiantis dirbti su tokiu svarbiu duomenų perdavimo mechanizmu kaip seansai.
Seansai reikalingi duomenims perkelti iš vieno puslapio į kitą vartotojui. Pavyzdžiui, vartotojas nueina į puslapį (1), kur jam siunčiami tam tikri duomenys apie (2) puslapį, o tas puslapis išsaugo kai kuriuos kitus (3) puslapio duomenis.
Iš principo (1) puslapyje galite siųsti duomenis vartotojui, tada juos gauti (2) puslapyje, ką nors pridėti, išsiųsti vartotojui... Taip pat turėsite nuolat siųsti visą duomenų rinkinį iš klientas į serverį ir atgal, daug kartų. Be to, kad toks persiuntimas ne visada patogus, jis dar ir suvalgo srautą.
Tą patį galite padaryti ir kitaip – naudokite seanso mechanizmą. Šis mechanizmas veikia taip: serveris išsaugo vartotojo atsiųstus duomenis atskirame faile – seanso faile. Visi duomenų keitimo darbai bus atliekami su šio failo turiniu. Klientui suteikiamas „seanso raktas“ (dar žinomas kaip seanso raktas, taip pat žinomas kaip seanso ID) – unikali rodyklė į failą, kuriame yra konkrečiai šiam vartotojui skirti duomenys. Dabar, norint gauti visus su šiuo klientu susijusius duomenis, serveriui tereikia žinoti seanso raktą. Šio metodo pranašumas yra jo naudojimo patogumas ir greitis.
Tai visi pagrindiniai HttpServletRequest sąsajos metodai. Išsamų metodų sąrašą rasite „Java Servlet“ API dokumentacijoje.
Dabar apie HttpServletRequest sąsają. Pagrindinis skirtumas tarp klasių, kurios dalijasi šia sąsaja, yra tas, kad duomenys rodomi ne iš karto. Pirma, visi duomenys surenkami į HTTP atsakymą. Atsakymas siunčiamas tik užbaigus HttpServlet.service().
Taigi, apie metodus:
Void addHeader(Eilutės pavadinimas, eilutės reikšmė) void addIntHeader(Eilutės pavadinimas, int reikšmė) void addDateHeader(Eilutės pavadinimas, ilga data) Metodai prideda parametrus prie HTTP antraštės. Paskutinis metodas nustato parametrą "Data". void addCookie (slapuko slapukas) Metodas prideda slapuką prie antraštės loginės reikšmės yra Header(String name) Leidžia žinoti, ar antraštėje jau yra nurodytas parametras. Eilutė encodeURL(String url) Eilutė encodeRedirectURL(String url) Pirmasis metodas koduoja simbolius naudojant %NN pakeitimą. Antrasis metodas daro tą patį ir iškviečia void sendRedirect(String location) void setStatus(int sc) void sendError(int sc) void sendError(int sc, String msg) Pirmasis nustato grąžinimo kodą, antrieji du siunčia klaidos pranešimą . Sąsaja nurodo tokias galimas sc parametro klaidas, atitinkančias HTTP protokolo grąžinimo kodus: SC_CONTINUE – būsenos kodas (100) SC_SWITCHING_PROTOCOLS – būsenos kodas (101) SC_OK – būsenos kodas (200) SC_CREATED – būsenos kodas (201) – SC_ACCEPTED. Būsenos kodas (202) SC_NON_AUTHORITATIVE_INFORMACIJA – Būsenos kodas (203) SC_NO_CONTENT – Būsenos kodas (204) SC_RESET_CONTENT – Būsenos kodas (205) SC_PARTIAL_CONTENT – Būsenos kodas (206) SC_MULTIPLE.0 – Būsenos kodas (206) SC_MULTIPLE tus kodas (301) LAIKINAI - Būsenos kodas (302) SC_SEE_OTHER – Būsenos kodas (303) SC_NOT_MODIFIED – Būsenos kodas (304) SC_USE_PROXY – Būsenos kodas (305) SC_BAD_REQUEST – Būsenos kodas (400) SC_UNAUTHORIZED – Būsenos kodas (401) –BŪSENOS kodas (401_DENC) – Būsena kodas (403) OT_FOUND – Būsenos kodas (404) SC_METHOD_NOT_ALLOWED – Būsenos kodas (405) SC_NOT_ACCEPTABLE – Būsenos kodas (406) SC_PROXY_AUTHENTICATION_REQUIRED – Būsenos kodas (407) SC_REQUEST_TIME _DYGĖ – būsenos kodas (410 SC_LENG) TH_REQUIRED – Būsenos kodas (411) SC_PRECONDITION_FAILED – Būsenos kodas (412) SC_REQUEST_ENTITY_TOO_LARGE – Būsenos kodas (413) SC_REQUEST_URI_TOO_LONG – Būsenos kodas (414) – Būsenos kodas (414) REQUESTED_RANGE_NOT_SATISFIABLE – Būsenos kodas (41 6) SC_EXPECTATION_FAILED – Būsena kodas (417) SC_INTERNAL_SERVER_ERROR - Būsenos kodas (500) SC_NOT_IMPLEMENTED - Būsenos kodas (501) SC_BAD_GATEWAY - Būsenos kodas (502) SC_SERVICE_UNAVAILABLE - Būsenos kodas (503) SC_GATEWAY_NOTED -_4 Statusas_ tus kodas (505)
Tai viskas, ką galima pasakyti apie „HttpServletResponse“.
Servletų naudojimas WEB programose
Dabar pakalbėkime apie servletų naudojimą WEB programose. Norėdami tai padaryti, pateiksiu du naudingus pavyzdžius, kurie gali būti naudingi praktikoje.
Pirmame pavyzdyje pateikiami darbo su HttpServlet metodai ir HTML puslapio turinio išvedimas suglaudinta forma. Teoriškai HTML puslapis naršyklės atsakyme rodomas paprastu tekstu, tačiau norėdami sumažinti siunčiamų duomenų kiekį, galite naudoti GZIP glaudinimą. Šiuolaikinės naršyklės (bent jau 4 kartos ir aukštesnės kartos naršyklės) palaiko šį tekstinės informacijos siuntimo būdą ir rodys puslapį taip, lyg jis nebūtų suspaustas.
importuoti java. io.* ; importuoti javax. servletas.* ; importuoti javax. servletas. http.* ; importuoti java. util. užtrauktukas.* ; // servletas yra HttpServlet palikuonis viešoji klasė ZipServlet išplečia HttpServlet ( // GET metodo apdorojimo funkcija public void doGet (HttpServletRequest užklausa, HttpServletResponse atsakymas) išmeta ServletException, IOException ( // nustatyti, kad puslapis yra HTML dokumentas atsakymą. setContentType("text/html" ); // paimkite parametrą „Accept-Encoding“ iš HTTP antraštės Eilučių koduotės = užklausa. getHeader("Priimti-Kodavimas" ); // paimkite parametrą "encoding" - anksčiau nurodytą dokumento kodavimą Eilutė encodeFlag = užklausa. getParameter("kodavimas"); // Kur išvesime PrintWriter out; // jei užklausoje yra laukas „Accept-Encoding“. if (kodavimas != null) ( // ir jei šiame lauke yra reikšmė „gzip“, o kodavimas dar nenustatytas, if ((kodavimo. indexOf("gzip" ) != - 1 ) &&! encodeFlag. equals("none" )) ( // tada kur išvesime bus vienas ir suglaudinsime tekstą naudodami GZIP out = new PrintWriter(new GZIPOutputStream(response. getOutputStream()) , false); // ir nustatykite naršyklės vėliavėlę, kad dokumentas bus suglaudintas atsakymą. setHeader("Turinio kodavimas" , "gzip" ); ) kitu atveju = atsakymas. getWriter(); ) Kitas // kitaip išvesime be suspaudimo out = atsakymas. getWriter(); išeiti. println("Tai testas!!!" ); // parašyti dokumento turinį išeiti. Uždaryti(); // ir uždarykite išvestį. //Štai, įvykdžius šią funkciją, dokumentas bus išsiųstas } }Antrame pavyzdyje parodyta, kaip servlet gali būti naudojamas nuolatiniam puslapiui rodyti. Tokio tipo puslapio rodymas gali būti naudojamas, pavyzdžiui, pokalbiuose: norint skaityti naujas žinutes, nereikės kaskart atnaujinti puslapio, laikui bėgant tiesiog bus atsisiunčiamos naujos žinutės. Reikėtų atsižvelgti į tai, kad kai kurie tarpiniai serveriai nepalaiko tokio tipo duomenų perdavimo, tačiau, deja, nieko negalima padaryti.
importuoti java. io.* ; importuoti javax. servletas.* ; // programa įgyvendina Servlet sąsają klasė DoloadServlet įgyvendina Servlet ( ServletConfig config; // ServletConfig objektas viešas DoloadServlet() () // nieko nedaryti // išsaugokite konfigūraciją inicijavimo metu public void init(ServletConfig config) išmeta ServletException (ši. config = config;) // grąžina išsaugotą konfigūraciją vieša ServletConfig getServletConfig() ( grąžinti konfigūraciją;) // informacija apie servletą public String getServletInfo() ( grąžinti "DoloadServlet" ;) public void demontuoti() () // nieko nedaryti // Apdorojama užklausa viešoji galios paslauga (ServletRequest užklausa, ServletResponse atsakymas) išmeta ServletException, java. io. IOException( // mes nenagrinėsime užklausos, tik iš karto // sukurti HTTP antraštę: String head = "HTTP/1.0 200 OK\n" + + "Serveris: DoloadServlet\n" + "Turinio tipas: tekstas/html; charset=UTF-8\n"+ "Ryšys: Keep-Alive\n" + "Turinio kodavimas: kelių dalių / mišrus\n"+ "Perdavimo kodavimas: suskirstytas" + "Pragma: be talpyklos\n\n" ; // dabar pridėkite pradinius duomenis // Šiam pavyzdžiui - 20 žymų "“ su eilutės pertrauka už (int i = 0 ; i< 20 ; i++ ) head = head + "
\n" ; // paimkite išvesties srautą ServletOutputStream os = atsakymas. getOutputStream(); // ten parašykite antraštę ir pradinius duomenis os. spaudinys (galva); // nusiųsti viską, kas įrašyta buferyje, klientui atsakymą. flushBuffer(); // pradėkite pridėti naujų eilučių: // šios eilutės atrodys taip: eilutės numeris, tada "
\n" // kiekviena nauja eilutė bus rodoma kartą per 3 sekundes int i = 0; kol (tiesa) ( // skaitiklio prieaugis i++ ; // parašyti eilutę os. print ("" + i+ "
\n" ); // buferio atsako išplovimas. flushBuffer(); // užšaldykite srautą 3 sekundėms pabandyti ( miegoti(3000 );) pagauti (išimtis e)() ) )
Belieka pasakyti, kad servleto mechanizmas yra labai lankstus ir leidžia atlikti dalykus, kuriems gali prireikti parašyti atskirą WEB serverį (kaip, pavyzdžiui, papildymo servleto atveju). Servletų minusas – mažas pirmojo paleidimo greitis (servletą tiesiog sukompiliuoja JIT mašina), didelis atminties suvartojimas ir visų Java programų trūkumas – mažas darbo su eilėmis greitis. Pastaroji aplinkybė tampa pastebima dirbant su servletais, kurie priima tekstinius duomenis POST užklausose. 50 kb dydžio POST užklausa „HttpServlet“, kai ji analizuojama naudojant HttpServletRequest.getReader(), gali kelioms minutėms paralyžiuoti serverį. Tas pats pasakytina ir apie kitas Java programas.
Pateiksiu du nedidelius pavyzdžius:
// suteikta eilutė Eilutės tekstas // 1 pavyzdys // darbas su eilute naudojant "+" operaciją, skirtą String Eilutės testas1 = "" ; už (int i = 0 ; i< text. length(); i++ ) test1 += text. charAt(i); // 2 pavyzdys // darbas su eilute naudojant buferį char buf = naujas char [ tekstas. ilgis()]; už (int i = 0 ; i< text. length(); i++ ) buf[ i] = text. charAt(i); String sample2 = new String(buf);Jei imsite mažas eilutes - iki 2-3 kb, tada pavyzdžių darbo skirtumai yra nereikšmingi, tačiau jei imsite bent 10 kb dydžio teksto eilutę, pirmuoju atveju programa veiks su styga daug lėtesnė. Tai yra „Java“ savybė ir yra problema įgyvendinant „String“ klasės funkcijas. Taigi, jei norite parašyti greitą servletą, venkite dirbti su ilgomis eilutėmis naudodami klasę String, naudokite, pavyzdžiui, klasę StringBuffer. Šis įspėjimas visų pirma taikomas gaunant didelius tekstus iš tinklo ir apdorojant vietinius failus (pavyzdžiui, kai yra svečių knygos teksto duomenų bazė su daugybe pranešimų).
Kita problema susijusi su WEB sistemos kelių užduočių atlikimu. Nepamirškite, kad jūsų servleto vienu metu gali prašyti keli vartotojai. Dažnai kyla problemų dėl duomenų sinchronizavimo, informacijos apsikeitimo tarp skirtingų to paties servleto skaičiavimo gijų, o dažniausia problema yra sinchroninės prieigos prie failų ir kitų įvardytų sistemos išteklių problema. Pavyzdžiui, viena programa atidarė failą skaitymui, o kita bando ten ką nors įrašyti. Dėl to antroji programa arba gauna išimtį, arba laukia, kol failas bus laisvas rašyti. Šiuo atžvilgiu norėčiau atkreipti jūsų dėmesį: nepalikite neuždarytų siūlų ir uždarykite siūlus, kai tik jų nebereikia. Srautas, žinoma, vėliau užsidarys automatiškai, bet tai įvyks tik tada, kai prie jo pateks šiukšlintuvas, o tuo tarpu antra programa vis tiek neturės rašymo prieigos prie failo.
Be kelių užduočių, norėčiau pažymėti, kad naudojant „ServletContext“ sąsajos metodus „Object getAttribute(String name)“ ir „void setAttribute(String name, Object object)“, galite keistis duomenimis tarp servletų, įskaitant sinchronizavimo.