Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Windows Phone
  • Jsp opis za šta se koristi. Kako možete spriječiti direktan pristup JSP stranici iz pretraživača? Komentari i simboli citata

Jsp opis za šta se koristi. Kako možete spriječiti direktan pristup JSP stranici iz pretraživača? Komentari i simboli citata

Java Server Pages (tm) (JSP) tehnologija omogućava programerima i dizajnerima web aplikacija da brzo razviju i lako održavaju dinamičke web stranice. Ali opis gotovo svake tehnologije ove namjene (ASP, PHP, Net.Data) popraćen je takvim riječima - brzo i jednostavno...

Uprkos vanjskoj sličnosti, JSP-ovi se razlikuju po nekim točkama koje ovu tehnologiju čine nečim više od samo još jednog alata za kreiranje dinamički generiranog sadržaja za web stranice.

Prvo, jednostavan popis:

  • zaista visoka prenosivost na više platformi; upotreba univerzalni jezik visoki nivo Java kao skriptiranje;
  • JSP nije neki samostalni alat za rješavanje prilično uskog spektra zadataka, iako prilično moćan, već još jedan u nizu čitave galaksije tehnologija koje kombinuje Java;
  • prava prilika za razdvajanje zadataka pisanja poslovne logike za web aplikaciju i korisničkog sučelja, što vam omogućava da samostalno razvijate i održavate različite dijelove projekta;
JSP tehnologija je direktna ekstenzija druge Java tehnologije - Servleta (tm) i također je usko povezana sa Java Beans (tm) tehnologijom i koristi oznake (tagove) slične XML-u i skriptlete napisane u Java programskom jeziku za ubacivanje logike stvarajući dinamički sadržaj web stranice, dok se HTML ili XML oznake prenose direktno 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 su takođe vrlo jednostavni. Kao i obično, razmotrite primitivni slučaj klase Zdravo svijete!
<%@ page contentType="text/html; charset=ibm866" %> <%@ page import ="java.net.*" %> <%@ page import ="java.util.Date" %> Ko sam ja? <% InetAddress localHost = InetAddress.getLocalHost(); Date localTime = new Date(); %>

Ko sam ja?

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

Čak ni sa osobom ne poznavanje Jave, razumijevanje gornjeg koda najvjerovatnije neće uzrokovati probleme. Hajde da se zadržimo na nekim tačkama: kod unutar oznaka<% %>, u stvari, postoji kod skriptleta; sve između<%-- --%>-- komentar; tag<%= позволяет вывести значение переменной в нужном месте страницы; <%@ page %>omogućava vam uvoz klasa i prilagođavanje nekih karakteristika u ponašanju stranice.

Ako je moć takvih konkurentskih (vjerovatno je to još uvijek tako ;-) alata poput PHP-a i Net.Data prvenstveno zbog ogromnog skupa unaprijed definiranih funkcija, onda cijeli konglomerat Java klasa i tehnologija stoji iza JSP-a.

Ali na ovako jednostavnom primjeru uopće nije očito zašto trebate birati JSP-ove i sve povezano s njima, prvenstveno servlete i bean-ove. Ipak, hajde da pokušamo da sagledamo neke od lepih aspekata JSP-a.

Upravljanje sesijama

Vrijednosti koje se pohranjuju i preuzimaju iz objekta sesije ne mogu biti primitivni tipovi podataka (int, double) i moraju biti predstavljene u obliku njihovih analognih klasa (Integer, Double).
HttpSession session = request.getSession (); // dobivanje objekta sesije ili kreiranje jednog session.getId () // dobivanje ID broja sesije Integer item = (Integer) session.getValue ("item") // preuzima sesiju objekta Integer. putValue ("ItemValue", itemName); // ItemValue ne smije biti primitivan

Upravljanje aplikacijama

Ponekad je potrebno serveru dati neke varijabilne vrijednosti na nivou lokacije, svaki klijent koristi i manipulira kopijama ovih podataka. JSP koristi objekat 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" serveru da uradi nešto kada se konvertuju iz JSP u servlet; direktivama prethodi @. Neke važne JSP direktive su navedene u nastavku, za potpunije upoznavanje, naravno, moraćete da pročitate nešto drugo.
uključi - uključi statičku ili dinamičku datoteku (uključuje na strani servera) <%@ include file="hello.jsp" %> import - rezultirajući servlet će uvesti dati paket<%@ import = "java.util.*" %>extends - servlet će proširiti (naslijediti) navedenu klasu (ovo je superklasa) <%@ extends = "java.util.Dictionary" %> implements - servlet će implementirati interfejs <%@ 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čko umetanje Java koda među statički HTML) i smatrate da su eksterne klase moćna biblioteka funkcija, vrlo je lako pretvoriti dinamičku stranicu u ogromno čudovište koje je teško otkloniti i sa ogromnim poteškoćama sa daljim modifikacijama i proširenjima.

Da, kao i konkurencija, složenost se može ublažiti razbijanjem složene stranice na nekoliko logički različitih dijelova i njihovo sastavljanje pomoću alata za uključivanje.

Postoje dvije opcije za uključivanje:

  • Statičko uključivanje, u isto vrijeme, JSP elementi u include datoteci se obrađuju, ako postoje i ulaze u rezultirajući generirani Java kod, u stvari, serlet:
    <%@ include file="includeheader.jsp"%>
    ili tako
    <%@ include file="includeheader.html"%>
    to jest, uključena datoteka uopće ne mora biti JSP stranica.
  • Dinamičko uključivanje, dok se sadržaj uključenog fajla obrađuje nezavisno, zapravo se na njega prenosi kontrola u trenutku izvršenja:
Zanimljivo je da se dinamički uključeni sadržaj može keširati nezavisno, što u nekim slučajevima daje značajne dobitke na složenim višekomponentnim stranicama. Ali mogućnost uključivanja je ipak vjerovatno najprimitivnija višestruke mogućnosti JSP.

Gotovo svi, počevši da prave web aplikaciju, suočeni su sa potrebom da se to obezbede korisniku zgodan alat za unos podataka, a ovdje po pravilu b O Postoji više problema nego samo pružanje informacija u obliku generiranih HTML stranica. Potrebno je osigurati dovoljnu inteligenciju unosa, osim toga, u slučaju greške u unosu, ne gubiti prethodno unesene i prenijeti tražene opće informacije sa stranice na stranicu. U Net.Data, na primjer, nisam našao način da to učinim osim korištenja skrivenih polja u obrascima za unos, dok pohranjivanje informacija sa životnim vijekom "sesije" postaje težak zadatak; kako se može izvući sa rješavanjem 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 sa nekim dodatna pravila programiranje.

To je vrlo moćan alat, ali zahtijeva određene stereotipe. JavaBeans su Java komponente koje mogu obavljati dobro definirane zadatke i uključuju objekte podataka. JavaBeans slijedi strukturirano objektni model: Bean ima javni konstruktor koji nema argumente, a njegova svojstva se postavljaju pomoću kontrolnog servleta pomoću introspekcije / refleksije.

Uključivanje bean-a u JSP "stranicu" se radi ovako:

... Dodatak <%=formHandler.getErrorMsg("description")%> Vlasnik <%= formHandler.getOwnerName()%> | <%= formHandler.getOwnerName()%> <%=formHandler.getErrorMsg("owner")%> ===> ili evo još jednog
sviđa mi se<%= Cindy.getFlavor() %>kafa. // The Coffee Bean: javna klasa Coffee (privatni String m_flavor; public Coffee () (m_flavor = "Regular";) public void setFlavor (String aroma) (m_flavor = flavor;) public String getFlavor () (povratak m_flavor;))

Neka objašnjenja za ovaj squeeze: scope = "request" znači da je životni vijek bean-a zahtjev, svojstvo = "*" znači da ovaj bean prihvata uz pomoć svojih metoda sve parametre proslijeđene u zahtjevu na ovu stranicu... Ove metode imaju jednostavno pravilo imenovanja: ako je parametar forme lastName, tada će metoda koja prima podatke imati ime setLastName, a metoda koja vraća podatke imat će getLastName.

Nažalost, dovoljno je teško demonstrirati punu snagu upotrebe pasulja jednostavna aplikacija... Međutim, ovaj članak nema za cilj dati svu dubinu, zadatak je zainteresirati.

Generalna linija koja se može pratiti u mnogim novijim publikacijama je razdvajanje rada dizajnera i rada programera, koji obezbjeđuje pisanje stvarnog rada sa bazom podataka i poslovnom logikom web aplikacije. Većina ovoga se može uraditi na nivou kante. Nažalost, napornost pisanja, prema najmanje na početna faza, paket JSP-servlets-beans izgleda veći od Net.Data i PHP-a (međutim, upoznat sam sa ovim drugim na malo većem nivou "Hello World!"). Ali čak ni korištenje kanti nije u potpunosti izuzeto od minimuma koristeći Javu Na stranici. Da bi došao do logičnog kraja i ostavio dizajneru samo ispravan raspored oznaka na stranici, JSP je uveo mogućnost pisanja prilagođenih biblioteka JSP oznaka.

Korištenje biblioteka oznaka omogućava, prvo, da se dodatno poveća ponovna upotreba koda, drugo, da se smanji složenost pisanja aplikacije i, treće, da se dodatno pomogne u podjeli posla. Nažalost, ovo drugo u našoj stvarnosti još nije dobilo odgovarajuću težinu pri odabiru razvojnog alata. U zaključku, dat ću mali primjer korištenja prilagođenih oznaka, na primjer, upit bazi podataka s izlazom rezultata u obliku tablice može izgledati ovako:
<%@ taglib uri="xsql.tld" prefix="xsql" %> ...

neštoneštoopis
"$1$""$2$""$3$"
ali to ne znači da bi trebalo tako da izgleda ;-)

Zapravo, tema je preširoka da bi se pokrila bez praznih mjesta u tako kratkoj prezentaciji.

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

JSP - može raditi na gotovo svakom web serveru, jer je ova tehnologija bazirana na programskom jeziku Java, koji je nezavisan od platforme. Java server stranice podržava HTML oznake, Javascript također sopstveni set oznake.

JSP - omogućava vam da odvojite dinamički dio stranice od statičkog. Ova tehnologija omogućava umetanje Java koda na stranicu. Nećemo razmatrati ovaj slučaj upotrebe za JSP jer se ova tehnologija smatra zastarjelom i nesavršenom. Razlog je jednostavan: programeri i dizajneri koji dizajniraju izgled stranice možda nisu uvijek upoznati sa Javom i to može uzrokovati dodatne poteškoće pri uređivanju ili održavanju web aplikacija.

Umjesto umetanja Java koda, sada se koristi jstl biblioteka oznaka ili Javascript za vrlo napredne. Razmotrit ćemo primjer sa jstl oznakama. Ovo je vrlo zgodna biblioteka koja ima gotovo sve funkcije koje su vam potrebne za kreiranje dinamičkih stranica. Ako vam treba nešto specifično, uvijek možete napisati svoj vlastiti tag i umetnuti njegov sadržaj na stranicu.

S JSP smo djelimično već od početka upoznati. Glavno tijelo JSP stranice je HTML, u koji se ubacuju oznake sa dinamičkim sadržajem.

Primer JSP stranice

Veoma neophodno znanje koje ćemo koristiti je JSP direktiva.

JSP direktiva je poruka koju stranica može poslati u odgovarajući kontejner, specificirajući akcije. Sintaksa direktive:<% @ атрибут = «значение» %>

Postoje tri glavne vrste direktiva:

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

Pošto kod nećemo umetnuti u stranicu, razmotrićemo posljednje dvije direktive.

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

Lokacija fajlova u projektu:

U kodu iznad možete pratiti upotrebu taglib direktive. Uz njegovu pomoć smo povezali biblioteku jstl tagova. Koristeći ovu direktivu, možete povezati biblioteku svojih vlastitih oznaka:<%@ taglib uri=»/WEB-INF/mylib.tld» prefix=»test» %>.

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

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

    < tr align= "center" >

    < td>$ (broj računa)

    < td>$ (račun. stanje)

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

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

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

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

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

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

$ (stavka)

Ovo je bočni kod povezan iznad. Kao što vidite, račvanje se ovdje koristi za prikaz samo informacija koje su dostupne određenom tipu korisnika.

sintaksa:
a jednako b

Najbolje je uzeti u obzir jstl oznake prilikom pisanja pravi projekat, budući da ne vidim razloga za učenje i pamćenje cijele sintakse za svaku radnju. Gornji kod bi trebao poslužiti samo kao primjer kako se ovo 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

Postavio sam projekat na heroku: https://payment-systemapp.herokuapp.com/ - ovde se koristi besplatan nalog, tako da za prvi zahtev treba da sačekate par minuta da projekat počne.

Servleti vam omogućavaju da primate zahtjeve od klijenta, obavite neki posao i prikažete rezultate na ekranu. Servlet radi dobro do dolazi obrada informacija, tj. prije prikazivanja informacija na ekranu. Možete ubaciti prilično složenu logiku u servlet, uputiti pozive bazi podataka i još mnogo, mnogo više što je potrebno za aplikaciju. Ali vrlo je nezgodno izvesti izlaz na ekran unutar samog servleta. I šta učiniti kada razvijate složene dizajnerske ideje, a zatim unosite promjene korisnički interfejs? Tehnologija dizajna Java serverske stranice (JSP) je jedna od J2EE tehnologija koja je proširenje servlet tehnologije kako bi se olakšao rad sa web sadržajem. JSP stranice olakšavaju razdvajanje web sadržaja na statičke i dinamičke dijelove, omogućavajući ponovnu upotrebu prethodno definiranih komponenti. Programeri Java Server Pages mogu koristiti JavaBeans komponente i kreirati vlastite prilagođene biblioteke oznaka koje obuhvataju 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). Kao i servleti, JSP komponente su Web komponente i nalaze se u Web kontejneru. JSP stranice su nezavisne od specifične implementacije Web kontejnera, što ih čini višekratnim. Pored klasa i interfejsa za programiranje servleta (paketa javax.servlet i javax.servlet / http), u pakovanjima javax.servlet.jsp i javax.servlet.jsp.target sadrži klase i interfejse koji se odnose na programiranje Java serverskih stranica. Puni opis Java tehnologije Stranice servera se mogu naći u specifikaciji na (java.sun.com/products/jsp/download.htm)

Pregled tehnologije Java serverskih stranica

Java Server Pages tehnologija sadrži četiri ključne komponente:
  1. Direktive (direktiva) su poruke za JSP kontejner, koje vam omogućavaju da definišete parametre stranice, povežete druge resurse, koristite sopstvene nestandardne biblioteke oznaka.
  2. Akcije (akcije) inkapsulirati funkcionalnost u unapred definisanim oznakama koje možete ugraditi u JSP stranicu. Radnje se često izvode na osnovu informacija koje se šalju serveru kao dio zahtjeva određenog klijenta. Akcije također mogu kreirati Java objekte za korištenje u JSP skriptletima.
  3. Skripte (skripteti) omogućavaju vam da ubacite Java kod u JSP stranice koji stupa u interakciju sa objektima stranice prilikom obrade zahtjeva.
  4. Biblioteke oznaka (biblioteka oznaka) dio su mehanizma proširenja oznaka koji vam omogućava da razvijete i koristite vlastite oznake.
Prisustvo podataka sa nepromjenjivom strukturom određuje izbor programera u odlučivanju koju tehnologiju će koristiti: servlete ili JSP stranice. Programeri radije koriste JSP stranice kada je većina sadržaja koji se šalje klijentu nepromjenjivi podaci i samo mali dio sadržaja se dinamički generira pomoću Java koda. Servleti su poželjni ako je samo mali dio sadržaja koji se šalje klijentu nepromjenjivi podaci. U stvari, pojedinačni servleti možda uopće neće generirati nikakav sadržaj za klijenta, radeći određeni zadatak u najboljem interesu 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 pokreću na strani web servera koji se zove JSP kontejner. Kada web server koji podržava JSP tehnologiju primi prvi zahtjev za JSP stranicu, JSP kontejner prevodi tu JSP stranicu u Java servlet koji opslužuje trenutni zahtjev i sve naredne zahtjeve za tu stranicu. Ako dođe do grešaka prilikom kompajliranja novog servleta, ove greške rezultiraju greške u vremenu prevođenja. JSP kontejner u fazi kompilacije stavlja Java naredbe koje implementiraju odgovor JSP stranice u metodu _jspService. Ako se servlet kompajlira bez greške, JSP kontejner poziva metodu _jspService za obradu zahtjeva. JSP stranica može direktno obraditi zahtjev ili može pozvati druge komponente web aplikacije da pomognu u procesuiranju zahtjeva. Sve greške koje se javljaju tokom obrade uzrokuju Izuzetak web servera u fazi zahtjeva... Sve statično HTML tekst poziva u JSP dokumentaciji HTML šablon(HTML šablona) se šalje direktno u izlazni tok. Izlazni tok stranice je baferovan. Klasa obezbeđuje baferovanje JspWriter proširenje klase Pisac... Veličina bafera je po defaultu ograničena na 8KB, ali se može promijeniti atributom tampon tag <%@ page> ... Prisustvo bafera omogućava pisanje zaglavlja odgovora u izlazni tok zajedno sa izlaznim tekstom. U baferu, zaglavlja će biti postavljena ispred teksta. Dakle, dovoljno je napisati JSP stranicu, snimiti je u datoteku sa ekstenzijom jsp i instalirajte datoteku u kontejner, baš kao HTML stranicu, bez brige o kompilaciji. Tokom instalacije možete podesiti početni parametri JSP stranice su iste 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, JavaBean-u, XML-u, itd.;
7) HTML + CSS (malo lepote po vašem ukusu, ali bolje je da platite levorukim ljudima - imate dovoljno problema sa serverskom stranom);
8) Java SE (poznavanje kolekcija, sposobnost rukovanja izuzecima... Generalno, standardni set);
9) Poznavanje obrazaca projektovanja (DAO, Fabrika);
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 sa prijateljima. Mislim da ne znaju svi početnici o spremištima, a ovaj dio je samo za njih.

SVN

Postoji takva stvar kao što je spremište - udaljeni server pohranjivanje koda.
Ako dobijete probni zadatak, a pošaljete ga u arhivu, najvjerovatnije ćete i vi biti poslani. Možda i neće, ali će se sigurno razočarati u vas.
Postoje različita spremišta za CVS, SVN, Git. Za početnike, mislim da je SVN optimalan. Pa, vama je najvažnije da ne znate šta je to, već da to možete primijeniti. Sve dok je ovo dovoljno, ostalo će doći sa iskustvom.

Nakon svega ovoga, imat ćete link do vašeg prostora. Da biste razumjeli o čemu se radi, morate uzeti jedan od svojih projekata (ili kreirati neki prazan projekat u NetBeans-u). Kliknite na njega desnim dugmetom i imaćete pristup "Kontrola verzija" -> "Uvoz u Subverziono spremište" u meniju. Nakon toga, pojavit će se dijaloški okvir s putanjom do spremišta - ovo je link koji ste dobili na stranici u kartici "Izvorni kod".

Zatim potpuno izbrišite projekat koji ste obavezali. Zatim idite u mapu u kojoj su pohranjeni vaši projekti i provjerite da li je sve zaista obrisano. Zatim se vraćate na NetBeans i tražite karticu Grupa u traci menija (na panelu gde datoteka, prikaz, uređivanje, prelaz, izvor...) sadrži našu Subverziju. A u podmeniju ima "Get". Nadalje, u dijaloškim okvirima morat ćete navesti vezu do spremišta (ovo je veza koju ste dobili na web-mjestu u kartici "Izvorni kod".) A kada on ponudi preuzimanje mapa, tada će vam trebati da pronađete svoj projekat u stablu spremišta i izaberete ga, a po završetku preuzimate svoj projekat. Ovako se razmjenjuje kod.
Vaš projekat će se stalno sinhronizovati sa spremištem i označavati datoteke koje su promenjene ili nove (što se razlikuje od verzije u spremištu). Da biste ažurirali, morate pozvati kontekstni meni, a na kartici "Upravljanje verzijama" bit će velika lista onoga što možete učiniti s projektom. Ažuriranje je ažuriranje vaših fajlova; "Commit" - stavite kod koji ste napisali ili promijenili u spremište; "Odbaci" - povratak na verziju u spremištu, i "Uporedi" - prikaz promjena u redovima koji se razlikuju od izbrisanih. Ovo je metoda razmjene komandi koda, koja se uvijek koristi i na nju se morate naviknuti.

Već ste preuzeli NetBeans, poigrali se sa SVN-om - sada pređimo na posao. Kreirajte projekat. Kliknite na "Kreiraj projekat", tamo birate Maven-> Web aplikacija. Nazovite to kako želite, sve je vaša mašta. Dakle, imamo web aplikaciju, montaža našeg projekta ide maven, imamo cilj i sada je vrijeme da razmislimo kako ga implementirati. Odnosno, vi, kao programer, morate razmišljati o tome kako će vaša aplikacija izgledati, koja arhitektura, stablo paketa i tako dalje. Ukupan broj linija koda ovdje je oko 4000 i bolje je unaprijed se pobrinuti za lijepu arhitekturu, inače jednostavno nećete razumjeti šta radi gdje i kako, kojim čudom, na primjer, prikazujete posljednju kupljenu stavku , uzimajući u obzir ukupan iznos kupovine. A ako se od vas tada zatraži da nešto dovršite ili dodate, shvatit ćete da je lakše sve napisati ispočetka.

I naravno, moramo smisliti naš plan akcije.

Dakle: Akcioni plan
1) opisujemo entitet (entitete) - entitete. To je POJO - klasa povezana s bazom podataka putem napomene (@Entity) ili putem XML-a. Koristićemo JPA, tako da treba da uvezemo javax.persistence * Zašto ne Hibernate Persistence API, jer ako ga koristimo i onda želimo da promenimo ORM biblioteku, onda će naše klase morati da se prepisuju, a JPA je standard od ned. Što se tiče toga šta je JPA - pa, za vas, mogu to reći ovako svojim riječima: to je biblioteka koja pruža API za rad sa * dugovječnim * objektima, odnosno omogućava nam da na jednostavan način sačuvamo naše objekata u bazi podataka. Mogu dati savjet: kreirajte za ovo poseban paket nazovite ga entitetom ili domenom - kako god želite, glavna stvar je da vam bude jasno. Na kraju bi moglo izgledati ovako: edu.shop.model.domain.Customer.java edu.shop.model.domain.Notebook.java.
Detaljnije ću opisati direktno prilikom razmatranja ove stavke. Sada je zadatak smisliti plan akcije.

2) Kreirajte HibernateUtil (općenito, sufiks ili prefiks Util implicira da je kod u ovoj klasi univerzalan i da ga koriste mnoge klase).
Dakle, u HibernateUtil smo domaćini SessionFactory. On je težak. Ovaj kod bi, u teoriji, trebao biti nezavisan od cijele aplikacije, 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 registrujemo 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) Pisanje DAO.
Šta da napišem u njemu? Pišemo šta želimo da dobijemo iz baze, ali ne treba da razmišljamo kako su ti podaci dobijeni, važan je rezultat. Na primjer, definiramo ProductDAO sučelje i upisujemo metode u njega
Lista > getAllProducts (); onda pišemo njegovu implementaciju ProductDAOImpl.

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

* ovdje poziv na metodu * .getAllProducts (); - i vidite da kompajler ne psuje, a ja možda još nemam vremena da napišem implementaciju ovog interfejsa. I kakav je rezultat? Sve je sastavljeno za vas, ali nema ni koda koji radi. Ovdje ćemo koristiti Enums i Factory obrazac, i još neke, ali sve u svoje vrijeme. Upravo u DAO-u morate obratiti posebnu pažnju na rukovanje izuzecima, barem da biste generirali stranice s greškama. Tako da brzo pronađete dio pokvarenog koda. U suprotnom ćete jednostavno biti mučeni otklanjanjem grešaka.

3) Ovdje počinje naš rad sa Spring MVC-om. Ovo je duga priča i tome će biti posvećen poseban članak. Odmah ću vam reći - ovo je najteža stvar u ovoj aplikaciji. Ali pokazaću vam jednostavniju opciju, kako da prikažete sve, ne mareći baš za MVC obrazac.
Dotaknimo se upotrebe skriptleta.

4) Ovdje ćemo imati pomoćne klase koje dodaju sve vrste dobrota našem projektu: izračunavanje ukupnog iznosa kupovina; posljednji kupljeni predmet; pomoćne varijable koje će nam biti korisne za rad metode, koja će, na primjer, prikazati stvari iz baze podataka za nas ne više od 5000 UAH, ili ne manje od 500; zaključak svih laptopa marke Asus. Ova stavka je usko povezana sa prethodnom.

Hajde da se zadržimo na ovome za sada. O ostalim ćemo se pozabaviti malo kasnije. Dakle, imamo isplanirani plan, hajde da ga realizujemo.

Entitet

Kreirali smo naš projekat i kreirali naš entitetski paket. Neka to bude edu.shop.entity. Tamo kreiramo klase poput ove:

Bilješka. Korpa u kojoj će se nalaziti naša kupljena roba će biti kao tabela u bazi, to sam uradio jer ću na njoj pokazati neke osnove rada sa bazom podataka. Za pravi slučaj, bilo bi svrsishodnije koristiti zbirke za skladištenje naše robe.

1) Proizvod
2) Notebook
3) Kamera
4) Knjiga
5) Kabl
6) Kupac
7) Kolica

Hajde da razgovaramo malo o tome šta je klasa entiteta.
Entitet - POJO-klasa povezana sa bazom podataka pomoću napomene (@Entity) ili putem XML-a. Ova klasa ima sljedeće zahtjeve:

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

U ovom slučaju, entitet može:

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

Koristit ćemo napomene. I tu odmah imamo priliku da opišemo na dva načina. Bilješke ćemo pisati direktno iznad polja ili iznad gettera. Reći ću jedno: ispravno je pisati preko gettera, ali razlog ćete pitati u Guglu. Ne mogu u potpunosti opisati sve teme ovdje.

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

Uvoz java.io.Serializable; import javax.persistence.*; import javax.validation.constraints.Size; / ** * * @author Mikhail Shumenko * / @Entity // Ovom napomenom ukazujemo da je ova klasa entitet. @Table (name = "CART") // Ovom napomenom ukazujemo da je tabela pod nazivom CART odgovorna za ovaj entitet u bazi podataka // Želim napomenuti da registar nije važan, ova napomena se može izostaviti, tada hibernacija će kreirati bazu podataka za nas sa / / sa istim imenom kao klasa javna klasa CartEntity implementira Serializable (// Ovdje pišemo napomene preko polja. Ispravno pisati preko gettera // Opisati Id tabele @Id / / Označava da je ovo polje klase odgovorno za kolonu u tablici pod nazivom Id // Ako ga ne navedemo, hibernacija će kreirati kolonu s imenom kao što je polje @Column (name = "ID") // Vi mogu puno napisati ovdje)) Zašto sam ovako napisao ovdje? Općenito, možete napisati AUTO umjesto TABLE u //@GeneratedValue(strategy=GenerationType), a zatim // pri prvom učitavanju tablice, Id će se automatski generirati od 1 do svoje maksimalne vrijednosti. // Ako imate 20 stavki u tabeli, onda će ona generirati od 1 do 20. // Ali s naknadnim dodacima, id dodane stavke će biti otprilike ovako - 345768. // Sve sam napisao tako da moj zadnji id se pohranjuje u tablicu i potom se generira na odgovarajući način na sljedećim dodacima. // Postoji i SEQUENCE, ali nije podržan u Derbyju i mi ćemo raditi s njim. // Generalno, ovo su nijanse. Možete ih 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.persistence.*; / ** * * @author miha * / @Entity // Vidite, nisam naveo napomenu @Table // Hibernacija će razumjeti sve umjesto mene. javna klasa Product implementira Serializable (privatni integer id; privatni String nameProduct; privatni cijeli broj dostupanProduct; @Id @GeneratedValue (strategy = GenerationType.AUTO) // Opisao sam Id iznad getter-a, što znači da će rad s ostalim poljima ići kroz getters.public Integer getId () (povratni id;) public void setId (Integer id) (this.id = id;) public String getNameProduct () (povratni nazivProduct;) public void setNameProduct (String nameProduct) (this.nameProduct = nameProduct;) public Integer getAvailableProduct () (vrati availableProduct;) public void setAvailableProduct (Integer availableProduct) (this.availableProduct = availableProduct;))

Dakle, imate dva primjera klasa entiteta. Izgradite ostatak koristeći ove primjere. Polja kao što su: model, godina izdanja, naziv, cijena - sve je na vašoj mašti. Obavezno uključite polje Dostupno (u prijevodu, dostupnost). Kasnije će vam biti od koristi. Možete ga učiniti logičkim i dodati kolonu pod nazivom količina. Sve ovo će nam biti od koristi.

Sada dajmo primjer našeg HibernateUtil-a

/ * * Za promjenu ovog predloška odaberite Alati | Predlošci * i otvorite šablon 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 sa pogodnom metodom za dobivanje Session Factory * objekta. * * @author Mikhail Shumenko * / javna klasa HibernateUtil (// Kreirajte naš SessionFactory.private static final SessionFactory sessionFactory; static (pokušajte (// Kreirajte novu instancu AnnotationConfiguration AnnotationConfiguration ac = new AnnotationConfiguration (); // Ovo nam je potrebno kako bi na tako da dodamo sve naše klase entiteta. // svaki vaš entitet mora biti registriran ovdje, ako ga ne napišete, neće raditi.ac.addAnnotatedClass (ProductEntity.class) .addAnnotatedClass (BookEntity.class ) .addAnnotatedClass (CableEntity.class) .addAnnotatedClass (CameraEntity.class) .addAnnotatedClass (CameraEntity.class) .class) .addAnnotatedClass (NotebookEntity.class.AddAnnotatedClass (NotebookEntity.class.AddAnnotatedClass). zapravo smo kreirali našu Session Factory. // Potrebna je jer sa bazom podataka radimo kroz sesije / / Detalji će doći malo kasnije, dok vi znate kako se to radi i kako se radi s njom.sessionFactory = ac.configure () BuildSessionFactory ();) catch (Throwable ex) (// Zabilježite izuzetak. System.err. println ("Kreiranje početne SessionFactory nije uspjelo." + ex); izbaci novi ExceptionInInitializerError (ex); )) javni statički SessionFactory getSessionFactory () (vrati sessionFactory;))

DAO

Pređimo na sljedeći dio. Šta je DAO? Ovo je obrazac dizajna.

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

Za sada ćemo napisati DAO za naše proizvode.
Dakle, razmislimo šta nam je zaista potrebno. Tabela proizvoda će imati 4 polja Id, imeProizvod, dostupno + iznos + actionForServlet. Trebat će nam za kreiranje kategorija na našoj web stranici. Ne opterećujemo se još zadnjim poljem. Jedino što nam treba je da dobijemo listu proizvoda.

Pisanje interfejsa
javni interfejs ProductDAO (ProductDAO INSTANCE_PRODUCT = novi ProductDAOImpl (); Lista GetProducts (); // i način na koji ćemo raditi)

Implementacija našeg interfejsa. Pogledajte kod za objašnjenja.
/ * * Za promjenu ovog predloška odaberite Alati | Predlošci * i otvorite šablon u uređivaču. * / paket edu.shop.model.dao; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; / ** * * @autor Mikhail Shumenko * / javna klasa ProductDAOImpl implementira ProductDAO (@Override public List GetProducts () (Lista Rezultat = null; // Kreirajte sesiju, potrebna je za korištenje transakcija // Grubo rečeno, transakcija je poput točke oporavka, ako ne prođe do kraja, onda se sve promjene poništavaju. Sesija sesije = HibernateUtil.getSessionFactory (). OpenSession (); try (session.beginTransaction (). begin (); // Kriterijumi se koriste za zahtjev za dobivanje podataka iz baze podataka // Ova formulacija, mislim, za sada vam je dovoljna // Kao parametar prosljeđujemo entitet klasu koju koristimo.Ako su podaci primljeni iz tabele Cart, onda bi bio potreban // biti potreban Cart.class Criteria kriterij = session.createCriteria (Product.class); rezultat = (Lista ) kriterij.list (); session.getTransaction (). urezivanje) catch (Izuzetak e) (// Obavezno napišite rukovanje izuzetkom. Ali ostavljam vama da radite na svom.e.printStackTrace ();) konačno (if (session!) = null) session.close ( );) vrati rezultat; ))

Dakle, sada imamo mogućnost da dobijemo podatke iz baze podataka. Možete koristiti skriptlete da kreirate jednostavnu petlju za svaki i izbacite svoje proizvode na vašu index.jsp stranicu.

Kategorije

// INSTANCE_PRODUCT šta je to? // Takva varijabla je opisana u ProductDAO, ona je odgovorna za kreiranje ProductDAOImpl // Pa, kod nas će sve biti drugačije, ne morate je previše pamtiti. // ProductDAO INSTANCE_PRODUCT = novi 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 činiti. Ovo krši naše MVC obrazac... Objasniću kako to da uradim kako treba u sledećoj lekciji, ako me pozovu. U drugom tutorijalu ćemo se pozabaviti Springom, u trećem ćemo se dotaknuti fabričkog uzorka i zaroniti dublje u hibernaciju. Za one koji su posebno nestrpljivi pokazat ću vam kako da izbrišete iz baze, snimite u bazu i potpuno izbrišete sve iz baze. Pa, kako to učiniti da sve bude u interakciji s našom aplikacijom u cjelini i ostaviti detaljno razmatranje za kasnije.

Sačuvaj u DB

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

Ukloni 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.

public void deleteAllItemToCart (Lista idAllItemsInCart) (Sesija sesije = HibernateUtil.getSessionFactory (). openSession (); pokušaj (session.beginTransaction (). begin (); for (Cjelobrojni id: idAllItemsInCart) (CartEntity itemDelete = (CartEntity) (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 konfiguracijski fajl hibernacije. Kreirajte bazu podataka prodavnica u Derbyju. Korisničko ime i lozinka su root i pass. Ako ne uspije - nemojte se obeshrabriti - posvetit ću više vremena ovome.

org.hibernate.dialect.DerbyDialect org.apache.derby.jdbc.ClientDriver jdbc: derbi: // localhost: 1527 / shop root pass UTF-8 ažurirati

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

05.13.05 14.8K

Uvod

Java Server Pages (JSP) tehnologija je dio objedinjene tehnologije za izgradnju J2EE poslovnih aplikacija. JSP je alternativna tehnika za razvoj aplikacija koje dinamički generiraju odgovore na specifične zahtjeve klijenata. Pre nego što se koristi JSP dokument, posebna procedura ga konvertuje u odgovarajući servlet. Zauzvrat, servlet se obično upisuje Java jezik i implementira određeni interfejs. Nadalje, servlet također nije samostalna aplikacija i funkcionira samo kada je smješten u odgovarajući web kontejner. Web kontejner pruža razmjenu podataka između servleta i klijenata, brine o funkcijama kao što su kreiranje softverskog okruženja za funkcionalni servlet, identifikacija i autorizacija klijenata, organiziranje sesije za svakog od njih.

Na trenutno JSP stranica se prevodi u servlet, čiji je programski kod napisan u jeziku Java. Međutim, autori specifikacije Java Server Pages ostavljaju moguću implementaciju JSP-a u drugim programskim jezicima.

Odnos između servleta u poslovnoj aplikaciji i URL-ova na serveru je specificiran u deskriptoru implementacije. Tehnologija implementacije servleta razmatra se u posebnom članku. Za sada je važno napomenuti da kod koji se koristi za pisanje servleta nije uvijek zgodan za dinamičko generiranje tekstualnih dokumenata kao odgovor na zahtjev klijenta. Na primjer, isječak servleta koji generiše dinamiku HTML stranice može izgledati ovako:

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

Kao što vidite, svaki HTML string dokument u servletu odgovara određenom dijelu programskog koda, što ne doprinosi lakoći razvoja i održavanja poslovnih aplikacija.

Pogodnije je odvojiti dinamičke i statičke dijelove generirane web stranice. Nastavit ćete koristiti Javu ili neki drugi programski jezik za kreiranje dinamičkog dijela. Ima smisla dizajnirati statički dio kao tekstualni dokument - Java Server Page (JSP stranica), dizajniran u skladu sa HTML zahtjevi, XML ili neki drugi standard za označavanje. U stvari, JSP stranica se može smatrati šablonom ili prototipom dinamičke stranice, koja ostaje da se dopuni dinamičkim elementima. Za opis dinamičke komponente, JSP tehnologija pruža dva glavna mehanizma: JavaBeans i biblioteke dodatnih oznaka. Kao rezultat toga, JSP tehnologija pretpostavlja paralelni rad dva različita stručnjaka na aplikaciji: programera i osobe odgovorne za izgled dokumenata (web mastera), koji su odgovorni za razvoj dinamičkih i statičkih dijelova dokumenata. generisan kao odgovor na zahtjeve kupaca.

Kao što je spomenuto, prije nego što možete koristiti JSP stranicu, morate je transformirati u odgovarajući servlet. Ova transformacija se može izvesti ili kada se JSP stranica postavi na server, ili kada klijent prvi put pristupi stranici. Budući da je postupak konverzije prilično naporan i dugotrajan, obično se izvodi samo jednom. Međutim, server će automatski preusmjeriti naknadne pozive sa klijenta na JSP stranicu na servlet koji je primljen kao rezultat njegove transformacije.

Servlet dobijen nakon transformacije JSP-a stranice radi unutar standardnog kontejnera servleta i koristi visoko regulirano sučelje. Stoga ova tehnologija ne ovisi ni o kakvim karakteristikama određene hardverske platforme. S druge strane, budući da se JSP tehnologije mogu izgraditi na bazi jezika koji interpretira Java, to daje garanciju prenosivosti aplikacija izgrađenih na JSP tehnologiji na bilo koju platformu na koju možete instalirati virtuelna Java auto.

JSP stranica

Obično se u njoj pohranjuje JSP stranica poseban fajl sa ekstenzijom .jsp. Većina JSP sadržaja stranice je servlet mapiran u skup naredbi out.println (). Primer 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 sa tri tipa specijalni elementi: 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 obezbjeđuju programeri poslovne aplikacije, prevodi u odgovarajući servlet, ima smisla obezbijediti 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 brojna svojstva JSP stranice. Sintaksa direktive:

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

Hajde da opišemo neke od njih zanimljivi parametri ove direktive:

  • import - Kao što je već pomenuto, JSP stranica mora biti konvertovana u programski kod - klasu koja odgovara servletu pre upotrebe. Zauzvrat, klasa servleta se može odnositi na druge klase iz standarda Java biblioteke ili klase iz drugih paketa. Standardno, klasa servleta dobijena nakon što je JSP stranica prevedena može biti povezana s paketima java.lang, java.servlet, java.servlet.jsp i java.servlet.http. Ako klasa servleta treba da komunicira s drugim paketima, na primjer, sa xbcat.util kao u gornjem primjeru JSP stranice, potonji treba dopuniti direktivom stranice koja ima atribut import s imenom odgovarajućeg paketa.
  • sesija - Ako se HTTP protokol koristi za komunikaciju sa klijentom, za svaku sesiju se podrazumevano kreira objekat sesije, koji omogućava skladištenje informacija o ovom klijentu u intervalu između njegovih poziva serveru. S druge strane, ako je atribut sesije specificiran sa vrijednošću false, to vam omogućava da odbijete kreiranje objekta sesije i koristite oslobođene serverske resurse za druge zadatke.
  • bafer - Sadržaj stranice kreirane kao odgovor na zahtjev klijenta servlet prosljeđuje u izlazni tok, odakle ga zatim web kontejner prosljeđuje direktno klijentu. Kako bi se dobio optimalniji način prijenosa, ovaj tok ima način rada međuspremnika. Zadana veličina bafera je 8 kilobajta. Parametar bafera direktive stranice omogućava vam ili da postavite drugu veličinu bafera ili da potpuno napustite način rada bafera prosljeđivanjem vrijednosti "none" atributu.
  • isThreadSafe - Prema specifikaciji servleta, zadani web kontejner dozvoljava istoj instanci servleta da paralelno obrađuje zahtjeve od više klijenata. U ovom slučaju, posebna nit se dodjeljuje svakom od zahtjeva. Međutim, u nekim slučajevima može biti korisno onemogućiti paralelnu obradu upita. (Odgovarajući kontroler u web kontejneru stavlja u red dolazne zahtjeve i prosljeđuje ih servletu na obradu striktno jedan po jedan.) Da biste to učinili, dovoljno je koristiti isThreadSafe atribut, sa vrijednošću false.
  • pageEncoding - Dozvoljava programeru aplikacije da proglasi kodiranje koje će se koristiti u dokumentu koji se prosljeđuje klijentu. Podrazumevano se smatra da je stranica u ISO-8859-1 kodiranju.
  • contentType - Kao odgovor na zahtjev klijenta, zadana JSP stranica generiše dokument HTML tip... U isto vrijeme, polje primjene tehnologije Java Server Pages je mnogo šire, jer vam omogućava generiranje bilo koje druge vrste tekstualnih dokumenata: XML, WML, VRML, itd. MIME tip generiranog dokumenta deklariran je atributom contentType. Kao što smo već shvatili, ovaj atribut je po defaultu postavljen na "test / html". Zajedno sa tipom dokumenta, JSP specifikacija dozvoljava da se kodiranje generiranog dokumenta specificira u istom atributu.

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

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

gdje je uri apsolutni ili relativni URI koji jedinstveno identifikuje rukohvat za biblioteku oznaka povezanu sa navedenim prefiksom. Navedeni prefiks se koristi za identifikaciju odgovarajućih prilagođenih oznaka.

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

Kasnije ćemo pogledati proceduru za kreiranje prilagođenih oznaka.

Uključi direktivu. Koristi se za stavljanje tekstova i programskog koda iz drugih izvora na JSP stranicu. Zamjena se izvodi kada se JSP stranica prevede u odgovarajući servlet. Primjer korištenja direktive:

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

Imajte na umu da se zamjena materijala iz vanjskog izvora također može izvršiti pomoću posebne oznake , o čemu ćemo kasnije razgovarati. Razlika između ove oznake i opisane direktive je u tome što se zamjena vrši direktno u procesu obrade klijentskog zahtjeva, pa se stoga može vezati za parametre zahtjeva.

Fragment programskog koda na JSP stranici (skripta)

Skripta, kao i drugi elementi, dodaje dinamičku komponentu konačnom dokumentu. Međutim, za razliku od njih, skripta je programski kod smješten direktno u JSP tekst stranice. Skripta može da izvodi proračune ili manipuliše objektima, što vam omogućava da vizuelno povežete karakteristike generisane stranice sa parametrima zahteva klijenta i poslovnim pravilima aplikacije. Elementi skripte su tri tipa: deklaracije, skriptleti i izrazi.

Deklaracije

Nakon što se JSP stranice konvertuje u servlet, većina njenog sadržaja odlazi u metodu _jspService (), koja se poziva kad god treba obraditi narudžbu kupca. Deklaracija JSP stranice najčešće se koristi za deklaraciju 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 klijenata. U stvari, skriptlet je dio programskog koda iz budućeg servleta, koji će vremenom biti smješten u metodu _jspService (). Kao dio servleta, skriptlet dobija pristup objektu odgovora i, shodno 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 logike 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, uporedite 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 prenosi klijentu sadrži rezultate proračuna ili poziva na određene metode i atribute određenih klasa. Bilo koji od ovih dinamičkih elemenata može se pretvoriti u string i predstaviti na JSP stranici pozivanjem out.println u odgovarajućoj skripti:

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

Drugi red u datom primjeru je pogodniji i jasniji za predstavljanje u višestrukom obliku, koristeći sintaksu izraza<%= … %> :

<%= user.getFaxNumber() %>

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

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

JSP stranice i objekti

U toku obrade zahtjeva, JSP stranica može pristupiti objektima koji se nalaze na serveru, kreirati ih i modificirati. 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 vijek trajanja definiran kao stranica, dostupan je samo unutar JSP stranice na kojoj je kreiran. Sve reference na ovaj objekt moraju biti puštene odmah nakon što je klijentov zahtjev obrađen.
  • zahtjev - Objekt čiji je vijek trajanja naveden kao zahtjev i dostupan je svim stranicama povezanim s obradom ovog zahtjeva. Konkretno, ako se obrada preusmjeri na novu JSP stranicu, ovaj objekat biće dostupan i na staroj i na novoj stranici. Kao iu prethodnom slučaju, reference na objekt moraju biti puštene nakon što je zahtjev obrađen.
  • sesija - Objekt s opsegom sesije dostupan je svim stranicama koje rukuju zahtjevima povezanim s određenom sesijom (sesijom sa određenim klijentom). Reference na objekte povezane sa sesijom se postavljaju u objekt sesije. Na kraju sesije, linkovi moraju biti pušteni.
  • primjena - Najopštiji opseg. Objekti obuhvaćeni aplikacijom nisu vezani ni za jedan odvojena stranica ili sesije i dostupni su sa svih JSP stranica ove aplikacije.

JSP stranica uvijek ima pristup određenom skupu objekata, kreirao web zadani kontejner:

  • 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 postaviti odgovor na zahtjev korisnika. Odnosi se na klasu javax.servlet.ServletResponse ili drugu klasu koja nasljeđuje od nje. Na primjer, za HTTP protokol, ovo bi bio objekt klase javax.servlet.http.HttpServletResponse. Opseg objekta je zahtjev.
  • pageContext - Objekt koji definira JSP kontekst stranice. Opseg objekta - stranica
  • sesija - Objekt kreiran od strane kontejnera za identifikaciju klijenta, kao i za pohranjivanje ličnih objekata. Kreiran od strane kontejnera 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 aplikacija.
  • out - Objekt koji sadrži izlazni tok servleta. Informacije poslane u ovaj stream bit će poslane klijentu. Objekt je instanca klase javax.servlet.jsp.JspWriter. Na primjer, većina statičkog predloška na JSP stranici bi idealno trebala biti napisana u obliku odgovarajućeg skupa out.println () komandi. Opseg objekta je stranica.
  • config - Objekt povezan sa konfiguracijom servleta. Instanca klase javax.servlet.ServletConfig. Za JSP stranicu, opseg konfiguracijskog objekta je stranica.
  • stranica - Objekt povezan s prikazivanjem ove stranice. Opseg - str

Akcioni elementi

Bez obzira na vrstu dokumenta generiranog kao odgovor na zahtjev korisnika, općenito JSP stranica sadrži tekst i oznake. Očigledno, potonji odgovaraju vrsti generiranog dokumenta: HTML, XML, itd. 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 da se skup standardnih oznaka za označavanje dopuni posebnim tagovima - elementima akcije, iza kojih programer poslovne aplikacije može sakriti dio programskog koda koji se odnosi na aplikaciju, ili neka dodatna uputstva.

Imajte na umu da su sa stanovišta stručnjaka za raspored, elementi akcije iste oznake kao i svi ostali, pa su stoga dopušteni. dijeljenje sa ostalim elementima:

Pogledajmo neke od ovih elemenata.

Standardni akcioni elementi

Standardni elementi akcije izgledaju kao obične oznake, čije ime počinje kombinacijom znakova jsp:, na primjer ... U XML terminologiji, to znači da standardni akcioni elementi u JSP tehnologiji pripadaju jsp imenskom prostoru.

jsp: useBean

Element jsp: useBean vam omogućava da koristite objekte na JSP stranici koji odgovaraju JavaBean-ovima. Element sadrži parametar koji povezuje jedinstveni identifikator s komponentom. Potonji će se tada koristiti kada se upućuje na ovaj objekt:

Ovaj primjer kreira objekt klase com.myco. Ubuduće, za pozivanje na njega, dovoljno je koristiti identifikator "kupac". Na primjer:

<%= customer.getName() %>

Prema zadanim postavkama, objekti pridruženi JavaBean-u su po defaultu ograničeni na stranicu. Programer JSP stranice može specificirati više dugo vrijeme postojanje JavaBean-a korištenjem elementa opsega pri pisanju jsp: useBean elementa. Moguće vrijednosti za ovaj atribut - stranica, zahtjev, sesija i aplikacija - raspravljali smo ranije kada smo govorili o opsegu objekata povezanih sa JSP stranicom.

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

Unutrašnje komponente JavaBeans-a će biti razmatrane u posebnom č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 pristup njegovim atributima objedinjen 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 string ako je potrebno i stavlja ga u tok podataka koji se prosljeđuje klijentu. Na primjer, prema sljedećem unosu

generirani dokument se popunjava vrijednošću svojstva name iz instance Bean-a sa identifikatorom korisnika.

Element jsp: setProperty, za razliku od prethodnog, ne preuzima, već postavlja novu vrijednost za atribut. Na primjer:

Osim eksplicitnog postavljanja novih vrijednosti, element jsp: setProperty vam omogućava da postavite atribut objekta s vrijednošću koja se preuzima iz zahtjeva klijenta. Na primjer:

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

Konačno, kada se imena polja u zahtjevu klijenta podudaraju s imenima atributa Bean-a, postoji još jedna opcija gdje se sve vrijednosti migriraju odjednom. Na primjer:

jsp: uključiti

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

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

Primjer korištenja elementa jsp: include:

jsp: naprijed

Ovaj element vam omogućava da preusmjerite daljnju generaciju dinamičke stranice na drugu JSP stranicu, servlet ili koristite pripremljeni tekst za završetak. Na primjer:

U narednom, više složen primjer dinamička stranica završava sadržajem tekstualni fajlčije je ime preuzeto iz varijable someValue:

U zaključku, treba napomenuti da postoje dvije glavne sheme za obradu zahtjeva klijenata:

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

U drugom slučaju obrada se odvija u dvije faze. Prvo, kontrola se prosljeđuje servletu ili JPS stranici koja zapravo obrađuje zahtjev. Na primjer, podaci se preuzimaju 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 za naknadni prijenos klijentu. Međutim, ne mora postojati nikakav odnos između obrade zahtjeva i generiranja nove stranice. Na primjer, to može biti samo povratak korisnika početna stranica po završetku bilo koje procedure.

Dodatni setovi oznaka

Uvod

Protokoli za tekstualno označavanje kao što je HTML imaju visoko regulisan skup oznaka. Istovremeno, tokom izrade dokumenata često se javlja potreba za korištenjem dodatnih, posebnih oznaka, koje, iako nisu deklarirane u odgovarajućim specifikacijama, u većoj mjeri odgovaraju predmetnoj oblasti poslovanja. aplikacija. S jedne strane, takve dodatne ili prilagođene oznake mogu se posmatrati kao neka vrsta makroa koji će biti zamijenjeni ekvivalentnom kombinacijom standardnih oznaka prije nego što se dokument pošalje klijentu. Alternativno, određeni dio koda može biti iza prilagođene oznake. Na primjer, prilično uobičajena pojedinačna oznaka može biti brojač pogodaka ili meni čiji sadržaj ovisi o ulozi koju određeni kupac igra u poslovnom procesu.

Izrada prilagođenih oznaka uključuje pisanje specifičnog programskog koda. JSP tehnologija omogućava stavljanje ovog koda u poseban programski modul - biblioteku prilagođenih oznaka. Razvoj takvih biblioteka može se povjeriti kompanijama. JSP stranica je povezana sa određenom bibliotekom prilagođenih oznaka koristeći prethodno opisanu taglib direktivu. Navedena direktiva povezuje deskriptor odgovarajuće biblioteke sa određenim prefiksom, koji, zauzvrat, identifikuje sve prilagođene oznake iz ove biblioteke u telu JSP stranice. Dakle, direktiva

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

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

Svi kupci

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

1.0 1.2 dscat pageheader ru.view.tag.PageHeader

Kreiranje 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 da prikaže 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 poslovne aplikacije i dopuniti je metodama koje odgovaraju interfejsu oznake. Ako ne morate koristiti vanjske objekte, tada se TagSupport može koristiti kao osnovna klasa. Ove i druge standardne klase i interfejsi 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 izuzetak (pageContext.getOut (). print (" © Copyright 2001"); vrati SKIP_BODY;) public int doEndTag () (vrati EVAL_PAGE;))

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

Pored činjenice da metoda doStartTag () može obaviti bilo koju vrstu obrade zahtjeva, važna je vrijednost koju vraća. Ako je SKIP_BODY, tada će informacije zatvorene između odgovarajućih oznaka otvaranja i zatvaranja biti zanemarene, a JSP obrada stranice će odmah skočiti na završnu oznaku. Da bi sadržaj prilagođene oznake i dalje bio obrađen, medot mora vratiti EVAL_BODY_INCLUDE. Slično, ako metoda doEndTag () vrati SKIP_PAGE, tada će ostatak JSP stranice nakon završne oznake biti zanemaren. Da bi se to spriječilo, metoda mora vratiti EVAL_PAGE.

U nekim slučajevima potrebno je prikazati sadržaj prilagođene oznake ne 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 ponovo prikazali sadržaj prilagođene oznake još jednom, 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 BodyTag interfejs ili naslijediti klasu BodyTagSupport. U oba slučaja, klasa može implementirati metode doInitBody i doAfterBody.

Metoda doInitBody se poziva odmah nakon što se identifikuje sadržaj oznake, ali prije nego što se obradi. Obično se ova metoda koristi kada trebate inicijalizirati klasu na osnovu sadržaja prilagođene oznake.

Metoda doAfterBody se poziva nakon što se obradi sadržaj prilagođene oznake. Kao iu prethodnom odeljku, metoda doAfterBody može naznačiti da li treba ponovo preći preko sadržaja oznake. Ako je potrebno, metoda treba vratiti EVAL_BODY_BUFFERED. U suprotnom, trebalo bi vratiti SKIP_BODY.

Uz prethodna dva, JSP tehnologija predviđa poziv metode release kako bi se omogućila klasa koja podržava prilagođenu oznaku da oslobodi resurse koji su joj dodijeljeni, kao i da izvrši druge neophodne radnje da se vrati u prvobitno stanje.

Tehnologija pruža dvije metode direktno za pristup sadržaju prilagođene oznake: 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 redoslijed kojim se obrađuje zahtjev klijenta. Za svaki od ovih atributa u klasi koja implementira prilagođenu oznaku, mora se navesti odgovarajući atribut, kao i dva get method i set. Na primjer, ako prilagođena oznaka izgleda tako

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

od

Dobro loše

Top srodni članci