Servlet - je Java-nporpaMMa koja koristi klasu HttpServiet. Servlet se koristi za proširenje mogućnosti postojećeg servera, posebno Web servera. Tipično, servlet radi na namjenskom serveru. Ovi serveri se zovu Java aplikacijski serveri. Java server aplikacija uključuje Web server kao gradivni blok (ponekad ne jedan, već nekoliko), kao i servere koji rade sa komponentama servera, servere za pomoćne usluge, itd. Servlet radi u okruženju koje obezbeđuje server. Dio servera posvećen posluživanju servleta naziva se servlet kontejner. Specifikacija servleta pretpostavlja da klasa servleta ima standardne metode koje se izvršavaju u nekom trenutku životnog ciklusa servleta. Ove metode poziva kontejner servleta. Implementacija specifikacije servleta je uključena u skup standardnih Java jezičkih paketa.
Ova knjiga se fokusira na Java aplikacijski server pod nazivom Blazix. Blazix Server pruža kompletan skup mogućnosti servleta. Pored kreiranja klase (ili klasa) servleta, kao i konfigurisanja kreiranog servlet programa i njegovog instaliranja na server, potrebno je da promenite konfiguracioni fajl Web servera. Glavne vrijednosti su navedene u konfiguracijskoj datoteci na sljedeći način: servlet.name: myservlet
servlet.myservlet.className: mypackage.MyServletClass servlet.myservlet.url: /mysrvlet
Svaki servlet mora imati ime(servlet.name), po kojem je identificiran na serveru. Ovo ime se koristi za postavljanje svojstava servleta, posebno za označavanje naziva klase u kojoj je program servleta pohranjen (sljedeći red), kao i adrese na kojoj se ovaj servlet poziva (treći red).
Klijent traži od Web servera adresu na kojoj se servlet nalazi (adresa mora biti navedena kao vrijednost servlet.myservlet.url u konfiguracijskoj datoteci web servera). Server prosljeđuje zahtjev i podatke (ako ih ima) servletu, prima odgovor od servleta i šalje ga klijentu.
Na ovom objašnjenju šta je servlet, moglo bi se završiti. Međutim, postoji mnogo zanimljivih i korisnih detalja na koje biste trebali obratiti pažnju i detaljnije ih proučiti.
Posebno je važno imati na umu da staza klase servleta mora biti navedena u varijabli ciasspath, ili se može postaviti u direktorij C:\Blazix\classes ili u direktorij naveden u konfiguracijskoj datoteci web servera kao vrijednost server.ciassDir. Nakon što je konfiguracijski fajl modificiran da uključuje informacije o novom servletu, poslužitelj mora biti zaustavljen i ponovo pokrenut. Servlet se takođe može hostovati na pokrenutom serveru pomoću administrativnog uslužnog programa, ali da bi se to uradilo, servlet mora biti upakovan u datoteku WAR Web arhive. Ako se datoteka klase servleta promijenila, nije potrebno zaustaviti server i pokrenuti ga ponovo. Po defaultu, server je konfiguriran tako da pozivanje servleta na http://localhost:81/_reload uzrokuje ponovno učitavanje svih klasa i modificirana klasa servleta postaje dostupna za zahtjeve klijenta (slika 4-1). Posjetite ovu stranicu nakon što je datoteka klase servleta izmijenjena. Zaustavljanje servera jednostavno nije potrebno.
Ako je čitalac već imao iskustva sa servletima, cijenit će jednostavnost Blazix servera u poređenju sa drugim Java serverima, kao što je Tomcat server.
Da biste odmah prešli na posao, razmotrite jednostavan primjer, servlet neki Servlet (listing 4.1).
Listing 4.1. Servlet SomeServlet.java I
import java.io.*; import javax.servlet.*; import javax.servlet.http.*;
javna klasa SomeServlet proširuje HttpServlet ( public void doGet(HttpServletRequest zahtjev,
HttpServletResponse odgovor) izbacuje ServletException, IOException ( Printwriter out = response.getWriter(); out.println("Hello World");
U konfiguracijski fajl web servera napišite sljedeće:
servlet.name: prvi
servlet.first.className: SomeServlet
servlet.first.url: /dofirst
Tada će poziv servleta iz pretraživača poprimiti oblik http://localhost:81 /dofirst (slika 4.2).
Java servleti pružaju metodu nezavisnu od platforme za pravljenje web aplikacija (ovo nije sigurno, ali nećemo dalje ulaziti u ovu temu, jer bismo tada morali definirati šta se podrazumijeva pod web aplikacijom, koja nije uključena u lista pokrivenih tema), a mnoge aplikacije su brze za rad i nemaju ograničenja CGI aplikacija. Servlet radi pod web serverom i, za razliku od apleta, ne zahtijeva grafičko korisničko sučelje. Servlet komunicira sa serverom tako što s njim razmjenjuje zahtjeve i odgovore. Klijentski program postavlja zahtjeve serveru. Zahtjev obrađuje server, prosljeđuje se servletu, servlet šalje odgovor klijentu preko servera. Servleti su danas vrlo popularni za izgradnju interaktivnih web aplikacija. Postoji mnogo Web servera koji mogu raditi sa servletima, kao što su Tomcat, iPlanet Web Server (ranije Netscape
Enterprise Server), Blazix. J Builder Enterprise koristi Borland Enterprise Server (BES) uključen u paket i takođe podržava web serveri Logic, WebSphere i iPlanet. J Builder Enterprise Server uključuje Tomcat server koji se koristi "podrazumevano".
Rice. 4.2. Pozivanje servleta
Jedna važna prednost servleta je njihova brzina. Za razliku od CGI aplikacija, servleti se samo jednom učitavaju u memoriju i zatim se izvršavaju direktno iz memorije. Servleti su u suštini aplikacije sa više niti. Osim toga, oni su nezavisni od platforme, jer su napisani na Javi.
JSP tehnologija kojoj Poglavlje 3, je proširenje servlet tehnologije, u JSP-u Posebna pažnja fokusira se na rad sa HTML i XML dokumentima. Kao dio HTML i XML koda, JSP fragmenti nalaze svoju najčešću upotrebu. Kako napraviti izbor i odlučiti šta koristiti: servlete ili serverske stranice? Servleti su prikladniji za rješavanje programskih zadataka niskog nivoa, a manje za rješavanje zadataka kreiranja logike prezentacije aplikacije. JSP-ovi na strani servera, s druge strane, uglavnom su fokusirani na to kako korisniku predstaviti rezultat na najprikladniji način. Stranice servera se kreiraju u liniji sa HTML kodom koristeći stil izrade HTML dokumenta. JSP tehnologija pruža mnogo bogatije karakteristike od običnog HTML-a. JSP-ovi mogu pružiti mogućnost implementacije logike aplikacije koristeći jednostavne Java bean-ove kao i EJB-ove na strani servera kreiranjem prilagođenih biblioteka prečica. Same po sebi, Java serverske stranice mogu biti modularne komponente za višekratnu upotrebu koje rade sa logikom prezentacije koje se mogu koristiti u sprezi sa raznim šablonima i filterima. JSP-ovi se konvertuju u servlete, tako da teoretski možete koristiti samo servlete. Međutim, JSP tehnologija je dizajnirana da pojednostavi proces kreiranja Web dokumenata odvajanjem logike prezentacije aplikacije od sadržaja dokumenta. U većini slučajeva, odgovor koji se šalje klijentu sastoji se od šablona za prezentaciju dokumenata i podataka koji se automatski generišu popunjavanjem predloška. U ovim situacijama, mnogo je lakše raditi sa JSP-ovima nego sa servletima.
Jedna od najprijatnijih karakteristika Jave je njena višestruka priroda. Naravno, stvaranje tradicionalnih desktopa i čak mobilne aplikacije- Ovo je kul. Ali šta ako želite da izađete sa utabane staze i uđete u teritoriju Java web razvoja? Za tebe tamo dobre vijesti: Jezik dolazi sa kompletnim Servlet API-jem koji vam omogućava da napravite robusne web aplikacije bez previše muke.
Izrada Java aplikacija sa servletima
Dakle, već smo kreirali konfiguracijske datoteke aplikacije. Međutim, u svom trenutnom stanju, bukvalno ništa ne radi. Želimo da klijenti mogu da se registruju sa HTML formom, tako da sledeća stvar koju treba da uradimo je da kreiramo JSP fajlove koji će prikazati gornji obrazac i detalje o klijentu kada registracija bude uspešna. Ovo ćemo sada uraditi.
Radim na izgledu
Izgled aplikacije će biti definisan sa dva JSP fajla - u kontekstu MVC-a oni se zovu pogledi. Prvi će biti odgovoran za prikaz obrasca za registraciju i moguće greške pozvan nakon provjere unesenih podataka. Druga će biti uobičajena stranica dobrodošlice koja će prikazati podatke koje je korisnik unio nakon uspješnog završetka procesa registracije.
Ovo je prvi JSP fajl:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Registracija
$(kršenje).
Datoteka sadrži jednostavan HTML sa nekoliko dodataka. To je ljepota JSP-a u kombinaciji sa JSTL-om i JEL-om. Obratite pažnju na to kako je lako provjeriti greške u validaciji koristeći standardne oznake kao što je<с:if>i
Atribut akcije obrasca za registraciju upućuje na sljedeći URL: $(pageContext.request.contextPath)/processcustomer . To znači da svaki put kada se klijent pokuša registrovati, podaci će biti poslani obrađenom kupcu bez obzira na URL na kojem je obrazac dostupan. Ovo se postiže kroz funkcionalnost objekata dostupnih iz JSP datoteke, kao što je request .
Uskoro ćemo vidjeti kako se servlet vezuje za URL korisnika procesa i kako stupa u interakciju sa ulazom. Za sada, pogledajmo JSP fajl koji je odgovoran za stranicu dobrodošlice:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Hvala na registraciji!
Vaši uneseni podaci:
ime:$(ime)
Prezime:$(prezime)
Email:$(e-pošta)
Sada kada smo se pozabavili renderiranjem stranica, sljedeći korak je kreiranje servleta odgovornog za prikupljanje podataka klijenta iz POST zahtjeva i provjeru podataka na jednostavan način.
Pišemo kontroler
Pisanje servleta koji može primati podatke iz obrasca za prijavu je jednostavno kao i ljuštenje krušaka. Sve što treba da uradimo je da napišemo podklasu klase HttpServlet i implementiramo njene doGet() ili doPost() metode (ili obe ako je potrebno). U ovom slučaju, servlet će komunicirati s podacima koji dolaze iz POST zahtjeva.
Evo kako to izgleda:
@WebServlet(name = "CustomerController", urlPatterns = "/processcustomer") javna klasa CustomerController proširuje HttpServlet ( @Override zaštićeni void doPost(HttpServletRequest zahtjev, HttpServletResponse odgovor) baca ServletException customer (IOuExstouRequest customer (IOuExstouRequest customer.); .setAsRequestAttributes(request); Lista povreda = customer.validate(); if (!violations.isEmpty()) ( request.setAttribute("prekršaji", prekršaji); ) String url =determinUrl(prekršaji); request.getRequestDispatcher(url ).proslijedi(zahtjev, odgovor); ) privatni String odrediUrl(Lista kršenja) (if (!violations.isEmpty()) (vrati "/"; ) else (vrati "/WEB-INF/views/customerinfo.jsp"; ) ) privatna statička klasa RequestCustomer ( privatna konačna string ime; privatna konačna string prezime; privatna konačna string adresa e-pošte; privatni zahtjev kupca (string ime, string prezime, string email) ( this.firstName = firstName; th is.lastName = prezime; this.email = email; ) public static RequestCustomer fromRequestParameters(HttpServletRequest request) (vrati novi RequestCustomer(request.getParameter("firstname"), request.getParameter("prezime"), request.getParameter("email")); ) public void setAsRequestAttributes(Http request) ( request.setAttribute("firstname", firstName); request.setAttribute("prezime", prezime); request.setAttribute("email", email); ) public List validate() (Prekršaji liste = new ArrayList<>(); if (!StringValidator.validate(firstName)) (ruptus.add("Ime je obavezno polje"); ) if (!StringValidator.validate(lastName)) (spheres.add("Prezime je obavezno polje") ; ) if ( !EmailValidator.validate(email)) ( povrede.add("E-pošta mora biti dobro oblikovana"); ) vraća kršenja; ) ) )
Prva stvar koju ovdje treba primijetiti je korištenje @WebServlet(name ="CustomerController", urlPatterns = "/processcustomer") napomene. Govori kontejneru servleta da koristi klasu CustomerController za rukovanje HTTP zahtjevima za /processcustomer. Isti efekat se može postići dodavanjem direktiva za mapiranje servleta u web.xml kao što je , ali pošto koristimo specifikaciju servleta 3.1, ne moramo da pribegavamo ovoj metodi.
Ovdje smo servlet nazvali CustomerController jer se smatra dobrom praksom da se koristi ime klase servleta kao vrijednost atributa name u napomeni @WebServlet. U suprotnom, neki kontejneri se neće uskladiti, što će rezultirati greškom 404.
Sama klasa CustomerController obavlja nekoliko jednostavnih zadataka. Prvo, prikuplja unos obrasca koristeći implementaciju sučelja HttpServletRequest, koji sadrži vrijednosti koje odgovaraju poljima imena, prezimena i e-pošte obrasca. Zatim postavlja te vrijednosti kao atribute upita tako da se mogu ponovo prikazati ili na obrascu ili na stranici s rezultatima. Na kraju, validatori provjeravaju ispravnost unesenih podataka.
Validatori su jednostavne klase koje provjeravaju određena svojstva, kao što je da li je string prazan ili da li e-pošta izgleda kao e-mail. Na autorskom GitLabu možete vidjeti njihovu implementaciju.
Rezultat validacije utječe na daljnji tok događaja: ako podaci nisu valjani, klijent se preko RequestDispatcher objekta preusmjerava na stranicu za registraciju, gdje se prikazuju odgovarajuće greške. Ako je sve u redu, prikazuje se stranica dobrodošlice.
Dakle, kreirali smo kompletnu Java web aplikaciju koja vam omogućava da registrujete klijente koristeći HTML obrazac, osnovni servlet i nekoliko JSP datoteka. Vrijeme je da ga pokrenete.
Pokretanje aplikacije
Da biste pokrenuli aplikaciju, potrebno je da uradite sledeće korake:
IntelliJ IDEA). Kada implementirate projekat i pokrenete ga, podrazumevani pretraživač bi trebalo da se pokrene sa prozorom za prijavu.
Zaključak
Dakle, stekli ste sve vještine koje su vam potrebne za kreiranje vlastite Java web aplikacije bez potrebe da pribjegavate složenim okvirima. Sve što vam treba je Servlet API, tehnologija poput JSP-a za renderiranje i ugrađeni Java objekti. Odlično je, zar ne?
Vrijedi napomenuti da implementacija CustomerController klase ističe prednosti i nedostatke servleta: s jedne strane, ukratko pokazuje koliko je lako obraditi parametre zahtjeva i slati odgovore klijentu u različitim formatima. Ali ova funkcionalnost ima svoju cijenu: obje implementacije sučelja HttpServletResponse i HttpServletResponse su redovni lokatori usluga. Ovo ne znači da je ovo loše, jer lokatori jednostavno sadrže podatke. Međutim, imajte na umu da će ove implementacije uvijek biti vezane za servlet.
Servlet je java program koji radi na strani servera web aplikacije. Baš kao što apleti dinamički proširuju funkcionalnost web pretraživača, servleti dinamički proširuju funkcionalnost web servera.
rad servlet"i može se opisati na sljedeći način: kada zahtjev stigne od klijenta, Web server može odrediti koji servlet treba izvršiti pomoću posebne konfiguracijske datoteke. Nakon toga, Web server pokreće JVM, koji zauzvrat izvršava servlet. Servlet obrađuje zahtjev i prosljeđuje sadržaj web servera (moguće u obliku HTML stranice) Web server šalje odgovor (HTML stranicu koju je generirao servlet) klijentu.
WEB server je u suštini neka vrsta kontejnera koji se preuzima servlet"s, izvršava ih i, nakon što dobije rezultat od njih, šalje ga klijentu.
Servlet u arhitekturi web aplikacija
Zbog svoje snage i fleksibilnosti, servlet"s može igrati značajnu ulogu u arhitekturi sistema. Mogu obavljati zadatke aplikacije namijenjene srednjem sloju, djelovati kao proxy server za klijenta, pa čak i poboljšati funkcionalnost srednjeg sloja dodavanjem podrške za nove protokole i Srednji sloj djeluje kao aplikacijski server u takozvanom troslojnom klijent-server sistemu i nalazi se između "laganog" klijenta, kao što je web pretraživač, i izvora podataka.
Servlet kao proxy
Da bi podržali aplete, servleti mogu djelovati kao njihovi proxy serveri. Ovo može biti važno jer Java sigurnosni sistem dozvoljava samo apletima da se povežu na server sa kojeg su preuzeti. Ako aplet treba da se poveže sa serverom baze podataka koji se nalazi na drugom računaru, servlet može kreirati ovu vezu za aplet.
Privremeno i trajno servlet"s
Servleti se mogu pokrenuti i zaustaviti za svaki zahtjev klijenta. Oni se također mogu pokrenuti kada se web server pokrene i postoje dok se ne zaustavi. Privremeno servlet"s se učitavaju na zahtjev i nude dobar način za očuvanje resursa servera za funkcije koje se rijetko koriste. Trajni servleti se učitavaju kada se web server pokrene i traju dok se ne zaustavi. Servleti se instaliraju kao trajne ekstenzije na server ako je cijena pokretanja oni su veoma visoki (npr. uspostavljanje veze sa bazom podataka) ako nude trajnu funkcionalnost na strani servera (npr. RMI usluga) ili u slučajevima kada moraju odgovoriti na zahtjeve klijenta što je brže moguće. Ne postoji poseban kod za dodjelu servlet"ali trajno ili privremeno; ovo je funkcija podešavanja web servera.
Životni ciklus servleta, javax.servlet.Servlet
Servleti se pokreću na platformi web servera kao dio istog procesa kao i sam web server. Web server je odgovoran za inicijalizaciju, pozivanje i uništavanje svake instance servleta. Web server komunicira sa servletom preko jednostavnog interfejsa: javax.servlet.Servlet.
Interfejs javax.servlet.Servlet uključuje tri glavne metode:
- u tome()
- usluga()
- uništiti()
i dvije pomoćne metode:
- getServletConfig()
- getServletInfo()
Sličnosti između interfejsa servlet"a Java aplet je očigledan. Tako je dizajniran! Java servleti su za web servere ono što su apleti za web pretraživače. Aplet radi u web pretraživaču, izvršavajući akcije na svoj zahtjev preko posebnog interfejsa. Servlet radi isto kada radite na web serveru.
Inicijalizacija servleta, init() metoda
Prvi put kada se servlet učita, poziva se init() metoda. Ovo omogućava servletu da obavi bilo kakav instalacijski rad, kao što je otvaranje datoteka ili povezivanje sa njihovim serverima. Ako je servlet trajno instaliran na serveru, on se učitava kada se server pokrene. U suprotnom, server poziva servlet na prvi zahtjev od klijenta da izvrši uslugu koju pruža taj servlet.
Garantovano je da metoda u tome()će se završiti prije bilo kojeg drugog poziva servleta, kao što je pozivanje metode usluga(). Zapiši to u tome() biće pozvan samo jednom; neće biti pozvan sve dok se servlet ne isprazni i zatim ponovo učita od strane servera.
Metoda u tome() uzima jedan argument - referencu na objekat ServletConfig, koji sadrži argumente za inicijalizaciju servleta. Ovaj objekat ima metodu getServletContext(), koji vraća objekat ServletContext A koji sadrži informacije o okruženju servleta.
Servlet jezgro, service() metoda
Metoda usluga() je srce servleta. Svaki zahtjev od klijenta rezultira jednim pozivom metode usluga(). Ova metoda čita zahtjev i generiše poruku odgovora koristeći svoja dva argumenta ServletRequest i ServletResponse:
Dakle, postoje dva načina za prosljeđivanje informacija od klijenta do servleta. Prvi je kroz prosljeđivanje vrijednosti u parametrima zahtjeva. Vrijednosti parametara se mogu umetnuti u URL. Drugi način za prosljeđivanje informacija od klijenta do servleta je putem InputStream-a (ili Reader-a).
Metod rada usluga() je u suštini jednostavan - kreira odgovor na svaki zahtjev klijenta koji mu se prosljeđuje sa servera. Međutim, imajte na umu da može postojati nekoliko paralelnih zahtjeva koji se obrađuju u isto vrijeme. Ako je metoda usluga() zahtijeva bilo kakve eksterne resurse kao što su datoteke, baze podataka, tada je potrebno osigurati da je pristup resursima siguran niti.
Iskrcavanje servleta, metoda uništavanja().
Metoda uništiti() pozvan da oslobodi sve resurse (na primjer, otvorite fajlove i veze sa bazom podataka) prije istovarivanja servleta. Ova metoda može biti prazna ako nema potrebe za izvođenjem završnih operacija. Prije pozivanja metode uništiti() server čeka ili na završetak svih servisnih operacija, ili na istek određenog vremena. To znači da je metoda uništiti() može se pozvati tokom izvršavanja bilo koje dugotrajne metode usluga().
Važno je formalizirati metodu uništiti() na način da se izbjegnu zatvaranje potrebnih resursa do svih poziva usluga() neće završiti.
Konfiguracija servleta, metoda getServletConfig().
Metoda getServletConfig() vraća referencu na objekat koji implementira interfejs ServletConfig. Ovaj objekt pruža pristup informacijama o konfiguraciji servleta, tj. pristup parametrima inicijalizacije servleta i objektu konteksta servleta ServletContext, koji daje pristup servletu i njegovom okruženju.
Servlet info, getServletInfo() metoda
Metoda getServletInfo() definiran od strane programera koji kreira servlet da vrati string koji sadrži informacije o servletu, kao što su autor i verzija servleta.
ServletRequest Interface
ServletRequest pruža klijentu informacije o parametrima HTTP zahtjeva servletu, tj. pruža podatke uključujući naziv parametra i vrijednosti, atribute i ulazni tok. Ova informacija se prosljeđuje metodi usluga().
Sljedeći primjer servleta pokazuje kako dobiti informacije iz parametra zahtjev metoda usluga():
BufferedReader reader; String param1; String param2; public void service (ServletRequest zahtjev, ServletResponse odgovor) ( čitač = request.getReader(); param1 = request.getParameter("Prvi"); param2 = request.getParameter("Drugi"); )
Dodatne informacije o zahtjevu dostupne su servletu putem metoda, a glavne su navedene u sljedećoj tabeli:
getAttribute() | Vraća vrijednost navedenog atributa ovog zahtjeva. |
getContentLength() | Veličina zahtjeva, ako je poznata. |
getContentType() | Vraća MIME tip tijela zahtjeva. |
getInputStream() | Vraća InputStream za čitanje binarnih podataka iz tijela zahtjeva. |
GetParameterNames() | Vraća niz stringova s imenima svih parametara. |
getParameterValues() | Vraća niz vrijednosti za navedeni parametar. |
getProtocol() | Vraća protokol i verziju za zahtjev kao niz obrasca |
getReader() | Vraća BufferedReader za primanje teksta iz tijela zahtjeva. |
getRealPath() | Vraća stvarnu putanju za navedenu virtuelnu putanju. |
getRemoteAddr() | IP adresa klijenta koji je poslao ovaj zahtjev. |
getRemoteHost() | Ime hosta klijentske mašine koja je poslala zahtjev. |
getScheme() | Vraća šemu korištenu u URL-u ovog zahtjeva (na primjer, https, http, ftp, itd.). |
getServerName() | Ime hosta servera koji je prihvatio ovaj zahtjev. |
getServerPort() | Vraća broj porta koji se koristi za primanje ovog zahtjeva. |
ServletResponse interfejs
Interface ServletResponse je alat za slanje podataka klijentu. Sve metode ovog alata služe upravo ovom zadatku:
Javni java.lang.String getCharacterEncoding() public void setLocale(java.util.Locale loc) public java.util.Locale getLocale()
Prva metoda vraća tip MIME kodiranja (na primjer, UTF8) u kojem će informacije biti prikazane. Druge dvije metode također rade sa skupom znakova. Oni označavaju jezik koji se koristi u dokumentu (na primjer - ruski).
Public ServletOutputStream getOutputStream() izbacuje java.io.IOException
Metoda getOutputStream vraća izlazni tok za servlet. Ovaj tok se koristi, na primjer, za izlaz binarnih datoteka. Tekstualni podaci se mogu izvesti pomoću java.io.Writer:
Javni java.io.PrintWriter getWriter() izbacuje java.io.IOException
Metoda getWriter() automatski konvertuje stringove u skup znakova naveden u metodama getCharacterEncoding() i getLocale().
public void setContentLength(int len)
Metoda setContentLength postavlja vrijednost HTTP polja zaglavlja "Content-Length"
public void setContentType(vrsta niza)
Metoda setContentType se koristi za slanje MIME tipa sadržaja dokumenta. Polje HTTP zaglavlja "Content-Type".
Izlazni tok je baferovan. To znači da će dio podataka biti izdat klijentu tek nakon što je bafer pun.
public void setBufferSize(int size) public int getBufferSize() public void flushBuffer() izbacuje java.io.IOException public void resetBuffer()
Gore navedene 4 metode omogućavaju, respektivno, da postavite veličinu bafera za slanje, dobijete njegovu veličinu, inicijalizirate slanje sadržaja bafera klijentu bez čekanja da se popuni i očisti ovaj bafer iz podataka.
Javni boolean isCommitted()
Koristeći metodu isCommitted, možete dobiti oznaku, da li je slanje podataka klijentu već počelo. Oznaka će biti pozitivna ako je HTTP zaglavlje odgovora već poslano.
javno resetovanje praznine()
Ako HTTP zaglavlje još nije poslano, tada metoda resetiranja "resetuje" HTTP zaglavlje na njegove zadane vrijednosti.
JFreeChart Charts u servletima
Grafička biblioteka JFreeChart može se koristiti u servletima za kreiranje grafikona i njihovo prikazivanje kao slike na web stranicama. Navedeni su detalji opisa i primjeri korištenja JFreeCharta u servletima.
Servlet sa grafičkom bibliotekom Chart.js
JNI u Servletu
U nekim slučajevima, možda ćete morati koristiti JNI u WEB aplikaciji. Prikazan je primjer korištenja JNI-a u servletima.
JMS poruke u servletu
Servlet se može koristiti za razmjenu JMS poruke između aplikacija. Naveden je primjer korištenja servleta za slanje i čitanje JMS poruka u JBoss kontejneru.
Java Servlet je program na strani servera napisan u istoimenom programskom jeziku koji prima signale od klijenta i šalje mu odgovore. To je ključni element koji formira tipičan Java EE, pored JSP, EJB, XML i drugih srodnih tehnologija. Aplikacija se može upakovati u WAR (Web AR chive) datoteku za primenu na web serveru. Server koji može pokrenuti Java servlet naziva se kontejner. Program koji radi na takvom serveru može kreirati dinamičke web stranice.
Osnove Java servleta
Najpopularniji i najčešće korišteni kontejneri su Tomcat i JBoss. Tehnički, servlet je normalna Java klasa koja ima ekstenziju za Common Client/Server Protocol, ili HTTP. U praksi se koristi za obradu zahtjeva, preko HttpServlet GET i POST nadjačavanja, respektivno. Java Servlet kontejner pruža Http.ServletRequest i Http.ServletResponse, koji su objekti zahtjev-odgovor. I obično se koristi zajedno sa JSP-om za generisanje dinamičkog sadržaja.
Tipičan model scenarija:
Java servlet filteri su Java dodaci koji se koriste za presretanje i obradu zahtjeva prije nego što se pošalju servletu i odgovore nakon što se njegov kod završi, i prije nego što kontejner pošalje odgovor nazad klijentu.
Uobičajeni zadaci za obavljanje s filterima:
Filteri su uključeni i konfigurirani u datoteci deskriptora implementacije (web.xml). Servleti i filteri ne znaju jedni za druge, tako da možete dodati ili ukloniti filter jednostavnim uređivanjem web.xml. Prihvatljivo je imati više filtera za jedan resurs, ili lančane filtere za web.xml, ili pokrenuti Java Servlet filtere implementacijom interfejsa javax.servlet.Filter.
Paralelni zahtjevi prema serveru se obrađuju nitima, što pruža važne kvalitete weba - višenitnost i paralelizam.
Glavne funkcije:
Potreba za dinamičkim web stranicama
Postoji mnogo razloga zašto bi preduzeće želelo da kreira dinamičke web stranice u hodu, na primer kada se podaci na veb lokaciji često menjaju. Lokacije za vijesti i vremenske prilike obično se oslanjaju na CGI kako bi sadržaj održali svježim bez stalne pažnje programera. Web stranice za e-trgovinu koje navode trenutne cijene i nivoe zaliha koriste CGI da bi dobili ovaj sadržaj na zahtjev, preuzimajući ga iz interne infrastrukture kompanije.
Mnogi korisnici imaju iskustvo u korištenju Java tehnologije za kreiranje web servisa baziranih na CGI, ali Java servleti su efikasniji, moćniji, lakši za korištenje i jeftiniji od tradicionalnih CGI alternativa.
Prednosti Java servleta:
Prošlo je skoro dvadeset godina od pojave programskog jezika Java. Za to vreme, Javi je prorečena smrt i zaborav, programeri su se smejali njenoj sporosti i pohlepi za resursima. Ali bilo je i onih koji su vjerovali u Javu, razvili su sve vrste biblioteka, razvili zajednicu, tvrdoglavo dokazivali da za Javu nema granica: realno vrijeme, ugrađena, AI - sve je moguće. Odlučili smo da ne stojimo po strani i napravimo malu seriju članaka o Javi u ovom odeljku. Idi!
Vaš čajnik bira Java
Prema samom Oracleu, danas virtuelni java mašina instaliran na preko tri milijarde uređaja. I to nisu samo računari i pametni telefoni, već i kamere, televizori, Blue-ray plejeri, štampači, SIM kartice, bankomati, pa čak i automobili. Ova lista će se stalno povećavati, a sa njom i ponude za posao za Java programere. Čak i sada, broj slobodnih radnih mjesta za Java programere premašuje ostale. A kompanije su spremne da plaćaju sve više i više, krivolovom zaposlenih i organizovanjem povoljnijih uslova rada.
I zašto je dobra?
Java programeri su privučeni minimalizmom sintakse. Nema dodatnih modifikatora i servisnih riječi. Čak i odsustvo višestrukog nasljeđivanja, koje je isprva malo zbunilo C++ programere, na kraju se pokaže razumnim i opravdanim. Jednostavna logika, automatski rad sa memorijom, detaljna dokumentacija, forumi sa odgovorima na svakakva pitanja, open source- sve to omogućava brzo razumijevanje procesa razvoja i značajno smanjuje broj potencijalnih grešaka. Čak i indijski seljaci nauče Javu za par mjeseci, barem tako kažu njihove diplome :). Takođe, Java je interpretirani jezik. Kompajler prevodi izvorni kod u takozvani bytecode, koji je lako konvertovati nazad, što Javu čini posebno atraktivnom za obrnuti inženjering.
Pa, hajde da počnemo
Java je objektno orijentisani jezik, što znači da su sve varijable, metode, konstante deklarisane unutar klase. Pored klasa, postoje i interfejsi - posebna apstraktna konstrukcija koja vam omogućava da opišete ponašanje objekta bez specificiranja specifične implementacije. A ako u Javi nema višestrukog nasljeđivanja klasa, onda klasa može implementirati bilo koji broj interfejsa, što omogućava jednom objektu da ima mnogo funkcija, ali pruža samo dio njih.
Tipovi podataka se mogu podijeliti u dvije grupe: jednostavne (int, long, char i tako dalje) i tipove objekata: klase, interfejsi, nizovi. Jednostavni tipovi su uvijek i svuda fiksne dimenzije. Na primjer, na bilo kojoj arhitekturi i bilo kojem uređaju, int zauzima četiri bajta memorije. Ovo je prilično zgodno za proračune. Niz podataka sadrži poseban atribut dužine koji pohranjuje veličinu niza, na čemu se posebno zahvaljujemo programerima. Podaci različitih tipova se prosleđuju metodama na različite načine. Jednostavni tipovi se uvijek prosljeđuju po vrijednosti. Objekt - uvijek prema referenci radi uštede memorije. To znači da ako predamo int a = 10 i promijenimo njegovu vrijednost u 5 u pozvanoj metodi, tada će a i dalje biti 10 u originalnoj metodi. Ali ako promijenimo svojstvo objekta, ono će se promijeniti u originalnoj metodi kao dobro.
Zapamtite sećanje
Iako Java programer i oslobođeni potrebe za alociranjem i oslobađanjem memorije, nepoznavanja nekih karakteristika rada virtuelna mašina a sakupljač smeća može lako pretvoriti vaš program u proždrljivo čudovište koje proždire CPU vrijeme i svu dostupnu memoriju.
Kada kreirate novi niz, uvijek zapamtite da je mnogo lakše stvoriti mnogo malih dijelova memorije nego jedan ogroman. U suprotnom, rizikujete da naiđete na grešku Out of memory, što otprilike znači da ste imali memoriju, ali se sve ispostavilo.
Mnogi programeri, kada pređu na Javu i nauče o automatskom čišćenju memorije, počinju stvarati objekte u ogromnim količinama, nadajući se da će se sve to očistiti. U međuvremenu, sakupljač smeća je poput mašine koja može pokupiti samo smeće bačeno u kantu u blizini kuće. Ako vam neki podaci više nisu potrebni, nemojte ih pohraniti za svaki slučaj, kao hrpu starih razglednica - dodijelite null pokazivaču podataka, pomozite čistaču da počisti :). Također je dobra praksa da obrišete listu ako vam više nije potrebna. Zapamtite, objekat će se čuvati u memoriji sve dok postoje reference na njega u kodu. Čak i ako vaš program radi na 16 gigabajta memorije i nije u opasnosti da ostane bez memorije, postat će sve nespretniji i sporiji zbog prevelike količine iskorištene memorije. 99% pritužbi korisnika na spore Java programe je zbog neefikasno napisanih izvorni kod. Ako trebate stalno kreirati objekte koji se brzo koriste i više nisu potrebni, kao što su mnoge male poruke, razmislite o stvaranju skupa koji će pohraniti brojne instance za ponovnu upotrebu. Zapamtite, kreiranje i brisanje objekta je skupa operacija.
Na posao, gospodo.
Jedan primjer je bolji od hiljadu riječi. Možete listati kroz priručnik i pogledati standardne pozdravne riječi bez nas, tako da ćemo pretpostaviti da ste to već uradili i da ste spremni za implementaciju zanimljivijeg primjera.
Ti i ja ćemo se baviti serverskom aplikacijom Jave i napisati mali program za "špijuniranje" korisnika društvene mreže. Da biste to učinili, ne morate se čak ni zaposliti u NSA - korisnici šire sve o sebi, a mi ćemo morati samo primiti, sistematizirati i prikazati ove informacije na lijep način. Uzmite jedan od popularnih socijalne službe, na primjer četverokut, i nacrtati kretanje naših prijatelja na karti.
Prvo, da vidimo šta možemo izvući iz foursquarea. Nakon što smo prošli kroz stranice za programere, skrećemo pažnju na dvije metode:
- https://developer.foursquare.com/docs/users/checkins - mjesta koja je korisnik posjetio. Nažalost, trenutno je podržan samo za korisnike registrovane u programu, a šuška se da će zbog ograničenja u implementaciji tako i ostati;
- https://developer.foursquare.com/docs/checkins/recent - mjesta koja posjećuju prijatelji registrovanog korisnika. Ako se malo poigrate ovom funkcijom, ispada tužna činjenica: za svakog prijatelja se vraća tačno jedno mjesto - posljednje mjesto na kojem se provjerio.
Da biste koristili foursquare API, potrebno je da registrujete našu buduću aplikaciju, idite na ovu adresu: https://ru.foursquare.com/developers/register i popunite polja (da, takođe ćete se morati registrovati u samom foursquare, ali ti to možeš savršeno i bez mene).
Od važnih polja, ovdje se mogu zabilježiti samo “Naziv aplikacije”, “URL stranice za preuzimanje / dobrodošlica” (ovdje unesite proizvoljnu web adresu) i “URI za preusmjeravanje (s)” - to je adresa na koju će nam server poslati nakon registracije. Kasnije ćemo ovdje unijeti željenu vrijednost, ali za sada možete jednostavno unijeti bilo koju web adresu. Kliknite na "Sačuvaj" i naša aplikacija za praćenje je uspješno registrirana.
Dižemo se do oblaka
Captain Obvious govori da je bilo kojoj serverskoj aplikaciji potreban server da bi radila. Samostalno podizanje servera su hemoroidi, pa ćemo koristiti cloud rješenja koja su sada popularna. Oblak će sponzorirati Google Corporation jer je njihov Google App Engine besplatan, prilično jednostavan za postavljanje i korištenje. Za početak, idite ovdje i preuzmite Google App Engine SDK za Javu.
Sada možete započeti kreiranje projekta. Za Java razvoj koristim IntelliJ IDEA, ali možete koristiti besplatno i jednako dobro poznato okruženje Eclipse.
Odaberimo novi Java projekat. Nazovimo ga nsa_tracker.
Na sljedećoj kartici označite Web aplikaciju i Google App Engine na lijevoj strani i naznačite putanju do prethodno preuzetog i raspakiranog App Engine SDK-a.
Sada se zavalite i pustite IDE da radi svoje. Ako ste odabrali IDEA i učinili sve kako treba, tada ćete kao rezultat vidjeti gotov projekat koji, kada se pokrene, otvara prozor preglednika s praznim sadržajem. Možete početi s kodiranjem.
Počinjemo da tražimo
Dakle, imamo fasciklu projekta, koja sadrži fasciklu src. Ovdje ćemo staviti izvorni kod. Izvori u Javi su grupisani po paketima. Paket je folder na disku. Paketi su potrebni kako se ne bi svi izvori bacili na gomilu, već da bi se razdvojili, vođeni principima logike. Na primjer, kod koji se odnosi na korisničko sučelje logično bi bio smješten u paket korisničkog interfejsa, a mrežne interakcije u mrežni paket. To uvelike olakšava razvoj i podršku projekta kasnije. Istorijski je bila praksa da se struktura paketa započne imenom kompanije iza kojeg slijedi naziv programa. Ovo će pomoći da se naši izvori lakše identificiraju među gomilom istih u budućnosti. Za naš program kreiraćemo paket org.nsa.tracker. U njemu ćemo kreirati klase.
Servleti se koriste za obradu korisničkih zahtjeva na serveru. Servlet je klasa koja se obično nasljeđuje od HttpServleta i radi na bazi zahtjev-odgovor. Sve što je potrebno je nadjačati metodu doGet. Na zahtjev korisnika, moramo se prijaviti na foursquare, učitati listu prijava prijatelja i preusmjeriti zahtjev na stranicu mape.
Za rad sa foursquare API-jem, koristićemo besplatnu biblioteku foursquare-api-java, koja se može preuzeti odavde. Java biblioteka je ZIP arhiva sa jar ekstenzijom koja sadrži kompajlirane Java klase koje implementiraju određenu funkcionalnost. Za autorizaciju su nam potrebni ClientId i ClientSecret dobijeni u fazi registracije aplikacije u foursquaru. Pošto se ovi parametri ne mijenjaju tokom izvršavanja programa, deklariramo ih kao konstante.
Privatni statički konačni string CLIENT_ID = "FAKE_CLIENT_ID"; privatni statički konačni string CLIENT_SECRET = "FAKE_CLIENT_SECRET";
Final znači da je ovoj varijabli dodijeljena konačna vrijednost koja se ne može promijeniti. Static čini promenljivu dostupnom svim instancama date klase. Koristeći primjer autorizacije iz biblioteke foursquare-api-java, dobijamo nešto poput sljedećeg koda:
Zaštićeni void doGet(HttpServletRequest req, HttpServletResponse resp) izbacuje ServletException, IOException ( FoursquareApi foursquareApi = new FoursquareApi(CLIENT_ID, CLIENT_SECRET, CALLBACK_URL); String code = req. Idite na stranicu za registraciju resp.sendRedirect(foursquareApi.getAuthenticationUrl()); ) else ( probajte ( foursquareApi.authenticateCode(code); // Registracija uspješna, učitajte podatke Rezultat
Obratite pažnju na "baca ServletException, IOException" u deklaraciji metode. Ova linija znači da metoda potencijalno može izbaciti jedan od ovih izuzetaka. Izuzetak u Javi je objekt koji signalizira da se dogodio izuzetak. Oni su provjerljivi i neprovjerljivi. Provjereni izuzeci moraju biti obrađeni okolnim dijelom koda s blokom try-catch ili proslijeđeni iznad. Nepotvrđeni izuzeci se generalno ne obrađuju jer se javljaju kada program nije u mogućnosti da povrati svoje stanje. U ovoj metodi obrađujemo samo FoursquareApiException.
Kada web server primi zahtjev za aplikaciju, koristi deskriptor implementacije da upari URL zahtjeva sa kodom koji treba da obradi zahtjev. Deskriptor implementacije je XML datoteka koja se zove web.xml. Dodajmo opis servleta za praćenje.
Sada će zahtjeve za /track obraditi naš servlet pod nazivom TrackerServlet. Parametar Callback URL-a možete postaviti na ispravnu vrijednost http://localhost:8080/track.
Da biste prikazali rezultate, možete koristiti API za statičke karte, koji je ljubazno osigurala ista Google korporacija (https://developers.google.com/maps/documentation/staticmaps/). Naš servlet će generirati jednostavnu HTML stranicu i vratiti je kao odgovor na zahtjev korisnika.
StringBuilder sb = novi StringBuilder("
- "); indeks = 1; za (prijava: result.getResult()) ( sb.append("
Za generiranje stranice koristi se klasa StringBuilder, to je zbog činjenice da su stringovi u Javi nepromjenjivi objekti. Prilikom spajanja nizova pomoću + operatora. kreiran nova linija u vidu. StringBuilder štedi memoriju jer koristi niz znakova za spremanje nizova koji se spajaju. Slanje odgovora korisniku:
Byte resultBytes = sb.toString().getBytes("utf-8"); resp.setContentLength(resultBytes.length); resp.getOutputStream().write(resultBytes);
…I sve je spremno. Pokrećemo se i vidimo nešto slično slici sa izrekom „Rezultat programa“.
Šta je sledeće?
Aplikacija se može poboljšati, kao što je razdvajanje prikupljanja podataka i prikaza. Prenesite prikupljanje podataka na zaseban servis koji će stalno raditi i pamtiti sva kretanja korisnika u bazi podataka. Tada će biti moguće prikazati ne pojedinačne točke, već povezanu rutu. Uz malo kopanja u foursquare API, možete izdvojiti još više informacija o aktivnostima korisnika.
Ali nadam se da sam uspeo u glavnom: da vas ubedim da je Java jednostavna i cool. Vidimo se za mesec dana!
Knjige za Java programere
Savjetujemo vam da počnete učiti jezik sa knjigom „Java. Java: Vodič za početnike Herberta Schildta. Sljedeći nivo je „Java. Kompletan vodič” od njega, a možete saznati više o servletima u Java Servlet i JSP Cookbook od Brucea W. Perryja.