Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Windows Phone
  • Përshkrimi Jsp i asaj për të cilën përdoret. Si mund të parandaloni hyrjen e drejtpërdrejtë në faqen JSP nga shfletuesi? Komentet dhe simbolet e citimit

Përshkrimi Jsp i asaj për të cilën përdoret. Si mund të parandaloni hyrjen e drejtpërdrejtë në faqen JSP nga shfletuesi? Komentet dhe simbolet e citimit

Teknologjia Java Server Pages (tm) (JSP) u mundëson zhvilluesve dhe projektuesve të aplikacioneve në ueb të zhvillojnë shpejt dhe të mirëmbajnë me lehtësi faqe dinamike të internetit. Por përshkrimi i pothuajse çdo teknologjie të këtij qëllimi (ASP, PHP, Net.Data) shoqërohet me fjalë të tilla - shpejt dhe lehtë ...

Pavarësisht ngjashmërisë së jashtme, JSP-të dallohen nga disa pika që e bëjnë këtë teknologji diçka më shumë sesa thjesht një mjet tjetër për krijimin e përmbajtjes së krijuar në mënyrë dinamike për faqet e internetit.

Së pari, një listë e thjeshtë:

  • transportueshmëri shumë e lartë ndër-platformë; përdorimi gjuhë universale nivel të lartë Java si skriptim;
  • JSP nuk është një mjet i pavarur për zgjidhjen e një game mjaft të ngushtë detyrash, megjithëse mjaft të fuqishme, por një tjetër në një sërë galaktike të tërë teknologjish që kombinohen nga Java;
  • një mundësi reale për të ndarë detyrat e shkrimit të logjikës së biznesit për një aplikacion në internet dhe një ndërfaqe përdoruesi, e cila ju lejon të zhvilloni dhe mirëmbani pjesë të ndryshme të projektit në mënyrë të pavarur;
Teknologjia JSP është një shtrirje e drejtpërdrejtë e një teknologjie tjetër Java - Servlets (tm) dhe është gjithashtu e lidhur ngushtë me teknologjinë Java Beans (tm) dhe përdor etiketa (tags) të ngjashme me XML dhe skriptet e shkruara në gjuhën e programimit Java për të injektuar logjikën duke krijuar përmbajtje dinamike. të një faqeje interneti, ndërsa etiketat HTML ose XML transmetohen drejtpërdrejt në anën e klientit.

Numri i etiketave është mjaft i vogël, gjë që thjeshton zhvillimin fillestar të kësaj teknologjie; megjithatë, për gjëra të thjeshta, të njëjtat Net.Data ose PHP janë gjithashtu shumë të thjeshta. Si zakonisht, merrni parasysh rastin primitiv të klasës Përshendetje Botë!
<%@ page contentType="text/html; charset=ibm866" %> <%@ page import ="java.net.*" %> <%@ page import ="java.util.Date" %> Kush jam unë? <% InetAddress localHost = InetAddress.getLocalHost(); Date localTime = new Date(); %>

Kush jam unë?

jam thirrur<%= localHost.getHostName() %> (<%= localHost.getHostAddress() %>).
Kjo faqe është ekzekutuar për herë të fundit në<%= localTime.toString() %>.

Edhe me një person jo njohuri në Java, kuptimi i kodit të mësipërm ka shumë të ngjarë të mos shkaktojë probleme. Le të ndalemi në disa pika: kodi brenda etiketave<% %>, në fakt, ekziston kodi i skriptit; çdo gjë në mes<%-- --%>-- një koment; etiketë<%= позволяет вывести значение переменной в нужном месте страницы; <%@ page %>ju lejon të importoni klasa dhe gjithashtu të personalizoni disa veçori në sjelljen e faqes.

Nëse fuqia e mjeteve të tilla konkurruese (ndoshta kjo është ende kështu ;-) si PHP dhe Net.Data është kryesisht për shkak të një grupi të madh funksionesh të paracaktuara, atëherë i gjithë konglomerati i klasave dhe teknologjive Java është prapa JSP.

Por me një shembull kaq të thjeshtë, nuk është aspak e qartë pse duhet të zgjidhni JSP dhe gjithçka që lidhet me to, kryesisht servlet dhe fasule. Sidoqoftë, le të përpiqemi të shohim disa nga aspektet e këndshme të JSP.

Menaxhimi i sesionit

Vlerat që ruhen dhe merren nga objekti i sesionit nuk mund të jenë lloje primitive të të dhënave (int, double) dhe duhet të përfaqësohen në formën e klasave të tyre analoge (Integer, Double).
Sesioni HttpSession = request.getSession (); // merrni objektin e sesionit ose krijoni një sesion.getId () // merrni numrin e ID-së së sesionit Item numër i plotë = (Numër i plotë) session.getValue ("artikull") // rifitoni sesionin e objektit me numër të plotë. putValue ("ItemValue", itemName); // ItemValue nuk duhet të jetë primitive

Menaxhimi i aplikacionit

Ndonjëherë është e nevojshme t'i sigurohet serverit disa vlera të ndryshueshme në nivelin e faqes, secili klient përdor dhe manipulon kopjet e këtyre të dhënave. JSP përdor objektin ServletContext, i cili ofron një mekanizëm të ngjashëm me sesionin (d.m.th. nuk ka lloje primitive).
getServletContext (). setAttribute ("Item", ItemValue); // për të vendosur një variabël aplikacioni Integer i = (Integer) getServletContext (). getAttribute ("ItemName"); // merrni artikullin ngjyra = blu>

Gjuhë specifike për JSP

Direktivat JSP "i thonë" serverit të bëjë diçka kur ato konvertohen nga JSP në servlet; direktivat paraprihen nga @. Disa direktiva të rëndësishme të JSP-së janë renditur më poshtë, për një njohje më të plotë, natyrisht do t'ju duhet të lexoni diçka tjetër.
përfshini - përfshini një skedar statik ose dinamik (Përfshirja nga ana e serverit) <%@ include file="hello.jsp" %> import - servleti që rezulton do të importojë paketën e dhënë<%@ import = "java.util.*" %>shtrihet - servlet do të zgjerojë (trashëgojë) klasën e specifikuar (kjo është një superklasë) <%@ extends = "java.util.Dictionary" %> implementon - servleti do të implementojë ndërfaqen <%@ implements = "java.util.Enumeration" %> content_type - Përcakton llojin e përgjigjes së gjeneruar nga servlet <%@ content_type = "text/plain" %> ose <%@ content_type = "text/html" %>

Dihet se detyrat në këtë botë komplekse nuk janë vetëm të thjeshta apo edhe shumë të thjeshta. Nëse i nënshtroheni tundimit për të bërë gjithçka duke përdorur skriptet (futja dinamike e kodit Java midis HTML statike) dhe i konsideroni klasat e jashtme si një bibliotekë të fuqishme funksionesh, është shumë e lehtë të ktheni një faqe dinamike në një përbindësh voluminoz, të vështirë për tu korrigjuar. dhe me vështirësi të mëdha me modifikime dhe zgjerime të mëtejshme.

Po, si konkurrenca, kompleksiteti mund të zbutet duke thyer një faqe komplekse në disa pjesë logjikisht të dallueshme dhe duke i bashkuar ato duke përdorur një mjet përfshirjeje.

Ka dy opsione për të përfshirë:

  • Përfshirja statike, në të njëjtën kohë, elementët JSP në skedarin e përfshirjes përpunohen, nëse ekzistojnë dhe futen në kodin Java të gjeneruar që rezulton, në fakt, një serlet:
    <%@ include file="includeheader.jsp"%>
    ose keshtu
    <%@ include file="includeheader.html"%>
    domethënë, skedari i përfshirë nuk duhet të jetë fare faqe JSP.
  • Përfshirja dinamike, ndërsa përmbajtja e skedarit të përfshirë përpunohet në mënyrë të pavarur, në fakt, kontrolli i transferohet atij në momentin e ekzekutimit:
Është interesante se përmbajtja e përfshirë në mënyrë dinamike mund të ruhet në memorie të pavarur, gjë që në disa raste jep përfitime të konsiderueshme në faqet komplekse me shumë komponentë. Por mundësia për të përfshirë është megjithatë ndoshta më primitive e mundësi të shumëanshme JSP.

Pothuajse të gjithë, duke filluar të bëjnë një aplikacion në internet, përballen me nevojën për t'i siguruar përdoruesit mjet i përshtatshëm për të futur informacion, dhe këtu, si rregull, b O Ka më shumë probleme sesa thjesht ofrimi i informacionit në formën e faqeve HTML të krijuara. Është e nevojshme të sigurohet inteligjencë e mjaftueshme e hyrjes, përveç kësaj, në rast të gabimeve të hyrjes, mos e humbni atë të futur më parë dhe transferoni ato të kërkuara informacion i pergjithshem nga faqja në faqe. Në Net.Data, për shembull, nuk kam gjetur një mënyrë për ta bërë këtë përveç përdorimit të fushave të fshehura në formularët e hyrjes, ndërkohë që ruajtja e informacionit me një jetëgjatësi "sesioni" bëhet një detyrë e vështirë; se si mund të dilni me zgjidhjen e këtij problemi në PHP, nuk e di. Sa i përket JSP / servlets - ekziston një strukturë standarde JavaBeans (në këtë kontekst, ne nuk do të ndalemi në një zhvillim kaq më të fuqishëm të këtij koncepti si EJB) - këto janë klasa të plota Java me disa rregulla shtesë programimit.

Është një mjet shumë i fuqishëm, por kërkon disa stereotipe. JavaBeans janë komponentë Java që mund të kryejnë detyra të përcaktuara mirë dhe të përfshijnë objekte të dhënash. JavaBeans ndjekin të strukturuar modeli i objektit: Bean ka një konstruktor publik që nuk ka argumente dhe vetitë e tij vendosen duke përdorur servletin e kontrollit duke përdorur introspeksionin / reflektimin.

Përfshirja e një fasule në një "faqe" JSP bëhet si kjo:

... Shtimi <%=formHandler.getErrorMsg("description")%> Pronari <%= formHandler.getOwnerName()%> | <%= formHandler.getOwnerName()%> <%=formHandler.getErrorMsg("owner")%> ===> ose ja një tjetër
une pelqej<%= Cindy.getFlavor() %>kafe. // The Coffee Bean: Kafe e klasës publike (private String m_flavor; publike Coffee () (m_flavor = "Regular";) set bosh publik Shije (shije string) (m_flavor = shije;) publike String getFlavor () (kthim m_shije;)

Disa shpjegime për këtë shtrydhje: scope = "kërkesë" do të thotë se jetëgjatësia e fasules është kërkesë, vetia = "*" do të thotë që kjo fasule pranon me ndihmën e metodave të saj të gjithë parametrat e kaluar në kërkesë për kjo faqe... Këto metoda kanë një rregull të thjeshtë emërtimi: nëse parametri i formës është emri i fundit, atëherë metoda që merr të dhënat do të ketë emrin setLastName dhe metoda që kthen të dhënat do të ketë getLastName.

Fatkeqësisht, është mjaft e vështirë për të demonstruar fuqinë e plotë të përdorimit të fasuleve aplikim i thjeshtë... Megjithatë, ky artikull nuk synon të japë gjithë thellësinë, detyra është të interesojë.

Linja e përgjithshme që mund të gjurmohet në shumë publikime të fundit është ndarja e punës së projektuesit dhe punës së programuesit, i cili siguron shkrimin e punës aktuale me bazën e të dhënave dhe logjikën e biznesit të aplikacionit në internet. Shumica e kësaj mund të bëhet në nivelin e koshit. Fatkeqësisht, mundimi i të shkruarit, sipas të paktënfaza fillestare, paketa JSP-servlets-beans duket më e madhe se ajo e Net.Data dhe PHP (megjithatë, unë jam i njohur me këtë të fundit në një nivel pak më të madh "Hello World!"). Por edhe përdorimi i koshave nuk e përjashton plotësisht nga minimumi duke përdorur Java Në faqe. Për të arritur fundin logjik dhe për t'i lënë projektuesit vetëm rregullimin e saktë të etiketave në faqe, JSP prezantoi aftësinë për të shkruar bibliotekat e personalizuara të etiketave JSP.

Përdorimi i bibliotekave të etiketave lejon, së pari, të rrisë më tej ripërdorimin e kodit, së dyti, të zvogëlojë kompleksitetin e shkrimit të një aplikacioni dhe, së treti, të ndihmojë më tej në ndarjen e punës. Fatkeqësisht, kjo e fundit në realitetin tonë nuk ka marrë ende peshën e duhur kur zgjedh një mjet zhvillimi. Si përfundim, unë do të jap një shembull të vogël të përdorimit të etiketave të personalizuara, për shembull, një pyetje në bazën e të dhënave me daljen e rezultatit në formën e një tabele mund të duket kështu:
<%@ taglib uri="xsql.tld" prefix="xsql" %> ...

diçkadiçkapërshkrim
"$1$""$2$""$3$"
por kjo nuk do të thotë se duhet të duket kështu ;-)

Në fakt, tema është shumë e gjerë për t'u trajtuar pa pika bosh në një prezantim kaq të shkurtër.

JSP (faqet e serverit Java)Është një teknologji që ju lejon të futni kodin Java si dhe EL (gjuhën e shprehjes) në përmbajtjen e faqeve statike) dhe lejon zhvilluesit e uebit të gjenerojnë dinamikisht HTML, XML dhe faqe të tjera ueb. JSP është pjese e një teknologji e unifikuar për krijimin e aplikacioneve të biznesit J2EE.

JSP - mund të funksionojë pothuajse në çdo server në internet, pasi kjo teknologji bazohet në gjuhën e programimit Java, e cila është e pavarur nga platforma. Faqet e serverit Java mbështeten Etiketat HTML, Javascript gjithashtu komplet i vet etiketa.

JSP - ju lejon të ndani pjesën dinamike të faqes nga ajo statike. Kjo teknologji parashikon futjen e kodit Java në faqe. Ne nuk do ta shqyrtojmë këtë rast përdorimi për JSP-të pasi kjo teknologji konsiderohet e vjetëruar dhe e papërsosur. Arsyeja është e thjeshtë: zhvilluesit dhe dizajnerët që dizajnojnë pamjen e një faqeje mund të mos jenë gjithmonë të njohur me Java dhe kjo mund të shkaktojë vështirësi shtesë gjatë redaktimit ose mirëmbajtjes së aplikacioneve në ueb.

Në vend të futjes së kodit Java, tani përdoret biblioteka e etiketave jstl ose Javascript për shumë të avancuara. Ne do të shqyrtojmë një shembull me etiketat jstl. Kjo është një bibliotekë shumë e dobishme që ka pothuajse të gjithë funksionalitetin që ju nevojitet për të krijuar faqe dinamike. Nëse keni nevojë për diçka specifike, gjithmonë mund të shkruani etiketën tuaj dhe të futni përmbajtjen e saj në faqe.

Ne jemi tashmë pjesërisht të njohur me JSP që nga e para. Trupi kryesor i faqes JSP është HTML, në të cilin futen etiketat me përmbajtje dinamike.

Shembull i faqes JSP

Një njohuri shumë e nevojshme që do të përdorim është direktiva JSP.

Një direktivë JSP është një mesazh që një faqe mund të dërgojë në kontejnerin e duhur, duke specifikuar veprimet. Sintaksa e direktivës:<% @ атрибут = «значение» %>

Ekzistojnë tre lloje kryesore të direktivave:

  1. faqe (mund të përdoret për të importuar klasa);
  2. përfshij (ju jep mundësinë për të futur skedarin në klasën servlet kur përktheni skedarin JSP në servlet);
  3. taglib (bën të mundur përfshirjen e një biblioteke etiketash).

Meqenëse nuk do ta fusim kodin në faqe, do të shqyrtojmë dy direktivat e fundit.

Për shembull, ne kemi faqe që do të kenë të njëjtën sipër dhe fund. Një model shumë i zakonshëm ku fundi dhe koka janë të njëjta për të gjitha faqet. Për të mos shkruar kodin e këtyre faqeve në çdo skedar JSP, mund ta vendosni kodin e tyre në skedarë të veçantë dhe më pas ta lidhni atë në vendin që na nevojitet duke përdorur përfshijnë direktiva.

Vendndodhja e skedarëve në projekt:

Në kodin e mësipërm, mund të gjurmoni përdorimin e direktivës taglib. Me ndihmën e tij, ne lidhëm bibliotekën e etiketave jstl. Duke përdorur këtë direktivë, ju mund të lidhni një bibliotekë të etiketave tuaja:<%@ taglib uri=»/WEB-INF/mylib.tld» prefix=»test» %>.

Vini re se atributi i rëndësishëm taglib është parashtesë. Ky është një atribut i kërkuar. Me parashtesë, mund të telefononi bibliotekën në kodin tuaj. Ju mund të zgjidhni çdo emër prefiksi. Nga rruga, këtu është përdorimi i etiketave jstl në praktikë:

    < c: forEach items= "$ (llogari) " var = "llogari">

    < tr align= "center" >

    < td>$ (numri i llogarisë)

    < td>$ (llogari. balanca)

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

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

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

    < a href= "? komanda = bllokimi i llogarisë dhe ID e llogarisë = $ (account.accountId)"> $ (bllok)

    < td>< a href= "? komanda = tregoni informacionin dhe llogarinë ID = $ (account.accountId)"> $ (showInfo)

Kodi i mësipërm demonstron daljen e të gjithë elementëve të listës. Se si e transferuam atë në faqe do të jetë në artikujt e ardhshëm. Sintaksa e tij është:

$ (artikull)

Ky është kodi anësor i lidhur më sipër. Siç mund ta shihni, forking përdoret këtu për të shfaqur vetëm informacionin që është në dispozicion për një lloj të caktuar përdoruesi.

Sintaksë:
a është e barabartë b

Është më mirë të merrni parasysh etiketat jstl kur shkruani projekt real, pasi nuk shoh asnjë arsye për të mësuar dhe mësuar përmendësh të gjithë sintaksën për çdo veprim. Kodi i mësipërm duhet të shërbejë vetëm si një shembull se si përdoret kjo. Ju nuk keni nevojë të mësoni përmendësh asgjë. Kur shkruani kodin, atëherë referojuni kësaj sintakse.

Nga rruga, kodi i projektit nga i cili është marrë ky kod ndodhet këtu: https://github.com/caligula95/payment-systemapp

E postova projektin në heroku: https://payment-systemapp.herokuapp.com/ - këtu përdoret një llogari falas, kështu që për kërkesën e parë duhet të prisni disa minuta që projekti të fillojë.

Servlet ju lejojnë të merrni kërkesa nga një klient, të bëni disa punë dhe të shfaqni rezultatet në ekran. Servelet funksionon mirë deri në vjen përpunimin e informacionit, d.m.th. para shfaqjes së informacionit në ekran. Ju mund të futni logjikë mjaft komplekse në servlet, të bëni thirrje në bazën e të dhënave dhe shumë, shumë më tepër që janë të nevojshme për aplikacionin. Por është shumë e papërshtatshme për të kryer daljen në ekran brenda vetë servletit. Dhe çfarë të bëni kur zhvilloni ide komplekse të projektimit dhe më pas bëni ndryshime ndërfaqja e përdoruesit? Teknologjia e projektimit Faqet e serverit Java (JSP)është një nga teknologjitë J2EE që është një zgjerim i teknologjisë servlet për ta bërë më të lehtë punën me përmbajtjen e Uebit. Faqet JSP e bëjnë të lehtë ndarjen e përmbajtjes së Uebit në pjesë statike dhe dinamike, duke lejuar ripërdorimin e komponentëve të përcaktuar më parë. Zhvilluesit e Faqeve të Serverit Java mund të përdorin komponentët JavaBeans dhe të krijojnë bibliotekat e tyre të personalizuara të etiketave që përmbledhin funksionalitetin dinamik të ndërlikuar. Specifikimi i Faqeve të Serverit Java (http://java.sun.com/products/jsp) trashëgon dhe zgjeron specifikimin e servletit (http://java.sun.com/products/servlets). Ashtu si servlet-et, komponentët JSP janë komponentë Web dhe qëndrojnë në një kontejner Ueb. Faqet JSP janë të pavarura nga zbatimi specifik i kontejnerit të Uebit, gjë që i bën ato të ripërdorshme. Përveç klasave dhe ndërfaqeve për programimin e servletit (paketat javax.servlet dhe javax.servlet / http), në paketa javax.servlet.jsp dhe javax.servlet.jsp.target përmban klasa dhe ndërfaqe që lidhen me programimin e Faqeve të Serverit Java. Përshkrimi i plotë teknologjitë Java Faqet e serverit mund të gjenden në specifikimet në (java.sun.com/products/jsp/download.htm)

Përmbledhje e teknologjisë së faqeve të serverit Java

Teknologjia Java Server Pages përmban katër komponentë kryesorë:
  1. Direktivat (direktivë) janë mesazhe për kontejnerin JSP, që ju lejojnë të përcaktoni parametrat e faqes, të lidhni burime të tjera, të përdorni bibliotekat tuaja të etiketave jo standarde.
  2. Veprimet (veprimet) përmbledh funksionalitetin në etiketat e paracaktuara që mund të futni në një faqe JSP. Veprimet shpesh kryhen bazuar në informacionin e dërguar në server si pjesë e një kërkese nga një klient specifik. Veprimet gjithashtu mund të krijojnë objekte Java për përdorim në skriptet JSP.
  3. Skriptet (skriptet) ju lejon të futni kodin Java në faqet JSP që ndërvepron me objektet e faqes kur përpunoni një kërkesë.
  4. Etiketoni bibliotekat (biblioteka e etiketave) janë pjesë e një mekanizmi të zgjerimit të etiketave që ju lejon të zhvilloni dhe përdorni etiketat tuaja.
Prania e të dhënave me një strukturë të pandryshueshme përcakton zgjedhjen e programuesit për të vendosur se cilën teknologji të përdorë: servlets ose faqet JSP. Programuesit preferojnë të përdorin faqe JSP kur pjesa më e madhe e përmbajtjes që dërgohet te klienti është të dhëna të pandryshueshme dhe vetëm një pjesë e vogël e përmbajtjes gjenerohet në mënyrë dinamike duke përdorur kodin Java. Servlet-et preferohen nëse vetëm një pjesë e vogël e përmbajtjes që i dërgohet klientit është të dhëna të pandryshueshme. Në fakt, servlet-et individuale mund të mos gjenerojnë fare përmbajtje për klientin, duke bërë një detyrë specifike në interesin më të mirë të klientit dhe më pas duke thirrur servlet të tjera ose faqe JSP për të dërguar përgjigjen. Duhet të theksohet se në shumë raste, servlets dhe faqet JSP janë të këmbyeshme. Ashtu si servletët, faqet JSP zakonisht funksionojnë në anën e një serveri në internet të quajtur një kontejner JSP. Kur një server në internet që mbështet teknologjinë JSP merr kërkesën e parë për një faqe JSP, kontejneri JSP e përkthen atë faqe JSP në një server Java që shërben kërkesën aktuale dhe çdo kërkesë të mëvonshme për atë faqe. Nëse ndodhin gabime gjatë përpilimit të një servleti të ri, këto gabime rezultojnë në gabimet në kohën e përpilimit. Kontejneri JSP në fazën e përpilimit vendos deklaratat Java që zbatojnë përgjigjen e faqes JSP në metodë _jspService. Nëse servleti përpilohet pa gabime, kontejneri JSP thërret metodën _jspService për të përpunuar kërkesën. Faqja JSP mund të përpunojë kërkesën drejtpërdrejt, ose mund të thërrasë komponentë të tjerë të aplikacionit Ueb për të ndihmuar në përpunimin e kërkesës. Çdo gabim që ndodh gjatë përpunimit shkakton Përjashtim i serverit në ueb gjatë fazës së kërkesës... Të gjitha statike Teksti HTML thirrur në dokumentacionin e JSP-së shabllon HTML(HTML shabllon) dërgohet direkt në rrjedhën e daljes. Rrjedha e daljes së faqes është e bllokuar. Buffering ofrohet nga klasa JspWriter duke zgjeruar klasën Shkrimtar... Madhësia e buferit është e kufizuar në 8 KB si parazgjedhje, por mund të ndryshohet nga atributi tampon etiketë <%@ page> ... Prania e një buferi lejon shkrimin e titujve të përgjigjes në rrjedhën e daljes së bashku me tekstin dalës. Në buffer, titujt do të vendosen përpara tekstit. Kështu, mjafton të shkruani një faqe JSP, ta ruani atë në një skedar me shtesën jsp dhe instaloni skedarin në një kontejner, ashtu si një faqe HTML, pa u shqetësuar për kompilimin. Gjatë instalimit, mund të vendosni parametrat fillestarë faqet JSP janë të njëjta me parametrat fillestarë të servletit.
1) NetBeans 7.3;
2) Maven;
3) Hibernate;
4) Pranvera MVC;
5) JSP + JSTL;
6) Njohuri rreth Servlets, Sessions, JavaBean, XML, etj.;
7) HTML + CSS (pak bukuri sipas dëshirës tuaj, por është më mirë të paguani mëngjarashët - keni mjaft probleme me anën e serverit);
8) Java SE (njohuri e koleksioneve, aftësia për të trajtuar përjashtimet ... Në përgjithësi, një grup standard);
9) Njohuri për modelet e dizajnit (DAO, Fabrika);
10) JPA;
11) SVN;
12) SQL (për shkrimin e skripteve që mbushin bazat e të dhënave tona).

Le të fillojmë me vendin ku do ta ruajmë kodin tonë dhe si ta ndajmë atë me miqtë. Unë mendoj se jo të gjithë fillestarët dinë për depot, dhe kjo pjesë është vetëm për ta.

SVN

Ekziston një gjë e tillë si një depo - server në distancë ruajtjen e kodit.
Nëse ju jepet një detyrë testimi dhe e dërgoni atë në një arkiv, atëherë me shumë mundësi do të dërgoheni edhe ju. Ndoshta nuk do ta bëjnë, por patjetër do të zhgënjehen nga ju.
Ka depo të ndryshme për CVS, SVN, Git. Për fillestarët, unë mendoj se SVN është optimale. Epo, gjëja kryesore për ju nuk është të dini se çfarë është, por të jeni në gjendje ta zbatoni atë. Për sa kohë që mjafton kjo, pjesa tjetër do të vijë me përvojë.

Pas gjithë kësaj, ju do të keni një lidhje me hapësirën tuaj. Për të kuptuar se çfarë është, ju duhet të merrni një nga projektet tuaja (ose të krijoni ndonjë projekt bosh në NetBeans). Klikoni mbi të me butonin e djathtë dhe do të keni akses në "Version Control" -> "Import into Subversion Repository" në meny. Pas kësaj, do të ketë një kuti dialogu me shtegun për në depo - kjo është lidhja që keni marrë në sit në skedën "Kodi i Burimit".

Më pas, fshini plotësisht projektin që keni kryer. Pastaj shkoni te dosja ku janë ruajtur projektet tuaja dhe kontrolloni që gjithçka është fshirë vërtet. Më pas ktheheni te NetBeans dhe kërkoni skedën Group në shiritin e menysë (në panelin ku File, View, Edit, Transition, Source ...) përmban Subversionin tonë. Dhe në nënmenu ka "Merr". Më tej, në kutitë e dialogut, do t'ju duhet të specifikoni një lidhje me depon (kjo është lidhja që keni marrë në sit në skedën "Kodi i Burimit".) Dhe kur ai të ofrojë të shkarkojë dosjet, atëherë do t'ju duhet për të gjetur projektin tuaj në pemën e depove dhe për ta zgjedhur atë, dhe pas përfundimit ju shkarkoni projektin tuaj. Kështu shkëmbehet kodi.
Projekti juaj do të sinkronizohet vazhdimisht me depon dhe do të shënojë skedarët që janë ndryshuar ose të rinj (që është i ndryshëm nga versioni në depo). Për të përditësuar, duhet të telefononi menunë e kontekstit dhe në skedën "Menaxhimi i versionit" do të ketë një listë të madhe të asaj që mund të bëni me projektin. Përditësimi është për të përditësuar skedarët tuaj; "Commit" - vendosni kodin që keni shkruar ose ndryshuar në depo; "Hiq" - kthehu në versionin në depo dhe "Krahaso" - shfaq ndryshimet në rreshtat që ndryshojnë nga ato të fshira. Kjo është një metodë e shkëmbimit të komandës së kodit, e cila përdoret gjithmonë dhe duhet të mësoheni me të.

Tashmë keni shkarkuar NetBeans, keni luajtur me SVN - tani le t'i drejtohemi biznesit. Krijo një projekt. Klikoni "Krijo projekt", aty zgjidhni Maven-> Web Application. Quaj si të duash, është e gjithë imagjinata juaj. Pra, ne kemi një aplikacion në internet, montimi i projektit tonë po shkon drejt, ne kemi një qëllim dhe tani është koha të mendojmë se si ta zbatojmë atë. Kjo do të thotë, ju, si zhvillues, duhet të mendoni se si do të duket aplikacioni juaj, çfarë arkitekture, pema e paketave, e kështu me radhë. Numri i përgjithshëm i rreshtave të kodit këtu është rreth 4000 dhe është më mirë të kujdeseni paraprakisht për një arkitekturë të bukur, përndryshe thjesht nuk do të kuptoni se çfarë funksionon ku dhe si, me çfarë mrekullie ju, për shembull, shfaqni artikullin e fundit të blerë. , ndërsa merrni parasysh shumën totale të blerjeve. Dhe nëse më pas ju kërkohet të plotësoni ose shtoni diçka, do të kuptoni se është më e lehtë të shkruani gjithçka nga e para.

Dhe sigurisht që ne duhet të kuptojmë planin tonë të veprimit.

Pra: Plani i Veprimit
1) ne përshkruajmë entitet (entitete) - entitete. Është një POJO - një klasë e lidhur me bazën e të dhënave nëpërmjet shënimit (@Entity) ose nëpërmjet XML. Ne do të përdorim JPA, kështu që duhet të importojmë javax.persistence * Pse të mos Hibernate Persistence API, sepse nëse e përdorim dhe më pas duam të ndryshojmë bibliotekën ORM, atëherë klasat tona do të duhet të rishkruhen dhe JPA është një standard nga Dielli. Sa i përket asaj që është JPA - mirë, për ju, mund ta them kështu me fjalët e mia: është një bibliotekë që ofron një API për të punuar me * objekte jetëgjatë *, domethënë, na lejon të ruajmë me lehtësi objektet në bazën e të dhënave. Mund të jap këshilla: krijoni për këtë paketë e veçantë emërtoni atë entitet ose domen - çfarëdo që dëshironi, gjëja kryesore është t'jua bëjë të qartë. Mund të përfundojë kështu: edu.shop.model.domain.Customer.java edu.shop.model.domain.Notebook.java.
Unë do të përshkruaj në mënyrë më të detajuar drejtpërdrejt kur shqyrtoj këtë artikull. Tani detyra është të kuptojmë një plan veprimi.

2) Krijoni HibernateUtil (në përgjithësi, prapashtesa ose parashtesa Util nënkupton që kodi në këtë klasë është universal dhe përdoret nga shumë klasa).
Pra, në HibernateUtil ne presim SessionFactory. Ai është i rëndë. Ky kod, në teori, duhet të jetë i pavarur nga i gjithë aplikacioni, pasi krijon një lidhje me bazën e të dhënave në fillim dhe duhet të na japë vetëm sesione me bazën e të dhënave. Ne gjithashtu i regjistrojmë klasat tona të entitetit në këtë klasë. Do t'ju tregoj më shumë për këtë klasë më vonë. Le ta vendosim edhe në një paketë të veçantë, për shembull, edu.shop.model.hbutil.HibernateUtil.java

3) Shkrimi DAO.
Çfarë duhet të shkruaj në të? Ne shkruajmë atë që duam të marrim nga baza e të dhënave, por nuk kemi nevojë të mendojmë se si janë marrë këto të dhëna, rezultati është i rëndësishëm. Për shembull, ne përcaktojmë ndërfaqen ProductDAO dhe shkruajmë metoda në të
Listë > getAllProducts (); pastaj shkruajmë zbatimin e tij ProductDAOImpl.

Cila është ideja? Nëse ju dhe unë do ta shkruanim këtë aplikacion, do të thoshit: "Micah, më duhen të dhënat e mëposhtme nga baza e të dhënave: të gjitha mallrat që kam në bazën e të dhënave." Unë përgjigjem: "Nuk është një pyetje". Dhe pastaj zhvillimi i mëposhtëm i ngjarjeve: në kodin tuaj, kudo që duhet të bëni pyetje në bazën e të dhënave, shkruani% e mëposhtme

* këtu thirrni në metodën * .getAllProducts (); - dhe e shihni që përpiluesi nuk betohet, dhe mund të mos kem kohë për të shkruar ende zbatimin e kësaj ndërfaqe. Dhe cili është rezultati? Gjithçka është përpiluar për ju, por nuk ka as një kod pune. Ne do të përdorim Enums dhe modelin Factory këtu, dhe disa të tjera, por të gjitha në kohën e duhur. Është në DAO që ju duhet t'i kushtoni vëmendje të veçantë trajtimit të përjashtimeve, të paktën për të gjeneruar faqe gabimesh. Kështu që ju të gjeni shpejt një pjesë të kodit të thyer. Përndryshe, thjesht do të torturoheni me korrigjimin e gabimeve.

3) Këtu fillon puna jonë me Spring MVC. Kjo është një histori e gjatë dhe një artikull i veçantë do t'i kushtohet kësaj. Unë do t'ju them menjëherë - kjo është gjëja më e vështirë në këtë aplikacion. Por unë do t'ju tregoj një opsion më të thjeshtë, si të shfaqni gjithçka, duke mos u kujdesur vërtet për modelin MVC.
Le të prekim përdorimin e skripteve.

4) Këtu do të kemi klasa ndihmëse që shtojnë të gjitha llojet e të mirave në projektin tonë: llogaritja e shumës totale të blerjeve; artikulli i fundit i blerë; variabla ndihmëse që do të jenë të dobishme për ne për funksionimin e metodës, e cila, për shembull, do të shfaqë gjërat nga baza e të dhënave për ne jo më shumë se 5000 UAH ose jo më pak se 500; përfundimi i të gjithë laptopëve të markës Asus. Ky artikull është i lidhur ngushtë me atë të mëparshëm.

Le të ndalemi në këtë tani për tani. Me pjesën tjetër do të merremi pak më vonë. Pra, ne kemi një plan të planifikuar, le të fillojmë zbatimin e tij.

Entitet

Ne krijuam projektin tonë dhe krijuam paketën tonë të entitetit. Le të jetë edu.shop.entitet. Atje ne krijojmë klasa si kjo:

Shënim. Shporta në të cilën do të ruhen mallrat tona të blera do të jetë si një tabelë në bazën e të dhënave, e bëra këtë sepse do të tregoj disa nga bazat e punës me bazën e të dhënave në të. Për një rast real, do të ishte më e leverdishme të përdornim koleksione për të ruajtur mallrat tona.

1) Produkt
2) Fletore
3) Kamera
4) Libri
5) Kabllo
6) Klient
7) Karroca

Le të flasim pak se çfarë është një klasë entiteti.
Entiteti - Klasa POJO e lidhur me bazën e të dhënave duke përdorur shënimin (@Entity) ose nëpërmjet XML. Kjo klasë ka kërkesat e mëposhtme:

Duhet të ketë një konstruktor bosh (publik ose të mbrojtur);
- Nuk mund të jetë i mbivendosur, ndërfaqe ose numërim;
- Nuk mund të jetë përfundimtar dhe nuk mund të përmbajë fusha / veti përfundimtare;
- Duhet të përmbajë të paktën një fushë @Id.

Në këtë rast, një njësi ekonomike mund të:

Subjektet mund të lidhen me njëra-tjetrën: një-me-një, një-me-shumë, shumë-për-një dhe shumë-për-shumë.

Ne do të përdorim shënime. Dhe këtu kemi menjëherë mundësinë të përshkruajmë në dy mënyra. Ose do të shkruajmë shënime drejtpërdrejt mbi fushat, ose mbi marrësit. Unë do të them një gjë: është e saktë të shkruash mbi getters, por arsyen do ta pyesësh në Google. Nuk mund t'i përshkruaj absolutisht të gjitha temat këtu.

Edhe një gjë dua të them. Për ta bërë këtë, do t'ju duhet të tregoni 2 shembuj të përshkrimit të klasës së entitetit. Pra, shembulli i parë:
Unë i shkrova komentet për të në vetë kodin:

Importoni java.io.Serializable; import javax.persistence *; import javax.validation.kufizimet.Madhësia; / ** * * @autor Mikhail Shumenko * / @Entity // Me këtë shënim, ne tregojmë se kjo klasë është një entitet. @Table (emri = "CART") // Me këtë shënim, ne tregojmë se një tabelë me emrin CART është përgjegjëse për këtë ent në bazën e të dhënave // ​​Dua të vërej se regjistri nuk është i rëndësishëm, ky shënim mund të hiqet, atëherë hibernate do të krijojë një bazë të dhënash për ne me / / me të njëjtin emër si klasa publike e klasës. / Tregoni që kjo fushë e klasës është përgjegjëse për kolonën në tabelë me emrin Id // Nëse nuk e specifikojmë atë, hibernate do të krijojë një kolonë me një emër si fusha. @Column (emri = "ID") // Ju mund të shkruaj shumë këtu)) Pse shkrova kështu këtu? Në përgjithësi, mund të shkruani AUTO në vend të TABLE në //@GeneratedValue(strategy=GenerationType) pastaj // në ngarkimin e parë të tabelës, ID-ja do të gjenerohet automatikisht nga 1 në vlerën e saj maksimale. // Nëse keni 20 gjëra në tabelë, atëherë ajo do të gjenerojë nga 1 në 20. // Por me shtesat pasuese, id-ja e gjësë së shtuar do të jetë diçka e tillë - 345768. // Kam shkruar gjithçka në mënyrë që të fundit id ruhet në tabelë dhe gjenerohet më pas në mënyrë adekuate në shtesat pasuese. // Ekziston edhe SEQUENCE, por nuk mbështetet në Derby dhe ne do të punojmë me të. // Në përgjithësi, këto janë nuanca. Ju mund të mësoni rreth tyre vetë @TableGenerator (emri = "cartid", tabela = "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; } } !}

Mënyra e dytë: shkruajmë mbi marrës. Shih kodin për shpjegime.

import java.io.Serializable; import javax.persistence *; / ** * * @author miha * / @Entity // Shih, nuk e specifikova shënimin @Table // Hibernate do të kuptojë gjithçka për mua. Klasa publike Produkti zbaton Serializable (integer private id; private string nameProduct; private Integer availableProduct; @Id @GeneratedValue (strategjia = GenerationType.AUTO) // E përshkrova ID-në sipër marrësit, që do të thotë se puna me pjesën tjetër të fushave do të shkojë përmes getters.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;) publik Integer getAvailableProduct () (kthehet në dispozicionProdukti;) publik void setAvailableProduct (Integer availableProduct) (this.availableProduct = Produkti disponueshëm;))

Pra, ju keni dy shembuj të klasave të entitetit. Ndërtoni pjesën tjetër duke përdorur këta shembuj. Fusha të tilla si: modeli, viti i publikimit, emri, kostoja - gjithçka varet nga imagjinata juaj. Sigurohuni që të përfshini fushën e disponueshme (në përkthim, disponueshmëria). Do të jetë e dobishme për ju më vonë. Ju mund ta bëni atë boolean dhe të shtoni një kolonë me emrin sasi. E gjithë kjo do të jetë e dobishme për ne.

Tani le të japim një shembull të HibernateUtil tonë

/ * * Për të ndryshuar këtë shabllon, zgjidhni Mjetet | Modelet * dhe hapni shabllonin në redaktues. * / paketa 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; importoni org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.SessionFactory; / ** * Klasa Hibernate Utility me një metodë të përshtatshme për të marrë objektin Session Factory *. * * @autor Mikhail Shumenko * / klasa publike HibernateUtil (// Krijo SessionFactory.private statike finale SessionFactory sessionFactory; statike (provo (// Krijo një instancë të re AnnotationConfiguration AnnotationConfiguration ac = new AnnotationConfiguration (në këtë rend // Ne kemi nevojë); në mënyrë që të shtojmë të gjitha klasat tona të entitetit. // secila nga Entiteti juaj duhet të regjistrohet këtu, nëse nuk e shkruani, nuk do të funksionojë.ac.addAnnotatedClass (ProductEntity.class) .addAnnotatedClass (BookEntity.class ). ne në fakt krijuam Fabrikën tonë të Sesioneve. // Është e nevojshme sepse ne punojmë me bazën e të dhënave përmes sesioneve / / Detajet do të vijnë pak më vonë, ndërsa ju e dini se si ta bëni dhe si të punoni me të.sessionFactory = ac.configure () BuildSessionFactory ();) catch (Throwable ex) (// Regjistro përjashtimin. System.err. println ("Krijimi Initial SessionFactory dështoi." + ex); hedh të ri ExceptionInInitializerError (ex); )) publike statike SessionFactory getSessionFactory () (sesioni i kthimitFactory;))

DAO

Le të kalojmë në pjesën tjetër. Çfarë është DAO. Ky është një model dizajni.

Kuptimi i saj:
- E gjithë aksesi në bazën e të dhënave në sistem bëhet përmes DAO për enkapsulim.
- Çdo shembull DAO është përgjegjës për një objekt ose entitet kryesor të domenit. Nëse objekti i domenit ka një cikël jete të pavarur, ai duhet të ketë DAO-në e tij.
- DAO është përgjegjës për operacionet e krijimit, leximit (me çelësin kryesor), përditësimit dhe fshirjes (d.m.th., CRUD (krijoni, lexoni, përditësoni, fshini)) të një objekti domeni.
- DAO mund të zgjidhë pyetje bazuar në kritere të ndryshme nga çelësi primar. Po i referohem metodave si finder ose finders. Metoda e gjetësit zakonisht kthen një koleksion të objekteve të domenit për të cilët është përgjegjës DAO.
- DAO nuk trajton transaksione, seanca ose lidhje. Kjo është bërë jashtë DAO për fleksibilitet.
Google gjithmonë do t'ju tregojë më shumë.

Ne do të shkruajmë një DAO për produktet tona tani për tani.
Pra, le të mendojmë për atë që na nevojitet vërtet. Tabela e produktit do të ketë 4 fusha Id, emriProdukt, i disponueshëm + shuma + veprimPërServlet. Do të na duhet për të krijuar kategori në faqen tonë. Nuk po shqetësohemi akoma me fushën e fundit. E vetmja gjë që na duhet është të marrim një listë të produkteve.

Shkrimi i një ndërfaqeje
ndërfaqe publike ProductDAO (ProductDAO INSTANCE_PRODUCT = i ri ProductDAOImpl (); Lista GetProducts (); // dhe metodën me të cilën do të punojmë)

Zbatimi i ndërfaqes sonë. Shih kodin për shpjegime.
/ * * Për të ndryshuar këtë shabllon, zgjidhni Mjetet | Modelet * dhe hapni shabllonin në redaktues. * / paketa edu.shop.model.dao; import java.util.List; import org.hibernate.Kriteret; import org.hibernate.Session; / ** * * @autor Mikhail Shumenko * / klasë publike ProductDAOImpl zbaton ProductDAO (@Override public List GetProducts () (Lista Rezultati = null; // Krijoni një seancë, është e nevojshme për të përdorur transaksione // Përafërsisht, një transaksion është si një pikë rikuperimi, nëse nuk kalon deri në fund, atëherë të gjitha ndryshimet kthehen prapa. Sesioni i sesionit = HibernateUtil.getSessionFactory ().OpenSession (); provoni (session.beginTransaction (). Fillim (); // Kriteret përdoren për një kërkesë për të marrë të dhëna nga baza e të dhënave // ​​Ky formulim, mendoj, është i mjaftueshëm për ju tani për tani // Si parametër, ne kalojmë entitetin klasa që po përdorim.Nëse të dhënat merren nga tabela e Shportës, atëherë transferoni // do të ishte e nevojshme Kriteret e kartës.klasa = session.createCriteria (Product.class); rezultati = (lista ) kriteret.lista (); session.getTransaction (). commit) catch (Exception e) (// Sigurohuni që të shkruani trajtimin e përjashtimeve. Por unë do t'ju lë të punoni vetë.e.printStackTrace ();) më në fund (nëse (sesion! = null) sesioni.mbyll ( );) kthe rezultatin; ))

Pra, tani kemi mundësinë të marrim të dhëna nga baza e të dhënave. Ju mund të përdorni skriptet për të krijuar një lak të drejtpërdrejtë për secilin dhe për të nxjerrë produktet tuaja në faqen tuaj index.jsp.

Kategoritë

// INSTANCE_PRODUCT çfarë është? // Një variabël i tillë përshkruhet në ProductDAO, është përgjegjës për krijimin e ProductDAOImpl // Epo, gjithçka do të jetë ndryshe për ne, nuk keni pse ta mbani mend shumë. // ProductDAO INSTANCE_PRODUCT = i ri ProductDAOImpl ();<% for (Product product:ProductDAO.INSTANCE_PRODUCT.getProducts()) {%> <%}%> <% for (Product product: ProductDAO.INSTANCE_PRODUCT.getProducts()) {%> <%}%>
Kategoria"><%=product.getName()%>
Disponueshmëria<%=product.getAvailable()%>

Por kjo është për herë të parë, por në përgjithësi është keq ta bësh këtë. Kjo shkel tonën Modeli MVC... Unë do të shpjegoj se si ta bëj atë drejt në mësimin tjetër, nëse më bëjnë një ftesë. Në tutorialin e dytë do të trajtojmë Pranverën, në të tretin do të prekim modelin Factory dhe do të zhytemi më thellë në hibernate. Për ata që janë veçanërisht të paduruar, unë do t'ju tregoj se si të fshini nga baza e të dhënave, të ruani në bazën e të dhënave dhe të fshini plotësisht gjithçka nga baza e të dhënave. Epo, si t'i bëjmë të gjitha të ndërveprojnë me aplikacionin tonë në tërësi dhe ta lëmë shqyrtimin e detajuar për më vonë.

Ruaje në DB

public void addItemToCart (CartEntity cart) (Sesioni i sesionit = HibernateUtil.getSessionFactory (). openSession (); provo (session.beginTransaction (). start (); session.save (shporta); session.getTransaction (). commit (); ) catch (Exception ex) (ex.printStackTrace ();) në fund (nëse (sesion! = null) (sesion.mbyll ();)))

Hiq nga baza e të dhënave me ID

bosh publik deleteItemFromCart (ID me numër të plotë) (Sesioni i sesionit = HibernateUtil.getSessionFactory (). openSession (); provo (session.beginTransaction (). start (); Item CartEntityDelete = (CartEntity) session.get (CartEntity.class, ); session.delete (itemDelete); session.getTransaction (). commit ();) catch (Exception ex) (ex.printStackTrace ();) në fund (nëse (sesion! = null) (sesion.mbyll ();)))

Heqja e ID-së së grupit nga baza.

bosh publik deleteAllItemToCart (Lista idAllItemsInCart) (Sesioni i sesionit = HibernateUtil.getSessionFactory (). openSession (); provo (session.beginTransaction (). start (); për (ID me numër të plotë: idAllItemsInCart) (Artikulli CartEntityDelete = (CartEntity (CartEntity) sesioni (CartEntity,CartsE,getn). id); session.delete (itemDelete);) session.getTransaction (). commit ();) catch (Exception ex) (ex.printStackTrace ();) në fund (if (sesion! = null) (sesion.close () ;)))

Do t'ju duhet gjithashtu një skedar konfigurimi Hibernate. Krijo një bazë të dhënash dyqanesh në Derby. Emri i përdoruesit dhe fjalëkalimi janë përkatësisht root dhe pass. Nëse nuk funksionon - mos u dekurajoni - do t'i kushtoj më shumë kohë kësaj.

org.hibernate.dialekt.DerbyDialect org.apache.derby.jdbc.ClientDriver jdbc: derbi: // localhost: 1527 / dyqan rrënjë kalojnë UTF-8 përditësimi

Më vonë do të flasim se si të plotësojmë bazat e të dhënave tona. Ju mund t'i plotësoni ato me dorë. Ose prisni mësimin tjetër.

05.13.05 14.8K

Prezantimi

Teknologjia Java Server Pages (JSP) është pjesë e teknologjisë së unifikuar për ndërtimin e aplikacioneve të biznesit J2EE. JSP është një teknikë alternative për zhvillimin e aplikacioneve që gjenerojnë në mënyrë dinamike përgjigje ndaj kërkesave specifike të klientit. Përpara se të përdoret dokumenti JSP, një procedurë e veçantë e konverton atë në servletin e duhur. Nga ana tjetër, një servlet zakonisht shkruhet në gjuha Java dhe zbaton një ndërfaqe specifike. Për më tepër, servlet nuk është gjithashtu një aplikacion i pavarur dhe funksionon vetëm kur vendoset në kontejnerin e duhur të internetit. Kontejneri i uebit siguron shkëmbimin e të dhënave midis servletit dhe klientëve, kujdeset për funksione të tilla si krijimi i një mjedisi softuerësh për një servlet funksional, identifikimi dhe autorizimi i klientëve, organizimi i një sesioni për secilin prej tyre.

aktualisht faqja JSP përkthehet në një servlet, kodi i programit i të cilit është i shkruar në gjuhën Java. Sidoqoftë, autorët e specifikimit të Faqeve të Serverit Java e lënë të mundur zbatimin e JSP-ve në gjuhë të tjera programimi.

Marrëdhënia midis servlets në një aplikacion të linjës së biznesit dhe URL-ve në server specifikohet në përshkruesin e vendosjes. Teknologjia e zbatimit të Servlet diskutohet në një artikull të veçantë. Tani për tani, është e rëndësishme të theksohet se kodi i përdorur për të shkruar servlet nuk është gjithmonë i përshtatshëm për gjenerimin dinamik të dokumenteve të tekstit në përgjigje të një kërkese të klientit. Për shembull, një fragment i një servlet që gjeneron një dinamikë faqet HTML mund të duket kështu:

PrintWriter out = res.getWriter (); out.println (" "); out.println (" "); ... out.println (""); out.println (""); jashtë.mbyll ();

Siç mund ta shihni, secili varg HTML dokumenti në servlet korrespondon me një pjesë të caktuar të kodit të programit, i cili nuk kontribuon në lehtësinë e zhvillimit dhe mirëmbajtjes së aplikacioneve të biznesit.

Është më i përshtatshëm për të ndarë pjesët dinamike dhe statike të faqes së krijuar në internet. Ju do të vazhdoni të përdorni Java ose një gjuhë tjetër programimi për të krijuar pjesën dinamike. Ka kuptim të dizajnoni pjesën statike si një dokument teksti - Faqe Java Server (faqe JSP), e krijuar në përputhje me Kërkesat HTML, XML ose një standard tjetër shënjimi. Në fakt, një faqe JSP mund të mendohet si një shabllon ose prototip i një faqeje dinamike, e cila mbetet për t'u plotësuar me elementë dinamikë. Për të përshkruar komponentin dinamik, teknologjia JSP ofron dy mekanizma kryesorë: JavaBeans dhe biblioteka të etiketave shtesë. Si rezultat, teknologjia JSP presupozon punën paralele në aplikim nga dy specialistë të ndryshëm: një programues dhe një person përgjegjës për paraqitjen e dokumenteve (mjeshtrat e uebit), të cilët janë përgjegjës përkatësisht për zhvillimin e pjesëve dinamike dhe statike të dokumenteve. të krijuara në përgjigje të kërkesave të klientëve.

Siç u përmend, përpara se të përdorni një faqe JSP, duhet ta transformoni atë në një servlet të përshtatshëm. Ky transformim mund të kryhet ose kur faqja JSP vendoset në server, ose kur klienti hyn për herë të parë në faqe. Meqenëse procedura e konvertimit është mjaft e mundimshme dhe kërkon kohë, zakonisht kryhet vetëm një herë. Megjithatë, serveri do të ridrejtojë automatikisht thirrjet e mëvonshme nga klienti në faqen JSP në servilet që është marrë si rezultat i transformimit të tij.

Servleti i marrë pas transformimit të JSP të faqes operon brenda një kontejneri standard servlet dhe përdor një ndërfaqe shumë të rregulluar. Prandaj, kjo teknologji nuk varet nga ndonjë veçori e një platforme të veçantë harduerike. Nga ana tjetër, duke qenë se teknologjitë JSP mund të ndërtohen në bazë të gjuhës së interpretuar Java, kjo jep një garanci për transportueshmërinë e aplikacioneve të ndërtuara në teknologjinë JSP në çdo platformë ku mund të instaloni Java virtuale makinë.

Faqja JSP

Zakonisht një faqe JSP ruhet në skedar të veçantë me shtesën .jsp. Pjesa më e madhe e përmbajtjes së JSP të faqes është servlet e përcaktuar në një grup deklaratash out.println (). Shembull i faqes JSP:

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

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

Komponenti dinamik i faqes JSP përfaqësohet nga tre lloje elemente të veçanta: direktivat, veprimet dhe skriptet. Secila prej tyre diskutohet më në detaje në seksionin përkatës.

Direktivat

Meqenëse kontejneri i uebit, përpara se të përdorë faqen JSP të ofruar nga zhvilluesit e aplikacionit të biznesit, e përkthen atë në servletin e duhur, ka kuptim të sigurohet aftësia për të lënë direktiva në faqen JSP që do të kontrollojnë procesin e përkthimit. Direktivat kanë sintaksë

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

Le të shohim disa nga këto direktiva

Direktiva e faqes. Deklaron një numër të vetive të faqeve JSP. Sintaksa e direktivës:

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

Le të përshkruajmë disa nga më parametra interesantë të kësaj direktive:

  • import - Siç është përmendur tashmë, faqja JSP duhet të konvertohet në kodin e programit - klasa që korrespondon me servletin përpara përdorimit. Nga ana tjetër, klasa servlet mund t'i referohet klasave të tjera nga standardi bibliotekat Java ose klasa nga paketat e tjera. Si parazgjedhje, klasa servlet e marrë pas përkthimit të faqes JSP mund të shoqërohet me paketat java.lang, java.servlet, java.servlet.jsp dhe java.servlet.http. Nëse klasa servlet duhet të komunikojë me paketa të tjera, për shembull, me xbcat.util si në shembullin e mësipërm të faqes JSP, kjo e fundit duhet të plotësohet me një direktivë faqeje që ka një atribut importi me emrin e paketës përkatëse.
  • sesioni - Nëse protokolli HTTP përdoret për të komunikuar me një klient, një objekt sesioni krijohet si parazgjedhje për çdo sesion, i cili lejon ruajtjen e informacionit për këtë klient në intervalin midis thirrjeve të tij në server. Nga ana tjetër, nëse atributi i sesionit është specifikuar me vlerën false, kjo ju lejon të refuzoni të krijoni një objekt sesioni dhe të përdorni burimet e liruara të serverit për detyra të tjera.
  • buffer - Përmbajtja e faqes e krijuar në përgjigje të kërkesës së klientit kalon nga servleti në rrjedhën e daljes, nga ku më pas kalohet nga kontejneri i uebit drejtpërdrejt te klienti. Për të marrë një mënyrë transmetimi më optimale, kjo rrymë pajiset me një modalitet buffering. Madhësia e paracaktuar e tamponit është 8 kilobajt. Parametri buffer i direktivës së faqes ju lejon ose të vendosni një madhësi të ndryshme buferi, ose të braktisni plotësisht modalitetin e buferit duke kaluar vlerën "asnjë" në atribut.
  • isThreadSafe - Sipas specifikimit të servletit, kontejneri i parazgjedhur i ueb-it lejon të njëjtin shembull të servletit të përpunojë kërkesat nga shumë klientë paralelisht. Në këtë rast, një fije e veçantë i ndahet secilës prej kërkesave. Megjithatë, në disa raste mund të jetë e dobishme të çaktivizoni përpunimin paralel të pyetjeve. (Kontrolluesi përkatës në kontejnerin e uebit vendos në radhë kërkesat hyrëse dhe ia kalon ato servletit për t'i përpunuar rreptësisht një nga një.) Për ta bërë këtë, mjafton të përdorni atributin isThreadSafe, me vlerën false.
  • PageEncoding - Lejon zhvilluesin e aplikacionit të deklarojë kodimin që do të përdoret në dokumentin e kaluar te klienti. Si parazgjedhje, faqja konsiderohet të jetë në kodimin ISO-8859-1.
  • Lloji i përmbajtjes - Në përgjigje të një kërkese të klientit, faqja e paracaktuar JSP gjeneron një dokument Lloji HTML... Në të njëjtën kohë, fusha e aplikimit të teknologjisë Java Server Pages është shumë më e gjerë, pasi ju lejon të gjeneroni çdo lloj tjetër dokumentesh teksti: XML, WML, VRML, etj. Lloji MIME i dokumentit të gjeneruar deklarohet me atributin contentType. Siç është kuptuar tashmë, ky atribut është vendosur në "test / html" si parazgjedhje. Së bashku me llojin e dokumentit, specifikimi JSP lejon që kodimi i dokumentit të gjeneruar të specifikohet në të njëjtin atribut.

Direktiva taglib. Ju lejon të përdorni etiketa shtesë të krijuara nga zhvilluesi i aplikacionit (etiketa të personalizuara) në faqet JSP. Sintaksa e direktivës:

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

ku, uri është një URI absolute ose relative që identifikon në mënyrë unike një dorezë në bibliotekën e etiketave të lidhur me prefiksin e specifikuar. Prefiksi i specifikuar përdoret për të identifikuar etiketat përkatëse me porosi.

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

Ne do të shikojmë procedurën për krijimin e etiketave të personalizuara më vonë.

Përfshi direktivë. Përdoret për të vendosur tekste dhe kod programi nga burime të tjera në një faqe JSP. Zëvendësimi kryhet kur faqja JSP përkthehet në servletin e duhur. Një shembull i përdorimit të direktivës:

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

Vini re se zëvendësimi i materialeve nga një burim i jashtëm mund të kryhet gjithashtu duke përdorur një etiketë të veçantë , e cila do të diskutohet nga ne më vonë. Dallimi midis kësaj etikete dhe direktivës së përshkruar është se zëvendësimi kryhet drejtpërdrejt në procesin e përpunimit të një kërkese klienti, dhe për këtë arsye mund të lidhet me parametrat e kërkesës.

Një fragment i kodit të programit në faqen JSP (skript)

Skripti, si elementë të tjerë, shton një komponent dinamik në dokumentin përfundimtar. Megjithatë, ndryshe nga ata, një skrip është një kod programi i vendosur direkt në tekstin JSP të një faqeje. Skripti mund të kryejë llogaritje ose të manipulojë objekte, gjë që ju lejon të lidhni vizualisht karakteristikat e faqes së krijuar me parametrat e kërkesës së klientit dhe rregullat e biznesit të aplikacionit. Elementet e skriptit janë tre llojesh: deklarata, skriptet dhe shprehje.

Deklaratat

Pasi JSP-ja e faqes të konvertohet në një servlet, pjesa më e madhe e përmbajtjes së tij shkon në metodën _jspService (), e cila thirret sa herë që një porosi klienti duhet të përpunohet. Një deklaratë faqeje JSP përdoret më shpesh për të deklaruar atribute dhe metoda shtesë në një klasë servlet që do të jenë të disponueshme kur përpunohet çdo kërkesë klienti. Deklaratat kanë sintaksë<%! … %> .

Shembuj të deklaratave në faqen JSP:

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

Skriptet

Një skriptet mund të përmbajë kodin e programit dhe deklaratat e variablave lokale që do të përdoren për të përpunuar kërkesat e klientit. Në fakt, një skriplet është një pjesë e kodit të programit nga një servlet i ardhshëm, i cili në kohën e duhur do të vendoset në metodën _jspService (). Si pjesë e servletit, skriptet fitojnë qasje në objektin e përgjigjes dhe, në përputhje me rrethanat, mund të formojnë në mënyrë të pavarur një pjesë të caktuar të faqes dinamike përfundimtare. Sidoqoftë, më shpesh skriptet përdoren jo për këtë, por për të menaxhuar objektet e logjikës së biznesit dhe logjikës së aplikimit.

Skripti ka sintaksën<% … %>... Një shembull i përdorimit të skripteve në përmbajtjen e faqes JSP:

<% if (i == 0) { %>Miremengjes<% } else { %>Mirembrema<% } %>

Për të vlerësuar qartësinë dhe thjeshtësinë e këtij konstruksioni, krahasojeni atë me fragmentin ekuivalent të kodit në një servlet:

if (i == 0) (out.println ("Mirëmëngjes");) else (out.println ("Mirëdita");)

Shprehjet

Shpesh, faqja që i transmetohet klientit përmban rezultatet e llogaritjeve ose thirrjeve për metoda dhe atribute të caktuara të klasave të caktuara. Secili nga këta elementë dinamikë mund të konvertohet në një varg dhe të paraqitet në një faqe JSP duke thirrur out.println në skriptin e duhur:

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

Rreshti i dytë në shembullin e dhënë është më i përshtatshëm dhe më i qartë për t'u paraqitur në një formë më të shumëfishtë, duke përdorur sintaksën e shprehjes<%= … %> :

<%= user.getFaxNumber() %>

Një shembull tjetër i përdorimit të një shprehjeje në trupin e një faqeje JSP:

<%! int i = 0; %>Përshëndetje, tani po përpunohet servlet<%= ++i %>kërkesën.

Faqet dhe objektet JSP

Gjatë përpunimit të kërkesave, faqja JSP mund të aksesojë objektet e vendosura në server, t'i krijojë ato dhe t'i modifikojë ato. Objektet arrihen përmes elementeve të skenarit dhe veprimit. Çdo objekt i krijuar në aplikacion ka një jetëgjatësi të caktuar, e cila deklarohet në atributin përkatës. Specifikimi ofron katër intervale:

  • faqe - Objekti, jetëgjatësia e të cilit është përcaktuar si faqe, është i aksesueshëm vetëm brenda faqes JSP ku është krijuar. Të gjitha referencat për këtë objekt duhet të lëshohen menjëherë pasi kërkesa e klientit të jetë përpunuar.
  • kërkesë - Një objekt jetëgjatësia e të cilit është specifikuar si kërkesë dhe është i disponueshëm për të gjitha faqet që lidhen me përpunimin e kësaj kërkese. Në veçanti, nëse përpunimi ridrejtohet në një faqe të re JSP, këtë objekt do të jetë i disponueshëm si në faqen e vjetër ashtu edhe në atë të re. Si në rastin e mëparshëm, referencat për objektin duhet të lirohen pasi kërkesa të jetë përpunuar.
  • sesioni - Një objekt me shtrirje sesioni është i disponueshëm për të gjitha faqet që trajtojnë kërkesat e lidhura me një sesion specifik (një sesion me një klient specifik). Referencat për objektet e lidhura me seancën vendosen në objektin e sesionit. Në fund të seancës, lidhjet duhet të lëshohen.
  • aplikimi - Shtrirja më e përgjithshme. Objektet e përfshira në aplikim nuk janë të lidhura me asnjë faqe të veçantë ose sesion dhe janë të aksesueshme nga të gjitha faqet JSP të këtij aplikacioni.

Faqja JSP ka gjithmonë akses në një grup specifik objektesh, krijuar nga uebi kontejneri i paracaktuar:

  • kërkesë - Një objekt që përmban kërkesën e klientit. I referohet klasës javax.servlet.ServletRequest, ose një klase tjetër që trashëgon prej saj. Për shembull, për protokollin HTTP, ky do të ishte një objekt i klasës javax.servlet.http.HttpServletRequest. Objekti i objektit është kërkesa.
  • përgjigje - Objekti në të cilin servleti do të vendosë përgjigjen ndaj kërkesës së përdoruesit. I referohet klasës javax.servlet.ServletResponse, ose një klase tjetër që trashëgon prej saj. Për shembull, për protokollin HTTP, ky do të ishte një objekt i klasës javax.servlet.http.HttpServletResponse. Objekti i objektit është kërkesa.
  • pageContext - Një objekt që përcakton kontekstin JSP të faqes. Shtrirja e objektit - faqe
  • sesioni - Një objekt i krijuar nga kontejneri për të identifikuar klientin, si dhe për të ruajtur objekte personale. Krijuar nga kontejneri për protokollin HTTP dhe është një shembull i klasës javax.servlet.http.HttpSession.
  • aplikacion - Një objekt i lidhur me konfigurimin e servletit që korrespondon me këtë faqe JSP. Objekti i objektit është aplikimi.
  • out - Një objekt që përmban rrymën e daljes së servletit. Informacioni i dërguar në këtë transmetim do t'i dërgohet klientit. Objekti është një shembull i klasës javax.servlet.jsp.JspWriter. Për shembull, shumica e shablloneve statike në një faqe JSP duhet të shkruhet në mënyrë ideale në formën e një grupi të përshtatshëm komandash out.println (). Shtrirja e objektit është faqe.
  • config - Objekti i lidhur me konfigurimin e servletit. Shembulli i klasës javax.servlet.ServletConfig. Për një faqe JSP, objekti i konfigurimit është faqe.
  • faqe - Objekti i lidhur me paraqitjen e kësaj faqeje. Fushëveprimi - faqe

Elementet e veprimit

Pavarësisht nga lloji i dokumentit të krijuar në përgjigje të një kërkese të përdoruesit, në përgjithësi, një faqe JSP përmban tekst dhe etiketa. Natyrisht, këto të fundit korrespondojnë me llojin e dokumentit të krijuar: HTML, XML, etj. Përveç kësaj, trupi i faqes JSP mund të përmbajë fragmente të kodit Java që duhet të jenë pjesë e servletit të marrë pas përkthimit: deklarata, skriptet dhe shprehje. Ideja është të plotësohet grupi i etiketave standarde të shënjimit me etiketa speciale - elemente veprimi, pas të cilave zhvilluesi i një aplikacioni biznesi mund të fshehë një pjesë të kodit të programit që lidhet me aplikacionin, ose disa udhëzime shtesë.

Vini re se nga pikëpamja e një specialisti të paraqitjes, elementët e veprimit janë të njëjtat etiketa si të gjithë të tjerët, dhe për këtë arsye ato janë të lejueshme. ndarjen me elementë të tjerë:

Le të hedhim një vështrim në disa nga këta elementë.

Elementet standarde të veprimit

Elementet standarde të veprimit duken si etiketa të rregullta, emri i të cilave fillon me kombinimin jsp: karaktere, për shembull ... Në terminologjinë XML, kjo do të thotë që elementët standard të veprimit në teknologjinë JSP i përkasin hapësirës së emrave jsp.

jsp: useBean

Elementi jsp: useBean ju lejon të përdorni objekte në faqen JSP që korrespondojnë me JavaBeans. Elementi përmban një parametër që lidh një identifikues unik me komponentin. Kjo e fundit më pas do të përdoret kur i referohemi këtij objekti:

Ky shembull krijon një objekt të klasës com.myco. Në të ardhmen, për t'iu referuar asaj, mjafton të përdorni identifikuesin "klient". Për shembull:

<%= customer.getName() %>

Si parazgjedhje, objektet e lidhura me një JavaBean janë të shtrirë në faqe si parazgjedhje. Zhvilluesi i faqes JSP mund të specifikojë më shumë kohe e gjate ekzistenca e një JavaBean duke përdorur elementin scope kur shkruani elementin jsp: useBean. Vlerat e mundshme për këtë atribut - faqja, kërkesa, sesioni dhe aplikacioni - u diskutuan më herët kur folëm për shtrirjen e objekteve të lidhura me një faqe JSP.

Ne nuk do të mbulojmë pjesën tjetër të atributeve të elementit jsp: useBean. Këtu është vetëm një shembull tjetër i përdorimit të tij:

Pjesa e brendshme e JavaBeans do të diskutohet në një artikull të veçantë.

jsp: setProperty dhe jsp: getProperty

Çdo klasë duhet të japë akses në disa nga atributet dhe metodat e saj. Dallimi midis elementit JavaBean është se qasja në atributet e tij është e unifikuar dhe zbatohet në faqen JSP duke përdorur elementet jsp: setProperty dhe jsp: getProperty.

Elementi jsp: getProperty merr një shembull Bean, merr vlerën e atributit të specifikuar, e konverton atë në një varg nëse është e nevojshme dhe e vendos atë në rrjedhën e të dhënave që i kalon klientit. Për shembull, sipas hyrjes së mëposhtme

dokumenti i gjeneruar plotësohet me vlerën e vetive të emrit nga instanca Bean me përdoruesin identifikues.

Elementi jsp: setProperty, ndryshe nga ai i mëparshmi, nuk rikthehet, por vendos një vlerë të re për atributin. Për shembull:

Përveç përcaktimit të qartë të vlerave të reja, elementi jsp: setProperty ju lejon të vendosni një atribut objekti me një vlerë të marrë nga një kërkesë klienti. Për shembull:

Ky rekord do të thotë që ndër të dhënat e marra nga klienti është parametri login dhe vlera e tij kalohet për t'u vendosur në atributin name të objektit Bean me identifikuesin "user".

Më në fund, kur emrat e fushave në kërkesën e klientit përputhen me emrat e atributeve të Bean, ekziston një opsion tjetër ku të gjitha vlerat migrohen menjëherë. Për shembull:

jsp: përfshijnë

Ashtu si direktiva e përfshirjes, ky element ju lejon të vendosni materiale statike dhe dinamike nga një burim i jashtëm në trupin e një faqeje të krijuar në mënyrë dinamike. Në të njëjtën kohë, megjithëse materiali i huazuar në këtë mënyrë përpunohet në të njëjtin kontekst si Faqja aktuale, i jepet akses vetëm në rrjedhën dalëse të servletit. Për shembull, kodi i përfshirë në një faqe JSP nuk duhet të aksesojë skedarët e skedarëve ose të përdorë titujt e tij që deklarojnë kodimin ose llojin e dokumentit.

Dallimi midis direktivës së përfshirjes dhe elementit jsp: përfshi është se materiali i përfshirë për të nuk mund të jetë dinamik, dhe kërkimi dhe përpunimi i fragmenteve të mundshme dinamike kryhet jo veçmas, por pas përfshirjes, me të gjithë faqen.

Një shembull i përdorimit të elementit jsp: include:

jsp: përpara

Ky element ju lejon të ridrejtoni gjenerimin e mëtejshëm të një faqeje dinamike në një faqe tjetër JSP, servlet, ose të përdorni një tekst të përgatitur për plotësim. Për shembull:

Në tjetrën, më shumë shembull kompleks Faqja dinamike përfundon me përmbajtje skedar teksti emri i të cilit është marrë nga ndryshorja someValue:

Si përfundim, duhet theksuar se ekzistojnë dy skema kryesore për përpunimin e kërkesave të klientëve:

Në rastin e parë, përpunimi i kërkesës së klientit dhe formimi i një faqeje dinamike në përgjigje kryhen brenda një faqeje të vetme JSP ose servlet. Ky i fundit, nëse është e nevojshme, mund të aksesojë JavaBeans ose të importojë materiale nga burime të jashtme duke përdorur direktivën e përfshirjes ose elementin jsp: përfshi.

Në rastin e dytë, përpunimi kryhet në dy faza. Së pari, kontrolli kalon në një faqe servlet ose JPS që në të vërtetë trajton kërkesën. Për shembull, të dhënat merren nga një kërkesë klienti dhe vendosen në një bazë të dhënash ose atribute të objekteve të caktuara. Kontrolli më pas kalon në një faqe të veçantë JSP ose servlet përgjegjës për gjenerimin e faqes dinamike për transferimin e mëvonshëm te klienti. Megjithatë, nuk duhet të ketë ndonjë lidhje midis përpunimit të një kërkese dhe krijimit të një faqeje të re. Për shembull, mund të jetë thjesht një kthim nga klienti faqja kryesore pas përfundimit të çdo procedure.

Komplete etiketash shtesë

Prezantimi

Protokollet e shënimit tekstual si HTML kanë një grup etiketash shumë të rregulluara. Në të njëjtën kohë, gjatë zhvillimit të dokumenteve, shpesh lind nevoja për të përdorur etiketa shtesë, të veçanta, të cilat, megjithëse nuk ishin deklaruar në specifikimet përkatëse, por në një masë më të madhe korrespondojnë me fushën e subjektit të një biznesi. aplikacion. Nga njëra anë, etiketat e tilla shtesë ose të personalizuara mund të shihen si një lloj makro që do të zëvendësohet nga një kombinim ekuivalent i etiketave standarde përpara se dokumenti t'i dërgohet klientit. Përndryshe, një pjesë specifike e kodit mund të jetë prapa etiketës me porosi. Për shembull, një etiketë e vetme mjaft e zakonshme mund të jetë një numërues i goditjeve ose një menu, përmbajtja e së cilës varet nga roli që luan një klient i caktuar në një proces biznesi.

Ndërtimi i etiketave të personalizuara përfshin shkrimin e kodit specifik të programit. Teknologjia JSP siguron vendosjen e këtij kodi në një modul të veçantë programi - biblioteka e etiketave me porosi. Zhvillimi i bibliotekave të tilla mund t'u jepet kompanive. Faqja JSP është e lidhur me një bibliotekë të veçantë të etiketave të personalizuara duke përdorur direktivën taglib të përshkruar më parë. Direktiva e specifikuar lidh përshkruesin e bibliotekës përkatëse me një prefiks specifik, i cili, nga ana tjetër, identifikon të gjitha etiketat e personalizuara nga kjo bibliotekë në trupin e faqes JSP. Pra, direktiva

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

deklaron se faqja JSP përdor një bibliotekë etiketash shtesë, secila prej të cilave fillon me prefiksin dscat. Për shembull:

Të gjithë klientët

Kodi i programit të kësaj biblioteke përshkruhet nga përshkruesi exttags.tld. Ne nuk do të ndalemi këtu në rregullat për shkrimin e një përshkruesi të bibliotekës, por shqyrtojmë vetëm një nga shembujt e mundshëm të zbatimit të tij:

1.0 1.2 dscat faqe faqe ru.view.tag.PageHeader

Krijimi i një biblioteke të personalizuar të etiketave

Etiketat e personalizuara pa përpunim të përmbajtjes

Kodi për mbështetjen e një etikete të personalizuar është në mënyrë të veçantë një shembull i shkruar i një klase Java që thirret nga kontejneri i uebit sa herë që duhet të japë një faqe JSP që përmban etiketën përkatëse.

Në rastin më të thjeshtë, për të mbështetur një etiketë të personalizuar, mund të merrni ndonjë nga klasat e aplikacionit të biznesit dhe ta plotësoni atë me metoda që korrespondojnë me ndërfaqen Tag. Nëse nuk keni nevojë të përdorni objekte të jashtme, atëherë TagSupport mund të përdoret si klasa bazë. Këto dhe klasa dhe ndërfaqe standarde të tjera gjenden në paketën javax.servlet.jsp.tagest.

Një shembull i një klase që mbështet një etiketë të personalizuar:

publike CopyrightTag zgjeron TagSupport (public int doStartTag () hedh Exception (pageContext.getOut (). print (" © Copyright 2001"); ktheje SKIP_BODY;) int publik doEndTag () (ktheje EVAL_PAGE;))

Metodat e klasës që përpunon etiketën e personalizuar thirren në një sekuencë specifike. Kur përpunimi arrin etiketën me porosi të hapjes në faqen JSP, metoda doStartTag () thirret për ta përpunuar atë. Kur përpunimi arrin etiketën përfundimtare përkatëse, thirret metoda doEndTag (). Metodat doInitBody () dhe doAfterBody () përdoren për të përpunuar pjesën e faqes JSP që është e mbyllur midis këtyre dy etiketave.

Përveç faktit që metoda doStartTag () mund të bëjë çdo lloj përpunimi në kërkesë, vlera që kthen është e rëndësishme. Nëse është SKIP_BODY, atëherë informacioni i mbyllur midis etiketave hapëse dhe mbyllëse përkatëse do të shpërfillet dhe përpunimi JSP i faqes do të kalojë menjëherë te etiketa mbyllëse. Që përmbajtja e etiketës së personalizuar të jetë ende e përpunuar, medot duhet të kthejë EVAL_BODY_INCLUDE. Po kështu, nëse metoda doEndTag () kthen SKIP_PAGE, atëherë pjesa tjetër e faqes JSP pas etiketës fundore do të shpërfillet. Për të parandaluar që kjo të ndodhë, metoda duhet të kthejë EVAL_PAGE.

Në disa raste, është e nevojshme të tregohet përmbajtja e një etikete të personalizuar jo një herë, por disa herë. Në këtë rast, klasa që përpunon etiketën duhet të zbatojë ndërfaqen IterationTag, ose të përdorë klasën TagSupport si prind. Për të ribërë shfaqjen e përmbajtjes së etiketës së personalizuar edhe një herë, metodat doStartTag dhe doAfterBody duhet të kthejnë EVAL_BODY_AGAIN.

Etiketat e personalizuara me trajtimin e përmbajtjes

Nëse kërkohet qasja në përmbajtjen e një etikete të personalizuar, atëherë klasa përkatëse Java duhet të zbatojë ndërfaqen BodyTag ose të trashëgojë nga klasa BodyTagSupport. Në secilin rast, një klasë mund të zbatojë metodat doInitBody dhe doAfterBody.

Metoda doInitBody thirret menjëherë pasi të identifikohet përmbajtja e etiketës, por përpara se të përpunohet. Zakonisht kjo metodë përdoret kur ju duhet të inicializoni një klasë bazuar në përmbajtjen e një etikete të personalizuar.

Metoda doAfterBody thirret pasi të jetë përpunuar përmbajtja e etiketës së personalizuar. Ashtu si në seksionin e mëparshëm, metoda doAfterBody mund të tregojë nëse do të përsëritet përsëri mbi përmbajtjen e etiketës. Nëse është e nevojshme, metoda duhet të kthejë EVAL_BODY_BUFFERED. Përndryshe, duhet të kthehet SKIP_BODY.

Përveç dy të mëparshmeve, teknologjia JSP ofron një thirrje në metodën e lëshimit në mënyrë që të lejojë klasën që mbështet etiketën e personalizuar të lëshojë burimet e alokuara për të, si dhe të kryejë të tjera veprimet e nevojshme të kthehet në gjendjen e tij origjinale.

Teknologjia ofron dy metoda drejtpërdrejt për të hyrë në përmbajtjen e një etikete të personalizuar: getString dhe getReader.

Atributet në etiketat e personalizuara

Përveç informacionit midis etiketave hapëse dhe mbyllëse, një etiketë e personalizuar mund të ketë disa atribute që mund të ndikojnë gjithashtu në rendin në të cilin përpunohet kërkesa e klientit. Për secilin prej këtyre atributeve në klasën që zbaton etiketën e personalizuar, duhet të specifikohet atributi përkatës, si dhe dy merrni metodë dhe të vendosur. Për shembull, nëse etiketa e personalizuar duket si

atëherë klasa që zbaton këtë etiketë të personalizuar duhet të përmbajë kodin e mëposhtëm:

nga

Mire keq

Artikujt kryesorë të lidhur