Programiranje

Strežniška Java: Skupna uporaba XML in JSP

Za namen tega članka predvidevam, da veste, kaj sta JavaServer Pages (JSP) in Extensible Markup Language (XML), vendar vam je morda nekoliko nejasno, kako jih lahko uporabljate. Uporaba JSP je precej enostavna za obrambo. Omogoča vam oblikovanje spletnega mesta, zgrajenega iz datotek, ki izgledajo in delujejo podobno kot HTML. Edina razlika je v tem, da JSP delujejo tudi dinamično - na primer lahko obdelujejo obrazce ali berejo zbirke podatkov - z uporabo Jave kot strežniškega skriptnega jezika. Uporabo XML je težje utemeljiti. Čeprav se zdi, kot da ga podpira vsak nov izdelek, se zdi, da vsak uporablja XML za drugačen namen.

V tem članku se boste naučili oblikovati sistem z uporabo XML na dokaj skromen način. Številna spletna mesta imajo obsežne zbirke podatkov, ki so prikazani na bolj ali manj standarden način. Oblikoval bom sistem, ki uporablja datoteke XML za shranjevanje podatkov na spletnem strežniku in datoteke JSP za prikaz teh podatkov.

XML v primerjavi z relacijskimi bazami podatkov

"Toda počakajte," boste morda vprašali, "za shranjevanje podatkov uporabljate XML? Zakaj ne bi uporabili baze podatkov?" Dobro vprašanje. Odgovor je, da je baza podatkov za več namenov pretirana. Če želite uporabiti bazo podatkov, morate namestiti in podpirati ločen strežniški postopek, ki pogosto zahteva tudi namestitev in podporo skrbnika baze podatkov. Morate se naučiti SQL in napisati poizvedbe SQL, ki pretvorijo podatke iz relacijske v objektno strukturo in nazaj. Če podatke shranite kot datoteke XML, izgubite dodatne stroške dodatnega strežnika. Dobite tudi enostaven način urejanja podatkov: samo uporabite urejevalnik besedil in ne zapletenega orodja za zbirko podatkov. Datotek XML je tudi lažje varnostno kopirati, deliti s prijatelji ali prenesti svojim strankam. S pomočjo FTP lahko na svoje spletno mesto enostavno naložite tudi nove podatke.

Bolj abstraktna prednost XML je v tem, da se lahko kot hierarhični in ne kot relacijski format na veliko bolj neposreden način oblikuje podatkovne strukture, ki ustrezajo vašim potrebam. Ni vam treba uporabljati urejevalnika odnosov entitet niti normalizirati sheme. Če imate en element, ki vsebuje drug element, ga lahko predstavite neposredno v obliki, namesto da uporabite združevalno tabelo.

Upoštevajte, da za številne programe datotečni sistem ne bo zadostoval. Če imate veliko posodobitev, se lahko datotečni sistem zaradi hkratnega pisanja zmede ali poškoduje; zbirke podatkov običajno podpirajo transakcije, ki omogočajo hkratnost brez poškodb. Poleg tega je zbirka podatkov izvrstno orodje, če potrebujete zapletene poizvedbe, zlasti če se občasno spreminjajo. Baze podatkov gradijo indekse in so optimizirane za posodabljanje indeksov z nenehno spreminjajočim se naborom podatkov. Relacijske zbirke podatkov imajo tudi številne druge prednosti, vključno z bogatim poizvedbenim jezikom, orodji za zrelo avtorstvo in načrtovanje shem, dokazano razširljivost, natančen nadzor dostopa itd.

(Opomba: Za preprosto zaklepanje datotek lahko uporabite strežnik za transakcije revnega človeka. V Java pa lahko uporabite tudi orodje za iskanje in indeksiranje XML, vendar je to tema za drug članek.)

Tudi v tem primeru lahko, tako kot na večini spletnih mest, ki temeljijo na objavah, domnevamo naslednje: večina dostopa do podatkov je branje in ne zapisovanje; podatki, čeprav potencialno veliki, so razmeroma nespremenljivi; vam ne bo treba iskati zapletenih iskanj, če pa boste, boste uporabili ločen iskalnik. Prednosti uporabe zrelega RDBMS zbledijo, prednost uporabe objektno usmerjenega podatkovnega modela pa pride do izraza.

Nazadnje je povsem mogoče, da za svojo zbirko podatkov zagotovite ovoj, ki naredi poizvedbe SQL in jih prevede v tokove XML, tako da bi lahko imeli oboje. XML postane močnejša, programerju prijazna fronta zrele baze podatkov za shranjevanje in iskanje. (Primer te tehnike je Oracleov strežniški programček XSQL.)

Aplikacija: Spletni foto album

Vsi imajo radi fotografije! Ljudje radi prikazujejo slike sebe, prijateljev, hišnih ljubljenčkov in počitnic. Splet je najboljši medij za samozadovoljne zaklopke - lahko nagajajo svojim sorodnikom na tisoče kilometrov stran. Čeprav bi za polnopravno spletno mesto s foto albumi potreben zapleten objektni model, se bom osredotočil na določitev enega samega Slika predmet. (Izvorna koda za to aplikacijo je na voljo v virih.) Predmet, ki predstavlja sliko, potrebuje polja, ki predstavljajo njen naslov, datum, ko je bila posneta, neobvezen napis in očitno kazalec na vir slike.

Slika pa potrebuje nekaj lastnih polj: lokacijo izvorne datoteke (GIF ali JPEG) ter višino in širino v slikovnih pikah (za pomoč pri gradnji oznake). Tu je ena pomembna prednost uporabe datotečnega sistema kot baze podatkov: slikovne datoteke lahko shranite v isti imenik kot podatkovne datoteke.

Na koncu razširimo slikovni zapis z elementom, ki definira nabor sličic, za uporabo v kazalu ali drugje. Tu uporabljam isti koncept slike Sem že prej definiral.

XML predstavitev slike bi lahko izgledala nekako takole:

 Alex na plaži 08.08.1999. Zaman poskušam dobiti zagorelo alex-beach.jpg 340 200 alex-beach-sm.jpg 72 72 alex-beach-med.jpg 150 99 

Upoštevajte, da z uporabo XML vse podatke o posamezni sliki daste v eno datoteko, namesto da bi jih razpršili med tri ali štiri ločene tabele. Recimo temu a .pix datoteka - tako da bo vaš datotečni sistem morda videti tako:

 summer99 / alex-beach.pix summer99 / alex-beach.jpg summer99 / alex-beach-sm.jpg summer99 / alex-beach-med.jpg summer99 / alex-snorkeling.pix itd. 

Tehnike

Obstaja več načinov, kako mačko odstraniti z kože, in več kot en način za prenos podatkov XML na svojo stran JSP. Tu je seznam nekaterih teh načinov. (Ta seznam ni izčrpen; številni drugi izdelki in okviri bi bili enako primerni.)

  • DOM: Za razčlenitev in pregled datoteke XML lahko uporabite razrede, ki izvajajo vmesnik DOM
  • XMLEntryList: Z mojo kodo lahko XML naložite v datoteko java.util.List parov ime-vrednost
  • XPath: Za iskanje elementov v datoteki XML po imenu poti lahko uporabite procesor XPath (na primer Resin)
  • XSL: Za pretvorbo XML v HTML lahko uporabite procesor XSL
  • Cocoon: Lahko uporabite odprtokodni okvir Cocoon
  • Zvrni svoj fižol: Lahko napišete razred ovojnice, ki uporablja eno od drugih tehnik za nalaganje podatkov v JavaBean po meri

Upoštevajte, da bi bilo mogoče te tehnike enako dobro uporabiti za tok XML, ki ga prejmete iz drugega vira, na primer odjemalca ali strežnika aplikacij.

Strani JavaServer

Specifikacija JSP je imela številne inkarnacije in različni izdelki JSP izvajajo različne, nezdružljive različice specifikacije. Tomcat bom uporabil iz naslednjih razlogov:

  • Podpira najnovejše različice specifikacij JSP in strežniških programčkov
  • Podprla sta ga Sun in Apache
  • Zaženete ga lahko samostojno, ne da bi konfigurirali ločen spletni strežnik
  • Je odprtokodna

(Za več informacij o programu Tomcat glejte Viri.)

Vabimo vas, da uporabite kateri koli motor JSP, ki vam je všeč, vendar konfiguriranje je odvisno od vas! Prepričajte se, da motor podpira vsaj specifikacije JSP 1.0; veliko sprememb je bilo med 0,91 in 1,0. JSWDK (komplet za spletni razvoj Java Server) bo deloval v redu.

Struktura JSP

Pri izdelavi spletnega mesta, ki ga poganja JSP (znano tudi kot Webapp), Raje shranim skupne funkcije, uvoze, konstante in deklaracije spremenljivk v ločeno datoteko z imenom init.jsp, ki se nahaja v izvorni kodi tega članka.

Nato naložim to datoteko v vsako datoteko JSP z uporabo . The direktiva deluje kot jezik C. #include, povleče besedilo priložene datoteke (tukaj, init.jsp) in ga sestavil, kot da je del vključujoče datoteke (tukaj, picture.jsp). Nasprotno pa tag datoteko prevede kot ločeno datoteko JSP in ji vdela klic v sestavljeni JSP.

Iskanje datoteke

Ko se JSP zažene, mora najprej po inicializaciji poiskati želeno datoteko XML. Kako ve, katero od številnih datotek potrebujete? Odgovor je iz parametra CGI. Uporabnik bo poklical JSP z URL-jem picture.jsp? file = summer99 / alex-beach.pix (ali s podajanjem mapa v obliki HTML).

Ko pa JSP prejme parameter, ste še vedno na polovici poti. Še vedno morate vedeti, kje v datotečnem sistemu leži korenski imenik. Na primer, v sistemu Unix je lahko dejanska datoteka v imeniku /home/alex/public_html/pictures/summer99/alex-beach.pix. JSP med izvajanjem nimajo koncepta trenutnega imenika, zato morate podati absolutno ime poti java.io paket.

API strežniškega programčka ponuja metodo za pretvorbo poti URL-ja glede na trenutni JSP ali strežniški programček v absolutno pot datotečnega sistema. Metoda ServletContext.getRealPath (niz) naredi trik. Vsak JSP ima ServletContext predmet poklican aplikacijo, torej bi bila koda:

Niz slikovne datoteke = application.getRealPath ("/" + request.getParameter ("datoteka")); 

ali

Niz slikovne datoteke = getServletContext (). GetRealPath ("/" + request.getParameter ("datoteka")); 

ki deluje tudi znotraj servleta. (Dodati morate a / ker metoda pričakuje, da bodo posredovani rezultati request.getPathInfo ().)

Ena pomembna opomba: kadar koli dostopate do lokalnih virov, bodite zelo previdni pri preverjanju vhodnih podatkov. Heker ali nepreviden uporabnik lahko pošlje lažne podatke na vaše spletno mesto. Na primer, razmislite, kaj bi se zgodilo, če vrednost datoteka = .. / .. / .. / .. / itd / passwd so bili vneseni. Uporabnik bi lahko na ta način prebral datoteko z geslom vašega strežnika.

Objektni model dokumenta

DOM pomeni Predmetni model dokumenta. Je standardni API za brskanje po dokumentih XML, ki ga je razvil konzorcij za svetovni splet (W3C). Vmesniki so v paketu org.w3c.dom in so dokumentirani na spletnem mestu W3C (glej Viri).

Na voljo je veliko izvedb razčlenjevalnika DOM. Izbral sem IBM-ov XML4J, vendar lahko uporabite kateri koli razčlenjevalnik DOM. To je zato, ker je DOM nabor vmesnikov in ne razredov - in vsi razčlenjevalniki DOM morajo vrniti predmete, ki te vmesnike natančno izvajajo.

Žal ima DOM, čeprav je standarden, dve glavni napaki:

  1. API, čeprav objektno usmerjen, je dokaj okoren.
  2. Za razčlenjevalnik DOM ni standardnega API-ja, zato, medtem ko vsak razčlenjevalnik vrne a org.w3c.dom.Document objekt, način inicializacije razčlenjevalnika in nalaganja same datoteke je vedno odvisen od razčlenjevalnika.

Zgoraj opisana preprosta slikovna datoteka je v DOM-u predstavljena z več predmeti v drevesni strukturi.

Vozlišče dokumenta -> vozlišče elementa "slika" -> besedilno vozlišče "\ n" (presledki) -> vozlišče elementa "naslov" -> vozlišče besedila "Alex On The Beach" -> vozlišče elementa "datum" - -> ... itd. 

Za pridobitev vrednosti Alex na plaži morali bi opraviti več klicev metode, sprehajajoč se po drevesu DOM. Nadalje lahko razčlenjevalnik poseže po poljubnem številu presledkovnih besedilnih vozlišč, skozi katera bi morali zanko in ignorirati ali povezati (to lahko popravite tako, da pokličete normalizira () metoda). Razčlenjevalnik lahko vključuje tudi ločena vozlišča za entitete XML (na primer &), Vozlišča CDATA ali druga vozlišča elementov (na primer velik medved bi se spremenil v vsaj tri vozlišča, od katerih je eno a b element, ki vsebuje vozlišče besedila, ki vsebuje besedilo velik). V DOM-u ni metode, s katero bi preprosto rekli "pokliči mi besedilno vrednost naslovnega elementa." Skratka, hoja po DOM-u je nekoliko okorna. (Za alternativo DOM glejte razdelek XPath tega članka.)

Z višje perspektive je težava DOM-a v tem, da predmeti XML niso na voljo neposredno kot objekti Java, vendar jih je treba dostopati po delih prek API-ja DOM. Glej moj zaključek za razpravo o tehnologiji Java-XML Data Binding, ki uporablja ta pristop naravnost v Java za dostop do podatkov XML.

Napisal sem majhen pripomoček, imenovan DOMUtils, ki vsebuje statične metode za izvajanje pogostih nalog DOM. Na primer za pridobitev besedilne vsebine naslov podrejeni element korena (slika), bi napisali naslednjo kodo:

Dokument dokumenta = DOMUtils.xml4jParse (slikovna datoteka); Element nodeRoot = doc.getDocumentElement (); Vozlišče nodeTitle = DOMUtils.getChild (nodeRoot, "title"); Naslov niza = (nodeTitle == null)? null: DOMUtils.getTextValue (nodeTitle); 

Pridobivanje vrednosti za podelemente slike je enako enostavno:

Vozlišče nodeImage = DOMUtils.getChild (nodeRoot, "slika"); Vozlišče nodeSrc = DOMUtils.getChild (nodeImage, "src"); Niz src = DOMUtils.getTextValue (nodeSrc); 

In tako naprej.

Ko imate spremenljivke Java za vsak ustrezen element, morate le vdelati spremenljivke v oznako HTML s standardnimi oznakami JSP.

Za več podrobnosti glejte celotno izvorno kodo. Izhod HTML, ki ga ustvari datoteka JSP - posnetek zaslona HTML, če želite - je v slika-dom.html.

$config[zx-auto] not found$config[zx-overlay] not found