Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Windows Phone
  • Jsp opis za što se koristi. Kako možete spriječiti izravan pristup JSP stranici iz preglednika? Komentari i simboli citiranja

Jsp opis za što se koristi. Kako možete spriječiti izravan pristup JSP stranici iz preglednika? Komentari i simboli citiranja

Java Server Pages (tm) (JSP) tehnologija omogućuje programerima i dizajnerima web aplikacija da brzo razviju i jednostavno održavaju web stranice s dinamičkim sadržajem. No, opis gotovo svake tehnologije ove namjene (ASP, PHP, Net.Data) popraćen je sličnim riječima - brzo i jednostavno...

Iako su naizgled slični, JSP-ovi se razlikuju po nekim značajkama koje ovu tehnologiju čine nečim više od samo još jednog alata za stvaranje dinamički generiranog sadržaja web stranice.

Prvo, jednostavan enum:

  • stvarno visoka prenosivost na više platformi; korištenje univerzalni jezik visoka razina Java kao skriptiranje;
  • JSP nije neki samostalni alat za rješavanje prilično uskog raspona zadataka, iako prilično moćan, ali još jedan u nizu čitave galaksije tehnologija koje kombinira Java;
  • prava prilika za odvajanje zadataka pisanja poslovne logike web aplikacije i korisničkog sučelja, što vam omogućuje da samostalno razvijate i održavate različite dijelove projekta;
JSP tehnologija je izravna ekstenzija druge Java tehnologije - Servleta (tm) i također je usko povezana s tehnologijom Java Beans (tm) te koristi oznake (tagove) i skriptlete (skriptlete) napisane u Java programskom jeziku za uvođenje logike stvaranje dinamičkog sadržaja za web stranicu, s HTML ili XML oznakama koje se prosljeđuju izravno na stranu klijenta.

Broj oznaka je prilično mali, što pojednostavljuje početni razvoj ove tehnologije; međutim, za jednostavne stvari, isti Net.Data ili PHP je također vrlo jednostavan. Kao i obično, razmotrite primitivni slučaj klase Pozdrav svijete!
<%@ page contentType="text/html; charset=ibm866" %> <%@ page import ="java.net.*" %> <%@ page import ="java.util.Date" %> Tko sam ja? <% InetAddress localHost = InetAddress.getLocalHost(); Date localTime = new Date(); %>

Tko sam ja?

ja sam pozvan<%= localHost.getHostName() %> (<%= localHost.getHostAddress() %>).
Ova stranica je posljednji put izvršena u<%= localTime.toString() %>.

Čak ni u osobi, ne poznavajući Javu, razumijevanje gornjeg koda najvjerojatnije neće uzrokovati probleme. Zadržimo se na nekim točkama: kod unutar oznaka<% %>, zapravo, je kod skriptleta; sve između<%-- --%>-- komentar; označiti<%= позволяет вывести значение переменной в нужном месте страницы; <%@ page %>omogućuje vam uvoz klasa i prilagođavanje dijela ponašanja stranice.

Ako je snaga takvih konkurentskih (vjerojatno je to još uvijek slučaj ;-) alata poput PHP-a i Net.Data prvenstveno posljedica ogromnog skupa unaprijed definiranih funkcija, onda iza JSP-a stoji cijeli konglomerat Java klasa i tehnologija.

No s ovako jednostavnog primjera uopće nije očito zašto trebate birati JSP-ove i sve što je s njima povezano, prvenstveno servlete i bean-ove. Ipak, pokušajmo razmotriti neke od lijepih aspekata JSP-a.

Upravljanje sjednicama

Vrijednosti koje se pohranjuju i dohvaćaju iz objekta sesije ne mogu biti primitivni tipovi podataka (int, double) i moraju biti predstavljene kao njihove analogne klase (Integer, Double).
HttpSession session=request.getSession();//dobite objekt sesije ili stvorite jedan session.getId() //dobite ID broj sesije Integer item = (Integer) session.getValue("item") // dohvatite sesiju objekta Integer. putValue("ItemValue", itemName);//ItemValue ne smije biti primitivan

Upravljanje aplikacijama

Ponekad je potrebno poslužitelju dati neke vrijednosti varijabli na razini web-mjesta, svaki klijent koristi i manipulira kopijama ovih podataka. JSP koristi objekt ServletContext, koji pruža mehanizam sličan sesiji (tj. nema primitivnih tipova).
getServletContext().setAttribute("Item", ItemValue);//za postavljanje varijable aplikacije Integer i=(Integer)getServletContext().getAttribute("ItemName");//dobiti stavku boja=plava>

JSP-specifičan jezik

JSP direktive "kazuju" poslužitelju da nešto učini kada se konvertiraju iz JSP-a u servlet; direktivama prethodi simbol @. Neke važne JSP direktive navedene su u nastavku, za potpunije upoznavanje, naravno, morat ćete pročitati nešto drugo.
uključi - uključivanje statičke ili dinamičke datoteke (uključuje na strani poslužitelja) <%@ include file="hello.jsp" %> import - rezultirajući servlet će uvesti ovaj paket<%@ import = "java.util.*" %>extends - servlet će proširiti (naslijediti) navedenu klasu (ovo je superklasa) <%@ extends = "java.util.Dictionary" %> implements - servlet će implementirati sučelje <%@ implements = "java.util.Enumeration" %> content_type - postavlja tip odgovora koji generira servlet <%@ content_type = "text/plain" %> ili <%@ content_type = "text/html" %>

Poznato je da zadaci u ovom složenom svijetu nisu samo jednostavni ili čak vrlo jednostavni. Ako podlegnete iskušenju da sve radite pomoću skriptleta (dinamičkih umetanja Java koda među statični HTML) i smatrate vanjske klase moćnom bibliotekom funkcija, vrlo je lako pretvoriti dinamičku stranicu u ogromno čudovište koje je teško otkloniti i s velikim poteškoćama u daljnjim preinakama i proširenjima.

Da, kao i kod konkurenata, složenost se može izravnati razbijanjem složene stranice na nekoliko logički odvojenih dijelova i njihovo sastavljanje pomoću alata za uključivanje.

Postoje dvije opcije uključivanja:

  • Statičko uključivanje, dok obrađuje JSP elemente u uključenoj datoteci, ako ih ima, i ulazi u rezultirajući generirani Java kod, zapravo serlet:
    <%@ include file="includeheader.jsp"%>
    ili tako
    <%@ include file="includeheader.html"%>
    odnosno uključena datoteka uopće ne mora biti JSP stranica.
  • Dinamičko omogućavanje, dok se sadržaj uključene datoteke obrađuje neovisno, zapravo se na nju prenosi kontrola u trenutku izvršenja:
Zanimljivo je da se dinamički uključeni sadržaj može samostalno keširati, što u nekim slučajevima daje značajan dobitak na složenim višedijelnim stranicama. Ali mogućnost uključivanja ipak je vjerojatno najprimitivnija višestruke mogućnosti JSP.

Gotovo svi, počinjući izrađivati ​​web-aplikaciju, suočeni su s potrebom pružanja korisniku prikladan alat za unos podataka, a ovdje u pravilu b oko više problema nego samo pružanje informacija u obliku generiranih HTML stranica. Potrebno je osigurati dovoljnu inteligenciju unosa, osim toga, u slučaju pogrešaka u unosu, ne izgubiti ono što je prethodno uneseno i prenijeti traženo opće informacije sa stranice na stranicu. U Net.Data, na primjer, nisam pronašao način da to učinim osim korištenja skrivenih polja u obrascima za unos, pohranjivanje informacija s životnim vijekom "sesije" prerasta u težak zadatak; kako se možete izvući s rješenjem ovog problema u PHP-u, ne znam. Što se tiče JSP / servleta - postoji standardna JavaBeans mogućnost (u ovom kontekstu nećemo se zadržavati na tako moćnijem razvoju ovog koncepta kao što je EJB) - to su punopravne Java klase s nekim dodatna pravila programiranje.

Ovo je vrlo moćan alat, ali zahtijeva razbijanje stereotipa. JavaBeans su Java komponente koje mogu izvoditi dobro definirane zadatke i uključivati ​​objekte podataka. JavaBeans slijedi strukturni objektni model: Bean ima javni konstruktor koji ne uzima argumente i njegova svojstva postavlja kontrolni servlet pomoću introspekcije/refleksije.

Uključivanje graha u JSP "stranicu" radi se na sljedeći način:

... Dodatak <%=formHandler.getErrorMsg("description")%> Vlasnik <%= formHandler.getOwnerName()%> | <%= formHandler.getOwnerName()%> <%=formHandler.getErrorMsg("owner")%> ===> ili evo još jednog
ja volim<%= Cindy.getFlavor() %>kava. //The Coffee Bean: javna klasa Coffee (privatni String m_flavor; public Coffee() (m_flavor = "Regular"; ) public void setFlavor(String flavor) (m_flavor = okus; ) public String getFlavor() ( return m_flavor; ) )

Neka objašnjenja za ovaj izvod: scope="request" znači da je životni vijek bean-a zahtjev, property="*" znači da ovaj bean prihvaća sve parametre proslijeđene u zahtjevu za ova stranica. Ove metode imaju jednostavno pravilo imenovanja: ako je parametar obrasca lastName, tada će se metoda koja prima podatke zvati setLastName, a metoda koja vraća podatke bit će getLastName.

Nažalost, dovoljno je teško pokazati punu snagu korištenja graha jednostavna primjena. Međutim, ovaj članak nema za cilj dati cijelu dubinu, zadatak je zainteresirati.

Općenita crta koja se može pratiti u mnogim novijim publikacijama je razdvajanje posla dizajnera i rada programera, koji osigurava pisanje stvarnog rada s bazom podataka i poslovnom logikom web aplikacije. Mnogo toga se može svesti na razinu kante. Nažalost, složenost pisanja barem na početno stanje, paket JSP-servlets-beans izgleda veći od Net.Data i PHP-a (međutim, upoznat sam s potonjim na razini nešto većoj od "Hello World!"). Ali ni korištenje kanti ne oslobađa u potpunosti od minimuma korištenje Jave Na stranici. Kako bi došao do logičnog kraja i ostavio dizajneru samo ispravan položaj oznaka na stranici, JSP je uveo mogućnost pisanja prilagođenih knjižnica JSP oznaka.

Korištenje knjižnica oznaka omogućuje, prvo, daljnje povećanje ponovne upotrebe koda, drugo, smanjenje složenosti pisanja aplikacije i, treće, daljnju pomoć u podjeli rada. Nažalost, ovo drugo u našoj stvarnosti još nije dobilo odgovarajuću težinu pri odabiru razvojnog alata. Zaključno, dat ću mali primjer korištenja prilagođenih oznaka, na primjer, upit bazi podataka s izlazom rezultata u obliku tablice mogao bi izgledati ovako:
<%@ taglib uri="xsql.tld" prefix="xsql" %> ...

neštoneštoopis
"$1$""$2$""$3$"
ali to ne znači da mora izgledati ovako ;-)

Zapravo, tema je preširoka da bi se u tako kratkom izlaganju pokrila bez bijelih mrlja.

JSP (stranice Java poslužitelja) je tehnologija koja vam omogućuje da ugradite Java kod, kao i EL (jezik izraza) u statički sadržaj stranice) i omogućuje web programerima da dinamički generiraju HTML, XML i druge web stranice. JSP je sastavni dio unificirana tehnologija za izradu J2EE poslovnih aplikacija.

JSP - može se izvršiti na gotovo svakom web poslužitelju, budući da se ova tehnologija temelji na programskom jeziku Java, koji je neovisan o platformi. Podrška stranicama Java poslužitelja HTML oznake, Javascript također vlastiti set oznake.

JSP - omogućuje vam da odvojite dinamički dio stranice od statičkog dijela. Ova tehnologija uključuje umetanje Java koda u stranicu. Nećemo razmatrati ovu upotrebu JSP-a jer se ova tehnologija smatra zastarjelom i nesavršenom. Razlog je jednostavan: dizajneri koji razvijaju izgled i dojam stranice možda nisu uvijek upoznati s Javom, a to može uzrokovati dodatne poteškoće pri uređivanju ili održavanju web aplikacija.

Umjesto umetanja Java koda, biblioteka jstl ili Javascript oznaka sada se koristi za vrlo napredne. Razmotrit ćemo primjer s jstl oznakama. Ovo je vrlo zgodna knjižnica koja ima gotovo sve funkcije potrebne za stvaranje dinamičkih stranica. Ako trebate nešto specifično, uvijek možete napisati svoju oznaku i umetnuti njezin sadržaj na stranicu.

S JSP-ovima smo već djelomično upoznati iz prve . Glavno tijelo JSP stranice je HTML, u koji su umetnute oznake s dinamičkim sadržajem.

Primjer JSP stranice

Vrlo potrebno znanje koje ćemo koristiti je JSP direktiva.

JSP direktiva je poruka koju stranica može poslati u odgovarajući spremnik, navodeći što treba učiniti. Sintaksa direktive:<% @ атрибут = «значение» %>

Postoje tri glavne vrste direktiva:

  1. stranica (može se koristiti za uvoz klasa);
  2. uključi (daje vam mogućnost da umetnete datoteku u klasu servleta prilikom prevođenja JSP datoteke u servlet);
  3. taglib (omogućuje uključivanje biblioteke oznaka).

Budući da nećemo umetati kod u stranicu, razmotrit ćemo posljednje dvije direktive.

Na primjer, imamo stranice koje će imati isti vrh i dno. Vrlo čest uzorak u kojem su podnožje i zaglavlje isti za sve stranice. Kako ne biste upisivali kod ovih stranica u svaku JSP datoteku, njihov kod možete izvaditi u zasebne datoteke i zatim ga spojiti na mjesto koje nam je potrebno pomoću uključuju direktive.

Lokacija datoteka u projektu:

U gornjem kodu možete vidjeti upotrebu taglib direktive. Uz njegovu pomoć smo povezali biblioteku jstl tagova. Koristeći ovu direktivu, možete uključiti vlastitu biblioteku oznaka:<%@ taglib uri=»/WEB-INF/mylib.tld» prefix=»test» %>.

Imajte na umu da je važan taglib atribut prefiks. Ovo je obavezan atribut. S prefiksom možete pozvati knjižnicu u kodu. Možete odabrati bilo koji naziv prefiksa. Usput, evo upotrebe jstl oznaka u praksi:

    < c: forEach items= "$(računi) " var="račun">

    < tr align= "center" >

    < td>$(broj.računa)

    < td>$(račun.saldo)

    < td>< c: if test= "${!account.isBlocked}" >$( status Aktivan )

    < c: if test= "${account.isBlocked}" >$( statusBlokirano)

    < td>< c: if test= "${!account.isBlocked}" >

    < a href= "?command=blockaccount&accountId=$(account.accountId)"> $( blok )

    < td>< a href= "?command=showinfo&accountId=$(account.accountId)"> $(showInfo)

Gornji kod pokazuje izlaz svih elemenata popisa. Kako smo ga prenijeli na stranicu bit će u sljedećim člancima. Njegova sintaksa je:

$(stavka)

Ovo je kod bočne trake koji je gore uključen. Kao što vidite, grananje se ovdje koristi za prikaz samo informacija koje su dostupne određenoj vrsti korisnika.

Sintaksa:
a jednako b

Najbolje je uzeti u obzir jstl oznake prilikom pisanja pravi projekt, budući da ne vidim smisao u učenju i pamćenju cijele sintakse za svaku radnju. Gornji kod trebao bi poslužiti samo kao primjer kako se to koristi. Ne morate ništa pamtiti. Kada pišete kod, pogledajte ovu sintaksu.

Inače, kod projekta iz kojeg je preuzet ovaj kod nalazi se ovdje: https://github.com/caligula95/payment-systemapp

Objavio sam projekt na heroku: https://payment-systemapp.herokuapp.com/ - koristi besplatan račun, tako da za prvi zahtjev trebate pričekati nekoliko minuta da projekt počne.

Servleti vam omogućuju primanje zahtjeva od klijenta, obavljanje nekog posla i prikaz rezultata na ekranu. Servlet radi dobro do pričamo o obradi informacija, t.j. prije prikaza informacija na ekranu. Možete umetnuti prilično složenu logiku u servlet, pozivati ​​bazu podataka i još mnogo, mnogo više što je potrebno za aplikaciju. Ali ovdje je izvesti izlaz na ekran u servletu - vrlo je nezgodno. Ali što je s razvojem složenih dizajnerskih ideja i naknadnim promjenama korisničko sučelje? Tehnologija dizajna Stranice Java poslužitelja (JSP) je jedna od J2EE tehnologija, koja je proširenje tehnologije servleta kako bi se olakšao rad s web sadržajem. JSP stranice olakšavaju odvajanje web sadržaja na statički i dinamički dio, dopuštajući ponovnu upotrebu prethodno definiranih komponenti. Programeri Java Server Pages mogu koristiti JavaBeans komponente i stvoriti vlastite prilagođene biblioteke oznaka koje sadrže složenu dinamičku funkcionalnost. Specifikacija Java Server Pages (http://java.sun.com/products/jsp) nasljeđuje i proširuje specifikaciju servleta (http://java.sun.com/products/servlets). Poput servleta, JSP komponente su web komponente i nalaze se u web kontejneru. JSP stranice su neovisne o određenoj implementaciji web-spremnika, što ih čini ponovnim korištenjem. Osim klasa i sučelja za programiranje servleta (paketa javax.servlet i javax.servlet/http), u paketima javax.servlet.jsp i javax.servlet.jsp.target sadrži klase i sučelja vezana uz programiranje Java Server Pages. Potpuni opis Java tehnologije Stranice poslužitelja mogu se pronaći u specifikaciji na (java.sun.com/products/jsp/download.htm)

Pregled tehnologije Java Server Pages

Tehnologija Java Server Pages sadrži četiri ključne komponente:
  1. direktive (direktiva) su poruke za JSP kontejner, koje omogućuju definiranje parametara stranice, povezivanje drugih resursa, korištenje vlastitih nestandardnih knjižnica oznaka.
  2. Radnje (radnje) inkapsulirati funkcionalnost u unaprijed definiranim oznakama koje se mogu ugraditi u JSP stranicu. Radnje se često izvode na temelju informacija koje se šalju poslužitelju kao dio zahtjeva određenog klijenta. Akcije također mogu stvoriti Java objekte za korištenje u JSP skriptletima.
  3. Skripte (skripteti) omogućuju vam da ugradite Java kod u JSP stranice koji stupa u interakciju s objektima stranice prilikom obrade zahtjeva.
  4. Knjižnice oznaka (biblioteka oznaka) sastavni su dio mehanizma proširenja oznaka, koji vam omogućuje razvoj i korištenje vlastitih oznaka.
Prisutnost podataka s nepromjenjivom strukturom određuje izbor programera u odlučivanju koju će tehnologiju koristiti: servlete ili JSP stranice. Programeri radije koriste JSP stranice ako je većina sadržaja koji se šalje klijentu nepromjenjivi podaci, a samo mali dio sadržaja dinamički se generira pomoću Java koda. Servleti su poželjni ako su samo mali dio sadržaja koji se šalje klijentu podaci s nepromjenjivom strukturom. Zapravo, pojedinačni servleti možda uopće neće generirati sadržaj za klijenta, izvodeći određeni zadatak u ime klijenta i zatim pozivajući druge servlete ili JSP stranice da pošalju odgovor. Treba napomenuti da su u mnogim slučajevima servleti i JSP stranice zamjenjivi. Poput servleta, JSP stranice se obično izvode na strani web poslužitelja, koji se naziva JSP spremnik. Kada web-poslužitelj s omogućenim JSP-om primi prvi zahtjev za JSP stranicu, JSP spremnik prevodi JSP stranicu u Java servlet koji servisira trenutni zahtjev i sve sljedeće zahtjeve za tu stranicu. Ako dođe do pogreške tijekom kompajliranja novog servleta, te pogreške rezultiraju pogreške u vremenu prevođenja. JSP kontejner, tijekom faze prijevoda, stavlja Java naredbe koje implementiraju odgovor JSP stranice u metodu _jspService. Ako se servlet kompajlira bez grešaka, JSP spremnik poziva metodu _jspService za obradu zahtjeva. JSP stranica može izravno obraditi zahtjev ili može pozvati druge komponente web aplikacije kako bi pomogle u obradi zahtjeva. Sve pogreške koje se pojave tijekom obrade će uzrokovati iznimka na web poslužitelju tijekom faze zahtjeva. Sve statično HTML tekst, zove se u dokumentaciji JSP-a HTML predložak(HTML šablona) se odmah šalje u izlazni tok. Izlazni tok stranice je u međuspremniku. Međuspremnik osigurava klasa JspWriter, proširenje klase Pisac. Zadana veličina međuspremnika ograničena je na 8 KB, ali se može promijeniti pomoću atributa pufer označiti <%@ page> . Prisutnost međuspremnika omogućuje vam pisanje zaglavlja odgovora u izlazni tok zajedno s izlaznim tekstom. U međuspremniku, naslovi će biti postavljeni ispred teksta. Dakle, dovoljno je napisati JSP stranicu, spremiti je u datoteku s ekstenzijom jsp i instalirajte datoteku u spremnik, baš kao što biste to učinili HTML stranicu, bez brige o kompilaciji. Tijekom instalacije možete postaviti početni parametri JSP stranice na isti način kao i početni parametri servleta.
1) NetBeans 7.3;
2) Maven
3) Hibernacija;
4) Opruga MVC;
5) JSP+JSTL;
6) Znanje o servletima, sesijama, JavaBeanu, XML-u, itd.;
7) HTML + CSS (malo ljepote po vašem ukusu, ali bolje je platiti lijevim ljudima - imate dovoljno problema sa stranim poslužitelja);
8) Java SE (poznavanje zbirki, sposobnost rukovanja iznimkama... Općenito, standardni skup);
9) Poznavanje obrazaca dizajna (DAO, Factory);
10) JPA;
11) SVN;
12) SQL (za pisanje skripti koje popunjavaju naše baze podataka).

Počnimo s tim gdje ćemo pohraniti naš kod i kako ga podijeliti s prijateljima. Mislim da ne znaju svi početnici o spremištima, a ovaj dio je za njih.

SVN

Postoji takva stvar kao što je spremište - udaljeni poslužitelj pohrana koda.
Ako dobijete probni zadatak, a pošaljete ga u arhivu, onda ćete najvjerojatnije i vi biti poslani. Možda ga neće poslati, ali će se sigurno razočarati u vas.
Postoje razna CVS, SVN, Git spremišta. Za početnike smatram da je SVN optimalan. Pa, vama je najvažnije da ne znate što je to, već da to možete primijeniti. Iako će ovo biti dovoljno, ostalo će doći s iskustvom.

Nakon svega ovoga, imat ćete poveznicu na svoj prostor. Da biste razumjeli što je to - trebate uzeti jedan od svojih projekata (ili kreirati neki prazan projekt u NetBeansu). Desnom tipkom miša kliknite na njega i imat ćete "Upravljanje verzijama" -> "uvoz u Subverziono spremište" u izborniku. Nakon toga, pojavit će se dijaloški okvir u kojem će se nalaziti put do spremišta - ovo je poveznica koju ste dobili na web mjestu u kartici "Izvorni kod".

Zatim potpuno uklonite projekt koji ste predali. Zatim idite u mapu u kojoj su pohranjeni vaši projekti i provjerite je li sve stvarno izbrisano. Zatim se vraćate na NetBeans i u traci izbornika potražite karticu Grupa (na ploči gdje datoteka, pogled, uređivanje, prijelaz, izvor...) ima našu Subverziju. A u podizborniku ima "Get". Zatim, u dijaloškim okvirima, morat ćete odrediti vezu do spremišta (ovo je veza koju ste dobili na web-mjestu u kartici "Izvorni kod".) A kada ponudi preuzimanje mapa, morat ćete pronaći vaš projekt u stablu spremišta i odaberite ga, a na kraju preuzimate svoj projekt. Ovako se razmjenjuje kod.
Vaš će projekt biti stalno sinkroniziran sa spremištem i datotekama zastavica kao promijenjenim ili novim (što god se razlikuje od verzije u spremištu). Da biste ažurirali, morate pozvati kontekstni izbornik, a na kartici Kontrola verzija nalazit će se veliki popis onoga što možete učiniti s projektom. "Ažuriraj" je ažuriranje vaših datoteka; "Commit" - stavite kod koji ste napisali ili promijenili u spremište; "Reset" - povratak na verziju u spremištu, i "Usporedi" - prikaz promjena u recima koji se razlikuju od onih izbrisanih. Ovo je način timskog dijeljenja koda koji se uvijek koristi i na njega se treba naviknuti.

Već ste preuzeli NetBeans, poigrali se sa SVN-om - sada prijeđimo na posao. Napravite projekt. Kliknite "Kreiraj projekt" i odaberite Maven->Web aplikacija. Nazovite to kako želite, sve je vaša mašta. Dakle, imamo web aplikaciju, naš projekt se gradi s mavenom, imamo cilj, a sada je vrijeme da razmislimo kako ga implementirati. Odnosno, vi kao programer trebate razmisliti o tome kako će vaša aplikacija izgledati, kakva arhitektura, stablo paketa i tako dalje. Ukupan broj redova koda ovdje je oko 4000, a bolje je unaprijed se pobrinuti za prekrasnu arhitekturu, inače jednostavno nećete shvatiti što gdje radi i kako radi za vas, kojim čudom vi npr. , prikazati zadnji kupljeni artikl, kako izračunati ukupan iznos kupnje. A ako se od vas tada traži da nešto dovršite ili dodate, shvatit ćete da je lakše sve napisati ispočetka.

I naravno, moramo smisliti naš plan djelovanja.

Dakle: akcijski plan
1) opisati entitet(entitete) - entitete. Ovo je POJO - klasa povezana s bazom podataka pomoću napomene (@Entity) ili putem XML-a. Koristit ćemo JPA, tako da moramo uvesti javax.persistence. * Zašto ne Hibernate Persistence API, jer ako ga koristimo i onda želimo promijeniti ORM biblioteku, morat ćemo prepisati naše klase, a JPA je standard od Sunca. Što se tiče toga što je JPA - pa, za vas to mogu reći svojim riječima: ovo je knjižnica koja pruža API za rad s *dugoživim* objektima, odnosno omogućuje nam prikladno spremanje naših objekata u bazu podataka . Mogu dati savjet: stvorite za ovo odvojeno pakiranje nazovite to entitetom ili domenom - kako god želite, glavna stvar je da vam to bude jasno. Moglo bi izgledati ovako: edu.shop.model.domain.Customer.java edu.shop.model.domain.Notebook.java.
Detaljnije ću opisati izravno prilikom razmatranja ove stavke. Sada je izazov osmisliti plan djelovanja.

2) Napravite HibernateUtil (općenito, sufiks ili prefiks Util implicira da je kod u ovoj klasi univerzalan i da ga koriste mnoge klase).
Dakle, u HibernateUtil postavljamo SessionFactory. On je težak. Taj bi kod, u teoriji, trebao biti neovisan o cijeloj aplikaciji, budući da uspostavlja vezu s bazom podataka pri pokretanju i trebao bi nam dati samo sesije s bazom podataka. U ovu klasu također registriramo naše klase entiteta. Kasnije ću vam reći više o ovom razredu. Stavimo i to u poseban paket, na primjer, edu.shop.model.hbutil.HibernateUtil.java

3) Pišemo DAO.
Što napisati u njemu? Pišemo što želimo dobiti iz baze, ali ne trebamo razmišljati kako su ti podaci ispali, važan je rezultat. Na primjer, definiramo sučelje ProductDAO i upisujemo metode u njega
Popis >dobiti sveproizvode(); tada pišemo njegovu implementaciju ProductDAOImpl.

Koja je ideja? Da smo ti i ja napisali ovu prijavu, rekli biste: "Miha, trebaju mi ​​sljedeći podaci iz baze: sva roba koju imam u bazi." Odgovaram: "nije pitanje." I onda sljedeći razvoj događaja: u svom kodu, gdje god trebate napraviti upite bazi podataka, napišite sljedeće%

*ovdje je poziv metode *.getAllProducts(); - i vidite da prevodilac ne psuje, a možda još neću imati vremena napisati implementaciju ovog sučelja. I kakav je rezultat? Imate sve sastavljeno, ali nema ni koda koji radi. Ovdje ćemo primijeniti Enums i obrazac Factory, i još nešto, ali sve ima svoje vrijeme. Upravo u DAO-u posebnu pozornost treba posvetiti rukovanju iznimkama, barem generiranju stranica s pogreškama. Tako da možete brzo pronaći dio pokvarenog koda. Inače se samo mučiš s otklanjanjem pogrešaka.

3) Ovdje će započeti naš rad s Spring MVC-om. Ovo je duga priča i tome će biti posvećen poseban članak. Moram odmah reći da je to najteža stvar u ovoj aplikaciji. Ali pokazat ću vam jednostavniji način da sve ispišete bez previše brige o MVC uzorku.
Dotaknimo se upotrebe skriptleta.

4) Ovdje ćemo imati pomoćne razrede koji dodaju sve vrste dobrota našem projektu: brojanje ukupnog iznosa kupnji; posljednji kupljeni predmet; pomoćne varijable koje će nam biti korisne za rad metode, koja će, na primjer, prikazati stvari iz baze podataka koje nisu skuplje od 5000 UAH, ili ne jeftinije od 500; izlaz svih prijenosnih računala marke Asus. Ova je točka usko povezana s prethodnom.

Zaustavimo se tu za sada. O ostalim ćemo se pozabaviti malo kasnije. Dakle, imamo isplanirani plan, krenimo ga provoditi.

entiteta

Napravili smo naš projekt i kreirali naš paket s entitetima. Neka to bude edu.shop.entity. Tamo stvaramo sljedeće klase:

Bilješka. Košarica u kojoj će biti pohranjena naša kupljena roba bit će kao tablica u bazi, to sam napravio jer će se u njoj pokazati neke od osnova rada s bazom. Za pravi slučaj, prikladnije bi bilo koristiti zbirke za pohranu naše robe.

1) proizvod
2) Bilježnica
3) Kamera
4) knjiga
5) kabel
6) kupac
7) Kolica

Razgovarajmo malo o tome što je klasa entiteta.
Entitet (Entity) - POJO-klasa povezana s bazom podataka pomoću napomene (@Entity) ili putem XML-a. Ovaj razred ima sljedeće zahtjeve:

Mora imati prazan konstruktor (javni ili zaštićeni);
- Ne može biti ugniježđeno, sučelje ili enum;
- Ne može biti konačan i ne može sadržavati konačna polja/svojstva;
- Mora sadržavati najmanje jedno polje @Id.

U ovom slučaju, subjekt može:

Entiteti mogu biti međusobno povezani: jedan-prema-jedan, jedan-prema-više, mnogo-prema-jedan i više-prema-mnogi.

Koristit ćemo napomene. I ovdje odmah imamo priliku opisati na dva načina. Bilješke ćemo napisati izravno iznad polja ili iznad gettera. Reći ću jedno: ispravno je pisati preko gettera, a razlog ćete pitati u Googleu. Ne mogu ovdje opisati apsolutno sve teme.

Postoji još jedna stvar koju želim reći. Da biste to učinili, morat ćete pokazati 2 primjera opisivanja klase entiteta. Dakle, prvi primjer:
Napisao sam komentare na to u samom kodu:

Uvoz java.io.Serializable; import javax postojanost.*; import javax.validation.constraints.Size; /** * * @author Mikhail Shumenko */ @Entity //Ova napomena ukazuje da je ova klasa entitet. @Table(name = "CART")// Ovom napomenom označavamo da je tablica s imenom CART odgovorna za ovaj entitet u bazi podataka /name poput klase javne klase CartEntity implementira Serializable ( //Ovdje pišemo bilješke preko Ispravno je pisati preko gettera //Opisati ID tablice @Id //Naznačiti da je ovo polje klase odgovorno za stupac u tablici pod nazivom Id //Ako ga ne navedemo, hibernacija će kreirati stupac s istim imenom kao polje @Column(name = "ID") //Ovdje možete puno napisati)) Zašto sam ovo napisao ovdje? Općenito, možete napisati AUTO u //@GeneratedValue(strategy=GenerationType.umjesto TABLE), a zatim //kada se tablica prvi put učita, Id će se automatski generirati od 1 do svoje maksimalne vrijednosti. //Ako imate 20 stvari u tablici, onda će se generirati od 1 do 20. //Ali s naknadnim dodacima, id dodane stvari bit će otprilike ovako - 345768. //Sve sam napisao tako da moj zadnji id se pohranjuje u tablicu i potom se generira na odgovarajući način s naknadnim dodacima. //Postoji i SEQUENCE, ali nije podržan u Derbyju i radit ćemo s njim. // Općenito, to su nijanse. O njima možete sami saznati @TableGenerator(name = "cartid", table = "cartpktb", pkColumnName = "idCart", pkColumnValue = "(!LANG:idCartValue",allocationSize = 1) @GeneratedValue (strategy = GenerationType.TABLE, generator = "cartid") private Integer id; //Указываем максимальный размер. Это строка из 25 символов. @Size(max = 25) @Column(name = "NAMEITEM") //Если тип нашего поля String, то и создаваться будет столбец с типом VARCHAR(в Derby) //Если Integer, то будет столбец, в который поместить можно только Integer //boolean в Derby - это столбец с типом SMALLINT private String nameItem; @Column(name = "PRICE") private Integer price; public CartEntity() { } public CartEntity(String nameItem, int price) { this.nameItem = nameItem; this.price = price; } public CartEntity(Integer id,String nameItem, int price) { this.id=id; this.nameItem = nameItem; this.price = price; } public CartEntity(Integer id) { this.id = id; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNameItem() { return nameItem; } public void setNameItem(String nameItem) { this.nameItem = nameItem; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } } !}

Drugi način: pišemo preko gettera. Pogledajte kod za objašnjenja.

import java.io.Serializable; import javax postojanost.*; /** * * @author miha */ @Entity //Vidiš, nisam naveo napomenu @Table //Hibernate će to shvatiti umjesto mene. javna klasa Proizvod implementira Serializable ( privatni Integer id; privatni String nameProduct; privatni cijeli broj dostupanProduct; @Id @GeneratedValue(strategy = GenerationType.AUTO) //Opisao sam Id preko gettera, što znači da će rad s drugim poljima ići kroz gettere. public Integer getId() ( return id; ) public void setId(Integer id) ( this.id = id; ) public String getNameProduct() ( return nameProduct; ) public void setNameProduct(String nameProduct) ( this.nameProduct = nameProduct; ) public Integer getAvailableProduct() (vrati dostupanProizvod; ) public void setAvailableProduct(Integer availableProduct) ( this.availableProduct = availableProduct; ))

Dakle, imate dva primjera klasa entiteta. Napravite ostatak koristeći ove primjere. Polja kao što su: model, godina izdanja, naziv, trošak - sve je na vašoj mašti. Obavezno uključite polje Dostupno. Kasnije će vam biti od koristi. Možete ga učiniti booleovim i dodati stupac koji se zove količina. Ovo je sve što nam treba.

Sada dajmo primjer našeg HibernateUtila

/* * Za promjenu ovog predloška odaberite Alati | Predlošci * i otvorite predložak u uređivaču. */ paket edu.shumenko.hibernate; import edu.shumenko.entity.BookEntity; import edu.shumenko.entity.CableEntity; import edu.shumenko.entity.CameraEntity; import edu.shumenko.entity.CartEntity; import edu.shumenko.entity.CustomerEntity; import edu.shumenko.entity.NotebookEntity; import edu.shumenko.entity.ProductEntity; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.SessionFactory; /** * Hibernate Utility klasa s prikladnom metodom za dobivanje Session Factory * objekta. * * @author Mikhail Shumenko */ javna klasa HibernateUtil ( //Stvorite našu SessionFactory. private static final SessionFactory sessionFactory; static ( pokušajte ( //Stvorite novu instancu AnnotationConfiguration AnnotationConfiguration ac = new AnnotationConfiguration(); //Ovo nam treba u kako bismo dodali sve naše klase entiteta. //svaki vaš entitet mora biti registriran ovdje, ako ga ne napišete, neće raditi. .class).addAnnotatedClass(NotebookEntity.class).addAnnotatedClass( CartEntity.class).addAnnotatedClass(CustomerEntity.class); //Tako da smo zapravo stvorili našu tvornicu sesija. //Potrebna nam je jer s bazom podataka radimo kroz sesije / /Detalji će doći kasnije, dok vi znate kako to učiniti i kako raditi s njim sessionFactory = ac.configure().buildSessionFactory(); ) catch (Throwable ex) ( // Zabilježi iznimku. System.err. println("Inicijalna kreacija SessionFactory nije uspjela." + ex); izbaciti novi ExceptionInInitializerError(ex); ) ) javni statički SessionFactory getSessionFactory() (vrati sessionFactory; ) )

DAO

Prijeđimo na sljedeći dio. Što je DAO. Ovo je uzorak dizajna.

Njegovo značenje:
- Sav pristup bazi podataka u sustavu se vrši preko DAO-a za enkapsulaciju.
- Svaka DAO instanca je odgovorna za jedan primarni objekt domene ili entitet. Ako objekt domene ima neovisan životni ciklus, mora imati vlastiti DAO.
- DAO je odgovoran za kreiranje, čitanje (prema primarnom ključu), ažuriranje i brisanje (tj. CRUD (kreiranje, čitanje, ažuriranje, brisanje)) objekta domene.
- DAO može riješiti upite na temelju kriterija koji nisu primarni ključ. Odnosim se na metode kao što su tražilo ili tražilo. Finder metoda obično vraća zbirku objekata domene za koje je odgovoran DAO.
- DAO ne obrađuje transakcije, sesije ili veze. To se radi izvan DAO-a radi fleksibilnosti.
Google će vam uvijek reći više.

Za sada ćemo napisati DAO za naše proizvode.
Pa razmislimo o tome što nam stvarno treba. Tablica proizvoda će imati 4 polja Id,nameProduct,available+amount+actionForServlet. Trebat će nam za izradu kategorija na našoj stranici. Nemojmo se još zamarati zadnjim poljem. Jedino što trebamo je dobiti popis proizvoda.

Pišemo sučelje
javno sučelje ProductDAO ( ProductDAO INSTANCE_PRODUCT= novi ProductDAOImpl(); Popis GetProducts(); //i metoda s kojom ćemo raditi)

Implementacija našeg sučelja. Pogledajte objašnjenje u kodu
/* * Za promjenu ovog predloška odaberite Alati | Predlošci * i otvorite predložak u uređivaču. */ paket edu.shop.model.dao; import java.util.List; import org.hibernate.criteria; import org.hibernate.Session; /** * * @author Mikhail Shumenko */ javna klasa ProductDAOImpl implementira ProductDAO ( @Override public List GetProducts() (Popis rezultat = null; //Kreiraj sesiju, potrebna je za korištenje transakcija //Ugrubo rečeno, transakcija je poput točke vraćanja, ako nije prošla do kraja, onda se sve promjene poništavaju. Sesija sesije = HibernateUtil.getSessionFactory().openSession(); try ( session.beginTransaction().begin(); //Kriteriji se koriste za upite za dobivanje podataka iz baze podataka //Mislim da vam je ova formulacija za sada dovoljna //Prolazimo klasu entiteta koju koristimo kao parametar. Ako su podaci primljeni iz tablice Cart tada prođu //to bi bilo potrebno Cart.class Criteria Criteria = session.createCriteria(Product.class); rezultat = (List ) kriteriji.list(); session.getTransaction().commit ) catch (Exception e) ( //Obavezno napišite rukovanje iznimkama. Ali to ću prepustiti vama. e.printStackTrace(); ) konačno ( if (session != null) sesija. zatvori(); ) vrati rezultat; ))

Dakle, sada imamo mogućnost dobivanja podataka iz baze podataka. Možete koristiti skriptlete za stvaranje jednostavne petlje za svaki i izlaz vaših proizvoda na stranicu index.jsp

Kategorije

//INSTANCE_PRODUCT što je to? //ProductDAO opisuje takvu varijablu, ona je odgovorna za stvaranje ProductDAOImpl //Pa, sve će nam biti drugačije, ne morate je previše pamtiti. //ProductDAO INSTANCE_PRODUCT= new ProductDAOImpl();<% for (Product product:ProductDAO.INSTANCE_PRODUCT.getProducts()) {%> <%}%> <% for (Product product: ProductDAO.INSTANCE_PRODUCT.getProducts()) {%> <%}%>
Kategorija"><%=product.getName()%>
Dostupnost<%=product.getAvailable()%>

Ali ovo je prvi put, ali općenito je loše to učiniti. Ovo krši naše MVC uzorak. Kako to učiniti ispravno, objasnit ću u sljedećoj lekciji, ako mi daju pozivnicu. U drugoj lekciji bavit ćemo se proljećem, u trećoj ćemo se dotaknuti Tvorničkog uzorka i uroniti u hibernaciju. Za one koji su posebno nestrpljivi, pokazat ću vam kako izbrisati iz baze, spremiti u bazu i obrisati sve iz baze u potpunosti. Pa, kako sve to općenito uspostaviti u interakciji s našom aplikacijom i ostavit ćemo detaljno razmatranje za kasnije.

Spremi u DB

public void addItemToCart(CartEntity cart) (Sesija sesije = HibernateUtil.getSessionFactory().openSession(); pokušaj (session.beginTransaction().begin(); session.save(cart); session.getTransaction().commit(); ) catch (Exception ex) ( ex.printStackTrace(); ) konačno ( if (session != null) ( session.close(); ) ) )

Izbriši iz baze podataka po id

public void deleteItemFromCart(Integer id) (Sesija sesije = HibernateUtil.getSessionFactory().openSession(); pokušaj (session.beginTransaction().begin(); CartEntity itemDelete = (CartEntity) session.get(CartEntity.class, id); session.delete(itemDelete); session.getTransaction().commit(); ) catch (exception ex) (ex.printStackTrace(); ) konačno ( if (session != null) ( session.close(); ) ) )

Uklanjanje ID-a grupe iz baze podataka.

public void deleteAllItemToCart(List idAllItemsInCart) ( Sesija sesije = HibernateUtil.getSessionFactory().openSession(); pokušaj (session.beginTransaction().begin(); for(Integer id:idAllItemsInCart)(CartEntity itemDelete = (CartEntity)Entity.get session.get. id); session.delete(itemDelete); ) session.getTransaction().commit(); ) catch (exception ex) (ex.printStackTrace(); ) konačno ( if (session != null) ( session.close() ;) ))

Trebat će vam i konfiguracijska datoteka hibernacije. Napravite bazu podataka trgovine u Derbyju. Korisničko ime i lozinka su root i pass. Ako ne uspije - ne brini - dat ću još malo vremena.

org.hibernate.dialect.DerbyDialect org.apache.derby.jdbc.ClientDriver jdbc:derby://localhost:1527/shop korijen proći UTF-8 Ažuriraj

Kasnije ćemo razgovarati o tome kako ispuniti naše baze podataka. Možete ih ispuniti ručno. Ili pričekajte sljedeću lekciju.

13.05.05 14,8K

Uvod

Tehnologija Java Server Pages (JSP) sastavni je dio objedinjene tehnologije za kreiranje J2EE poslovnih aplikacija. JSP je alternativna tehnika za razvoj aplikacija koje dinamički generiraju odgovor na određene zahtjeve klijenata. Prije nego što se koristi JSP dokument, posebna procedura ga pretvara u odgovarajući servlet. Zauzvrat, servlet se obično upisuje Java jezik i implementira specifično sučelje. Nadalje, servlet također nije samostalna aplikacija i funkcionira samo kada je smješten u odgovarajući web kontejner. Web kontejner osigurava razmjenu podataka između servleta i klijenata, obavlja takve funkcije kao što je stvaranje softverskog okruženja za funkcionalni servlet, identificiranje i autorizacija klijenata, organiziranje sesije za svakog od njih.

Na ovaj trenutak implementiran je prijevod JSP stranice u servlet, čiji je programski kod napisan u Javi. Međutim, autori specifikacije Java Server Pages ostavljaju mogućnost JSP implementacije u drugim programskim jezicima.

Odnos između servleta poslovnih aplikacija i URL-ova na poslužitelju naveden je u deskriptoru implementacije. Tehnologija implementacije servleta razmatra se u zasebnom članku. Za sada je važno napomenuti činjenicu da kod koji se koristi za pisanje servleta nije uvijek prikladan za dinamičko generiranje tekstualnih dokumenata kao odgovor na zahtjev klijenta. Na primjer, fragment servleta koji generira dinamički HTML stranice, može izgledati ovako:

PrintWriter out = res.getWriter(); out.println(" ");out.println(" "); ...out.println("");out.println("");out.close();

Kao što vidimo, svaki HTML niz dokument u servletu odgovara određenom dijelu koda, što ne doprinosi jednostavnosti razvoja i održavanja poslovnih aplikacija.

Prikladnije je odvojiti dinamičke i statičke dijelove generirane web stranice. Za izradu dinamičkog dijela i dalje će se koristiti Java ili drugi programski jezik. Ima smisla urediti statički dio kao tekstualni dokument - Java Server Page (JSP stranica), dizajniranu u skladu s HTML zahtjevi, XML ili neki drugi standard za označavanje. Zapravo, JSP stranica se može promatrati kao predložak ili prototip dinamičke stranice, koju treba nadopuniti dinamičkim elementima. Za opis dinamičke komponente, JSP tehnologija pruža dva glavna mehanizma: komponente JavaBean i biblioteke dodatnih oznaka. Kao rezultat toga, JSP tehnologija uključuje paralelni rad na primjeni dvaju različitih stručnjaka: programera i voditelja izgleda dokumenata (web mastera), koji su odgovorni za razvoj dinamičkih i statičkih dijelova dokumenata generiranih kao odgovor na klijenta. zahtjevi.

Kao što je već spomenuto, prije korištenja JSP stranice, ona mora biti konvertirana u odgovarajući servlet. Ova se transformacija može izvesti ili kada se JSP stranica postavi na poslužitelj, ili kada klijent pristupi stranici po prvi put. Budući da je postupak pretvorbe prilično naporan i dugotrajan, obično se izvodi samo jednom. Sve naknadne zahtjeve klijenta na JSP stranicu poslužitelj automatski preusmjerava na servlet koji je dobiven kao rezultat njegove konverzije.

Servlet koji nastaje pretvorbom JSP stranica djeluje unutar standardnog spremnika servleta i koristi strogo definirano sučelje. Stoga ova tehnologija ne ovisi ni o kakvim značajkama određene hardverske platforme. S druge strane, budući da se JSP tehnologija može izgraditi na temelju interpretiranog jezika Java, to jamči prenosivost aplikacija izgrađenih na JSP tehnologiji na bilo koju platformu na koju možete instalirati virtualna Java automobil.

jsp stranicu

Obično se u njoj pohranjuje JSP stranica zasebna datoteka s .jsp ekstenzijom. Većina sadržaja JSP stranice je prevedena u servletu u skup out.println() instrukcija. Primjer JSP stranice:

<%@ taglib uri="/exttags.tld" prefix="dscat" %> <%@ page import = "xbcat.util.*" %> Svi kupci <% Vector menu=pagescroll.getMenu(); if(pagescroll.page.size() > 0) { %>

<%= pagescroll.getTotalPages() %> <% if(!pagescroll.isSinglePage()) { for(int i=0; i "><%= name %> <% } else { %> <%= name %> <% } } } %>

Dinamička komponenta JSP stranice predstavljena je s tri vrste posebne predmete: direktive, akcije i skripte. Svaki od njih detaljnije je razmotren u odgovarajućem odjeljku.

direktive

Budući da ga web-kontejner, prije korištenja JSP stranice koju su osigurali programeri poslovnih aplikacija, prevodi u odgovarajući servlet, ima smisla osigurati mogućnost ostavljanja direktiva na JSP stranici koje će kontrolirati proces prevođenja. Direktive imaju sintaksu

<%@ директива... %>

Pogledajmo neke od ovih direktiva.

direktiva stranice. Deklariše skup svojstava JSP stranice. Sintaksa direktive:

<%@ page список_параметров %>

Opišimo neke od njih zanimljivi parametri ove direktive:

  • import - Kao što je već spomenuto, JSP stranica se prije upotrebe mora pretvoriti u programski kod - klasu odgovarajućeg servleta. Zauzvrat, klasa servleta može pozvati druge klase iz standarda Java knjižnice ili klase iz drugih paketa. Prema zadanim postavkama, klasa servleta dobivena nakon prevođenja JSP stranice može imati veze na pakete java.lang, java.servlet, java.servlet.jsp i java.servlet.http. Ako klasa servleta treba komunicirati s drugim paketima, kao što je xbcat.util kao u primjeru JSP stranice iznad, potonju treba dopuniti direktivom stranice koja ima atribut import s imenom odgovarajućeg paketa.
  • sesija - ako se HTTP koristi za komunikaciju s klijentom, tada se prema zadanim postavkama kreira objekt sesije za svaku sesiju, što vam omogućuje spremanje informacija o ovom klijentu u intervalu između njegovih poziva poslužitelju. S druge strane, ako je atribut sesije specificiran s vrijednošću false, to vam omogućuje da odbijete stvaranje objekta sesije i koristite oslobođene resurse poslužitelja za druge zadatke.
  • međuspremnik - sadržaj stranice stvorene kao odgovor na zahtjev klijenta servlet prosljeđuje u izlazni tok, odakle ga zatim web-spremnik prenosi izravno klijentu. Kako bi se dobio optimalniji način prijenosa, ovaj tok ima način rada međuspremnika. U ovom slučaju, zadana veličina međuspremnika je 8 kilobajta. Parametar međuspremnika direktive stranice omogućuje vam da postavite drugu veličinu međuspremnika ili potpuno napustite način rada međuspremnika prosljeđivanjem atributa vrijednosti "none".
  • isThreadSafe - Prema specifikaciji servleta, zadani web-spremnik omogućuje istoj instanci servleta da paralelno obrađuje zahtjeve više klijenata. U ovom slučaju, svakom od zahtjeva dodjeljuje se posebna nit. U međuvremenu, u nekim je slučajevima korisno onemogućiti paralelnu obradu zahtjeva. (Odgovarajući kontroler u web kontejneru stavlja u red dolazne zahtjeve i prosljeđuje ih servletu za obradu točno jedan po jedan.) Da biste to učinili, dovoljno je koristiti isThreadSafe atribut, s vrijednošću false.
  • pageEncoding - omogućuje razvojnom programeru aplikacije da deklarira kodiranje koje će se koristiti u dokumentu koji se šalje klijentu. Prema zadanim postavkama, stranica se smatra u ISO-8859-1 kodiranju.
  • contentType - Kao odgovor na zahtjev klijenta, zadana JSP stranica generira dokument HTML tip. U isto vrijeme, opseg tehnologije Java Server Pages je mnogo širi, jer vam omogućuje generiranje bilo koje druge vrste tekstualnih dokumenata: XML, WML, VRML itd. MIME tip generiranog dokumenta deklariran je atributom contentType. Kao što je već jasno, prema zadanim postavkama ovaj atribut ima vrijednost "test/html". Zajedno s vrstom dokumenta, JSP specifikacija omogućuje da se kodiranje generiranog dokumenta specificira u istom atributu.

taglib direktiva. Omogućuje vam korištenje dodatnih oznaka koje je izradio programer aplikacije (prilagođene oznake) na JSP stranicama. Sintaksa direktive:

<%@ taglib uri="URI библиотеки тэгов" prefix="имя префикса" %>

gdje je uri apsolutni ili relativni URI koji jedinstveno identificira deskriptor biblioteke oznaka povezan s navedenim prefiksom. Navedeni prefiks se koristi za identifikaciju odgovarajućih prilagođenih oznaka.

<%@ taglib uri="http://www.mycorp/supertags" prefix="super" %> ... ... ...

O postupku izrade prilagođenih oznaka bit će riječi kasnije.

uključiti direktivu. Koristi se za postavljanje tekstova i programskog koda iz drugih izvora na JSP stranicu. Zamjena se izvodi u trenutku kada je JSP stranica prevedena u odgovarajući servlet. Primjer korištenja direktive:

<%@ include file="menu.jsp" %>

Imajte na umu da se zamjena materijala iz vanjskog izvora može izvesti i pomoću posebne oznake koje ćemo kasnije razmotriti. Razlika između ove oznake i opisane direktive je u tome što se zamjena provodi izravno u procesu obrade zahtjeva klijenta, te se stoga može povezati s parametrima zahtjeva.

Fragment programskog koda na JSP stranici (skripta)

Skripta, kao i drugi elementi, donosi dinamičku komponentu u konačni dokument. Međutim, za razliku od njih, skripta je programski kod smješten izravno u tekst JSP stranice. Skripta može izvoditi izračune ili manipulirati objektima, što vam omogućuje vizualno povezivanje karakteristika generirane stranice s parametrima zahtjeva klijenta i poslovnim pravilima aplikacije. Elementi skripte dolaze u tri vrste: deklaracije, skriptleti i izrazi.

Deklaracije

Nakon što se JSP stranica pretvori u servlet, većina njenog sadržaja odlazi u metodu _jspService() koja se poziva kad god treba obraditi narudžbu korisnika. Deklaracija na JSP stranici najčešće se koristi za deklariranje dodatnih atributa i metoda u klasi servleta koji će biti dostupni prilikom obrade bilo kojeg zahtjeva klijenta. Deklaracije imaju sintaksu<%! … %> .

Primjeri deklaracija na JSP stranici:

<%! int i; %> <%! int i = 0; %> <%! public String f(int i) { ... } %>

Skripte

Skriptlet može sadržavati programski kod i deklaracije lokalnih varijabli koje će se koristiti za obradu zahtjeva klijenta. Zapravo, skriptlet je dio programskog koda iz budućeg servleta, koji će s vremenom biti smješten u metodu _jspService (). Budući da je dio servleta, skriptlet dobiva pristup objektu odgovora i, sukladno tome, može samostalno formirati određeni dio završne dinamičke stranice. Međutim, najčešće se skriptleti ne koriste za to, već za upravljanje objektima poslovne logike i logikom aplikacije.

Skriptlet ima sintaksu<% … %>. Primjer korištenja skriptleta u sadržaju JSP stranice:

<% if (i == 0) { %>dobro jutro<% } else { %>dobar dan<% } %>

Da biste cijenili jasnoću i jednostavnost ove konstrukcije, usporedite je s ekvivalentnim isječkom koda u servletu:

if (i == 0) ( out.println("Dobro jutro"); ) else (out.println("Dobar dan"); )

Izrazi

Često stranica koja se šalje klijentu sadrži rezultate izračuna ili poziva na određene metode i atribute određenih klasa. Bilo koji od ovih dinamičkih elemenata može se pretvoriti u niz i prikazati na JSP stranici pozivanjem out.println u odgovarajućem skriptletu:

<% UserProfile user = (UserProfile) session.getValue("Profile"); %> <% out.println(user.getFaxNumber()); %>

Prikladnije je i jasnije predstaviti drugi redak u gornjem primjeru u višestrukom obliku, koristeći sintaksu izraza<%= … %> :

<%= user.getFaxNumber() %>

Još jedan primjer korištenja izraza u tijelu JSP stranice:

<%! int i = 0; %>Bok, sada obrada servleta<%= ++i %>th zahtjev.

JSP stranice i objekti

Tijekom obrade zahtjeva JSP stranica može pristupiti objektima koji se nalaze na poslužitelju, kreirati ih i mijenjati. Objektima se pristupa kroz skripte i elemente akcije. Svaki objekt kreiran u aplikaciji ima određeni vijek trajanja, koji je deklariran u odgovarajućem atributu. Specifikacija predviđa četiri intervala:

  • stranica — Objekt čiji je životni vijek definiran kao stranica dostupan je samo unutar JSP-a stranice na kojoj je stvoren. Sve reference na ovaj objekt moraju biti puštene odmah nakon što je klijentov zahtjev obrađen.
  • zahtjev — Objekt čiji je životni vijek definiran kao zahtjev dostupan je svim stranicama povezanim s obradom danog zahtjeva. Konkretno, ako postoji preusmjeravanje obrade na novu JSP stranicu, danom objektu bit će dostupan i na staroj i na novoj stranici. Kao iu prethodnom slučaju, reference na objekt moraju se osloboditi nakon obrade zahtjeva.
  • sesija - Objekt s opsegom sesije dostupan je svim stranicama koje obrađuju zahtjeve povezane s određenom sesijom (sesijom s određenim klijentom). Reference na objekte povezane sa sesijom postavljaju se u objekt sesije. Na kraju komunikacijske sesije, veze moraju biti puštene.
  • primjena - Najopćenitiji opseg. Objekti koji imaju opseg primjene nisu vezani ni za jedan zasebna stranica ili sesije i dostupni su na svim JSP stranicama aplikacije.

JSP stranica uvijek ima pristup određenom skupu objekata, kreiran web zadani spremnik:

  • zahtjev — Objekt koji sadrži zahtjev klijenta. Odnosi se na klasu javax.servlet.ServletRequest ili drugu klasu koja nasljeđuje od nje. Na primjer, za HTTP protokol, ovo bi bio objekt klase javax.servlet.http.HttpServletRequest. Opseg objekta je zahtjev.
  • odgovor — Objekt u koji će servlet smjestiti odgovor na zahtjev korisnika. Odnosi se na klasu javax.servlet.ServletResponse ili drugu klasu koja je nasljeđuje. Na primjer, za HTTP protokol, to bi bio objekt klase javax.servlet.http.HttpServletResponse. Opseg objekta je zahtjev.
  • pageContext - Objekt koji definira JSP kontekst stranice. Opseg objekta — stranica
  • sesija - objekt koji je stvorio spremnik za identifikaciju klijenta, kao i za pohranu osobnih objekata. Kreiran od strane spremnika za HTTP protokol i instanca je klase javax.servlet.http.HttpSession.
  • aplikacija - Objekt povezan s konfiguracijom servleta koji odgovara ovoj JSP stranici. Opseg objekta je primjena.
  • out — Objekt koji sadrži izlazni tok servleta. Informacije poslane ovom streamu bit će proslijeđene klijentu. Objekt je instanca klase javax.servlet.jsp.JspWriter. Na primjer, većina statičkog predloška na JSP stranici idealno bi trebala biti napisana kao odgovarajući skup out.println() naredbi. Opseg objekta je stranica.
  • config - Objekt povezan s konfiguracijom servleta. To je instanca klase javax.servlet.ServletConfig. Za JSP stranicu, opseg konfiguracijskog objekta je stranica.
  • stranica — Objekt povezan s prikazivanjem ove stranice. Opseg - str

akcijski elementi

Bez obzira na vrstu dokumenta koji je generiran kao odgovor na zahtjev korisnika, općenito će JSP stranica sadržavati tekst i oznake. Očito, potonji odgovaraju vrsti dokumenta koji se generira: HTML, XML i tako dalje. Osim toga, tijelo JSP stranice može sadržavati fragmente Java koda koji moraju biti dio servleta primljenog nakon prijevoda: deklaracije, skriptlete i izraze. Ideja je nadopuniti skup standardnih oznaka za označavanje posebnim oznakama – elementima akcije, iza kojih programer poslovne aplikacije može sakriti dio programskog koda koji se odnosi na aplikaciju, ili neke dodatne upute.

Imajte na umu da su sa stajališta stručnjaka za izgled dokumenta akcijski elementi iste oznake kao i svi ostali, pa ih je stoga dopušteno koristiti. dijeljenje sa ostalim elementima:

Pogledajmo neke od ovih elemenata.

Standardni akcijski elementi

Standardni elementi radnje izgledaju kao normalne oznake čiji naziv počinje s jsp:, na primjer . Prema XML terminologiji, to znači da standardni elementi akcije u JSP tehnologiji pripadaju jsp imenskom prostoru.

jsp:useBean

Element jsp:useBean omogućuje vam korištenje objekata koji odgovaraju JavaBean komponentama na JSP stranici. Element sadrži parametar koji povezuje jedinstveni identifikator s komponentom. Potonji će se tada koristiti prilikom pristupa ovom objektu:

U ovom primjeru kreiran je objekt klase com.myco. U budućnosti, za upućivanje na njega, dovoljno je koristiti identifikator "kupac". Na primjer:

<%= customer.getName() %>

Prema zadanim postavkama, objekti povezani s elementom JavaBean prema zadanim postavkama imaju opseg stranice. Programer JSP stranice može odrediti više Dugo vrijeme postojanje JavaBean objekta korištenjem elementa opsega prilikom pisanja elementa jsp:useBean. Moguće vrijednosti za ovaj atribut – stranica, zahtjev, sesija i aplikacija – raspravljali smo malo ranije kada smo govorili o opsegu objekata povezanih s JSP stranicom.

Nećemo pokrivati ​​preostale atribute elementa jsp:useBean. Evo još samo jednog primjera njegove uporabe:

Unutarnju strukturu JavaBean elemenata raspravljat ćemo u zasebnom članku.

jsp:setProperty i jsp:getProperty

Svaka klasa mora dati pristup nekim svojim atributima i metodama. Razlika između JavaBean elementa je u tome što je njegov pristup atributima unificiran i implementiran na JSP stranici pomoću elemenata jsp:setProperty i jsp:getProperty.

Element jsp:getProperty uzima instancu Bean-a, dohvaća vrijednost navedenog atributa, pretvara ga u niz ako je potrebno i stavlja ga u tok podataka koji se prosljeđuje klijentu. Na primjer, prema sljedećem unosu

vrijednost svojstva name iz instance Beana s identifikatorom korisnika stavlja se u generirani dokument.

Element jsp:setProperty, za razliku od prethodnog, ne dohvaća, već postavlja novu vrijednost atributa. Na primjer:

Osim eksplicitnog postavljanja novih vrijednosti, element jsp:setProperty omogućuje vam postavljanje atributa objekta s vrijednošću koja se preuzima iz zahtjeva klijenta. Na primjer:

Ovaj unos znači da se među podacima primljenim od klijenta nalazi parametar za prijavu i njegova vrijednost se prosljeđuje kako bi se stavila u atribut name objekta Bean s identifikatorom "korisnik".

Konačno, kada se nazivi polja u zahtjevu klijenta podudaraju s nazivima atributa Bean objekta, postoji još jedna opcija kada se sve vrijednosti prenose odjednom. Na primjer:

jsp:uključi

Kao i direktiva uključivanja, ovaj element vam omogućuje da stavite statički i dinamički materijal iz vanjskog izvora u tijelo dinamički generirane stranice. Pritom, iako se ovako posuđena građa obrađuje u istom kontekstu kao Trenutna stranica, dopušta mu se samo pristup izlaznom toku servleta. Na primjer, kod uključen u JSP stranicu ne bi trebao pristupiti kolačićima ili koristiti prilagođena zaglavlja koja deklariraju kodiranje ili vrstu dokumenta.

Razlika između direktive include i elementa jsp:include je u tome što za njega uključeni materijal ne može biti dinamičan, a pretraživanje i obrada mogućih dinamičkih fragmenata ne provodi se zasebno, već nakon uključivanja, s cijelom stranicom.

Primjer korištenja elementa jsp:include:

jsp: naprijed

Ovaj element vam omogućuje preusmjeravanje daljnjeg formiranja dinamičke stranice na drugu JSP stranicu, servlet ili korištenje unaprijed pripremljenog teksta za dovršetak. Na primjer:

U sljedećem, više složen primjer dinamička stranica završava sadržajem tekstualnu datoteku, čije je ime preuzeto iz varijable someValue:

Zaključno, treba napomenuti da postoje dvije glavne sheme za obradu zahtjeva klijenata:

U prvom slučaju, obrada zahtjeva klijenta i formiranje dinamičke stranice kao odgovor izvode se unutar iste JSP stranice ili servleta. Potonji, ako je potrebno, može pristupiti JavaBean objektima ili uvoziti materijal iz vanjskih izvora korištenjem direktive include ili elementa jsp:include.

U drugom slučaju obrada se izvodi u dvije faze. Prvo, kontrola se prosljeđuje na servlet ili JPS stranicu koja zapravo obrađuje zahtjev. Na primjer, podaci se izdvajaju iz zahtjeva klijenta i stavljaju u bazu podataka ili atribute određenih objekata. Kontrola se zatim prosljeđuje zasebnoj JSP stranici ili servletu odgovornom za generiranje dinamičke stranice koja će se proslijediti klijentu. Istodobno, ne bi trebao nužno postojati nikakav odnos između obrade zahtjeva i generiranja nove stranice. Na primjer, to može biti samo kupac kojem se vraća početnu stranicu po završetku bilo kojeg postupka.

Dodatni setovi oznaka

Uvod

Protokoli za označavanje tekstualnih dokumenata kao što je HTML imaju strogo reguliran skup oznaka. Istodobno, tijekom izrade dokumenata često se javlja potreba za korištenjem dodatnih, posebnih oznaka, koje, iako nisu deklarirane u odgovarajućim specifikacijama, više odgovaraju predmetnom području poslovne aplikacije. S jedne strane, takve dodatne ili prilagođene oznake mogu se smatrati vrstom makronaredbi koje će biti zamijenjene ekvivalentnom kombinacijom standardnih oznaka prije prijenosa dokumenta klijentu. Alternativno, prilagođenu oznaku može pratiti određeni dio koda. Na primjer, sasvim uobičajena pojedinačna oznaka može biti brojač pogodaka ili izbornik, čiji sadržaj ovisi o ulozi koju ovaj klijent ima u poslovnom procesu.

Izrada prilagođenih oznaka povezana je s pisanjem specifičnog programskog koda. JSP tehnologija omogućuje smještaj ovog koda u poseban programski modul - biblioteku prilagođenih oznaka. Razvoj takvih knjižnica može se povjeriti trećim osobama. Povezivanje JSP stranice s određenom bibliotekom prilagođenih oznaka vrši se pomoću prethodno opisane taglib direktive. Navedena direktiva povezuje deskriptor odgovarajuće biblioteke s određenim prefiksom, koji zauzvrat identificira sve prilagođene oznake iz ove biblioteke u JSP tijelu stranice. Da, direktiva

<%@ taglib uri="/exttags.tld" prefix="dscat" %>

izjavljuje da JSP stranica koristi biblioteku dodatnih oznaka, od kojih naziv svake počinje prefiksom dscat. Na primjer:

Svi kupci

Programski kod ove biblioteke opisan je deskriptorom exttags.tld. Ovdje se nećemo zadržavati na pravilima za pisanje deskriptora knjižnice, već ćemo razmotriti samo jedan od mogućih primjera njegove implementacije:

1.0 1.2 dscat zaglavlje stranice en.view.tag.PageHeader

Izrada prilagođene biblioteke oznaka

Prilagođene oznake bez obrade sadržaja

Kod za podršku prilagođene oznake je na poseban način pisana instanca Java klase koju web-kontejner poziva kad god treba obraditi JSP stranicu koja sadrži odgovarajuću oznaku.

U najjednostavnijem slučaju, da biste podržali prilagođenu oznaku, možete uzeti bilo koju od klasa poslovnih aplikacija i dopuniti je metodama koje odgovaraju sučelju oznake. Ako ne trebate koristiti vanjske objekte, tada se TagSupport može koristiti kao osnovna klasa. Ove i druge standardne klase i sučelja nalaze se u paketu javax.servlet.jsp.tagext.

Primjer klase koja podržava prilagođenu oznaku:

public CopyrightTag proširuje TagSupport ( public int doStartTag() izbacuje iznimku ( pageContext.getOut().print(" © Autorsko pravo 2001"); vrati SKIP_BODY; ) public int doEndTag() (vrati EVAL_PAGE; ) )

Metode klase koja obrađuje prilagođenu oznaku pozivaju se određenim slijedom. Kada obrada dosegne početnu prilagođenu oznaku na JSP stranici, poziva se metoda doStartTag() da je obradi. Kada obrada dosegne odgovarajuću završnu oznaku, poziva se metoda doEndTag(). Metode doInitBody() i doAfterBody() koriste se za obradu dijela JSP stranice između ove dvije oznake.

Uz činjenicu da metoda doStartTag() može obaviti neku obradu zahtjeva, važna je i povratna vrijednost. Ako je SKIP_BODY, tada će se informacije između odgovarajućih početnih i završnih oznaka zanemariti, a obrada JSP stranice skočit će ravno na završnu oznaku. Kako bi se sadržaj prilagođene oznake i dalje obrađivao, metoda mora vratiti EVAL_BODY_INCLUDE. Slično, ako metoda doEndTag() vrati SKIP_PAGE, tada će ostatak JSP-a stranice nakon završne oznake biti zanemaren. Kako bi se to spriječilo, metoda bi trebala vratiti EVAL_PAGE.

U nekim slučajevima može biti potrebno prikazati sadržaj prilagođene oznake ne samo jednom, već nekoliko puta. U ovom slučaju, klasa koja obrađuje oznaku mora implementirati sučelje IterationTag ili koristiti klasu TagSupport kao nadređenu. Da bi se još jednom ponovio prikaz sadržaja prilagođene oznake, metode doStartTag i doAfterBody moraju vratiti EVAL_BODY_AGAIN.

Prilagođene oznake s rukovanjem sadržajem

Ako je potreban pristup sadržaju prilagođene oznake, tada odgovarajuća Java klasa mora implementirati sučelje BodyTag ili naslijediti klasu BodyTagSupport. U oba slučaja, klasa može implementirati metode doInitBody i doAfterBody.

Metoda doInitBody se poziva odmah nakon što se pronađe sadržaj oznake, ali prije nego što se obradi. Obično se ova metoda koristi kada je potrebno inicijalizirati klasu ovisno o sadržaju prilagođene oznake.

Metoda doAfterBody se poziva nakon što se obradi sadržaj prilagođene oznake. Kao u prethodnom odjeljku, metoda doAfterBody može naznačiti treba li se sadržaj oznake ponovno obraditi. Ako je potrebno, metoda mora vratiti vrijednost EVAL_BODY_BUFFERED. U suprotnom, mora vratiti SKIP_BODY.

Uz prethodna dva, JSP tehnologija omogućuje pozivanje metode release kako bi se omogućila klasa koja podržava prilagođenu oznaku da oslobodi resurse koji su joj dodijeljeni, kao i da proizvede druge potrebne radnje da se vrati u prvobitno stanje.

Za izravan pristup sadržaju prilagođene oznake, tehnologija nudi dvije metode: getString i getReader.

Atributi u prilagođenim oznakama

Osim informacija između početne i završne oznake, prilagođena oznaka može imati neke atribute koji također mogu utjecati na način na koji se obrađuje zahtjev klijenta. Za svaki od ovih atributa, klasa koja implementira prilagođenu oznaku mora sadržavati odgovarajući atribut, kao i dva dobiti metodu i postaviti. Na primjer, ako prilagođena oznaka izgleda kao

tada klasa koja implementira ovu prilagođenu oznaku mora sadržavati sljedeći kod:

iz

Dobar loš

Vrhunski povezani članci