Programavimas

Serverio pusė „Java“: XML ir JSP naudojimas kartu

Šiame straipsnyje manysiu, kad žinote, kas yra „JavaServer Pages“ (JSP) ir „Extensible Markup Language“ (XML), tačiau jums gali būti šiek tiek neaišku, kaip juos naudoti. JSP naudojimą yra gana lengva apginti. Tai leidžia jums sukurti svetainę, sukurtą iš failų, kurie atrodo ir veikia panašiai kaip HTML. Vienintelis skirtumas yra tas, kad JSP taip pat veikia dinamiškai - pavyzdžiui, jie gali apdoroti formas arba skaityti duomenų bazes - naudodami „Java“ kaip serverio pusės scenarijų kalbą. XML naudojimą pagrįsti yra sunkiau. Nors atrodo, kad kiekvienas naujas produktas jį palaiko, atrodo, kad kiekvienas naudoja XML skirtingiems tikslams.

Šiame straipsnyje išmoksite gana kukliai suprojektuoti sistemą naudojant XML. Daugelyje svetainių yra daugybė duomenų, kurie rodomi daugiau ar mažiau standartiškai. Suprojektuosiu sistemą, kuri naudoja XML failus duomenims saugoti žiniatinklio serveryje, o JSP failus - tiems duomenims rodyti.

XML ir reliacinės duomenų bazės

"Bet palaukite, - galite paklausti, - jūs naudojate XML duomenims saugoti? Kodėl gi nenaudojant duomenų bazės?" Geras klausimas. Atsakymas yra tas, kad daugeliu tikslų duomenų bazė yra per didelė. Norėdami naudoti duomenų bazę, turite įdiegti ir palaikyti atskirą serverio procesą, kuriam taip pat dažnai reikia įdiegti ir palaikyti duomenų bazės administratorių. Turite išmokti SQL ir rašyti SQL užklausas, kurios konvertuoja duomenis iš reliacinės į objekto struktūrą ir atgal. Jei saugote duomenis kaip XML failus, prarandate papildomo serverio pridėtines išlaidas. Jūs taip pat gaunate paprastą būdą redaguoti savo duomenis: tiesiog naudokite teksto rengyklę, o ne sudėtingą duomenų bazės įrankį. XML failus taip pat lengviau kurti atsargines kopijas, dalytis jais su draugais arba atsisiųsti savo klientams. Taip pat galite lengvai įkelti naujus duomenis į savo svetainę naudodami FTP.

Abstraktesnis XML pranašumas yra tas, kad jis yra hierarchinis, o ne reliacinis formatas, todėl jį galima naudoti daug tiesmukiau kuriant jūsų poreikius atitinkančias duomenų struktūras. Jums nereikia naudoti objekto santykių redaktoriaus ir normalizuoti schemos. Jei turite vieną elementą, kuriame yra kitas elementas, galite jį vaizduoti tiesiogiai formatu, o ne naudoti sujungimo lentelę.

Atkreipkite dėmesį, kad daugeliui programų failų sistemos nepakaks. Jei turite daug naujinių, failų sistema gali būti supainiota arba sugadinta tuo pačiu metu rašant; duomenų bazės paprastai palaiko operacijas, kurios leidžia sutapti be korupcijos. Be to, duomenų bazė yra puikus įrankis, jei reikia pateikti sudėtingas užklausas, ypač jei jos kartais skiriasi. Duomenų bazės kuria indeksus ir yra optimizuotos, kad indeksai būtų nuolat atnaujinami naudojant nuolat kintantį duomenų rinkinį. Reliacinės duomenų bazės taip pat turi daug kitų pranašumų, įskaitant turtingą užklausų kalbą, subrendusius autorių kūrimo ir schemų kūrimo įrankius, patikrintą mastelį, tikslią prieigos kontrolę ir pan.

(Pastaba: galite naudoti paprastą failų užrakinimą, kad gautumėte neturtingo žmogaus operacijų serverį. Taip pat galite įdiegti XML indekso ir paieškos įrankį „Java“, bet tai yra kito straipsnio tema.)

Tokiu atveju, kaip ir daugumoje mažo ir vidutinio apimties leidybinių svetainių, galima daryti prielaidą: didžioji prieiga prie duomenų yra skaitoma, o ne rašoma; duomenys, nors ir potencialiai dideli, palyginti nesikeičia; nereikės daryti sudėtingų paieškų, tačiau jei tai padarysite, naudosite atskirą paieškos variklį. Subrendusio RDBMS naudojimo pranašumai išnyksta, o objektyvaus duomenų modelio naudojimo pranašumas išryškėja.

Galiausiai, visiškai įmanoma pateikti duomenų bazės paketą, kuris teikia SQL užklausas ir jas paverčia XML srautais, taigi galėtumėte tai padaryti abiem būdais. XML tampa patikimesniu, programuotojams patogesniu subrendusia duomenų baze, skirta saugoti ir ieškoti. (Vienas iš šios technikos pavyzdžių yra „Oracle“ XSQL servletas.)

Programa: internetinis nuotraukų albumas

Nuotraukos patinka visiems! Žmonės mėgsta rodyti savo, savo draugų, savo augintinių ir atostogų nuotraukas. Žiniatinklis yra pati geriausia terpė, leidžianti įsileisti į užrakto klaidas - jie gali erzinti savo artimuosius iš tūkstančių mylių. Nors pilnavertei nuotraukų albumų svetainei reikalingas sudėtingas objekto modelis, aš sutelksiu dėmesį į singlo apibrėžimą Paveikslėlis objektas. (Šios programos šaltinio kodą galite rasti šaltiniuose.) Objektą, vaizduojantį paveikslėlį, reikia užpildyti laukais, nurodančiais jo pavadinimą, paėmimo datą, pasirenkamą antraštę ir, aišku, paveikslėlio šaltinio rodyklę.

Savo ruožtu vaizdui reikalingi keli laukai: šaltinio failo vieta (GIF arba JPEG) ir aukštis bei plotis pikseliais (kad būtų lengviau kurti) žymos). Čia yra vienas puikus pranašumas naudojant failų sistemą kaip duomenų bazę: vaizdo failus galite laikyti tame pačiame kataloge kaip ir duomenų failai.

Galiausiai išplėskime nuotraukų įrašą elementu, apibrėžiančiu miniatiūrų vaizdų rinkinį, skirtą naudoti turinio lentelėje ar kitur. Čia aš vartoju tą pačią sąvoką vaizdas Aš apibrėžiau anksčiau.

XML paveikslėlio atvaizdavimas gali atrodyti maždaug taip:

 Alexas paplūdimyje 1999-08-08 Neveltui bandau įgauti įdegį alex-beach.jpg 340 200 alex-beach-sm.jpg 72 72 alex-beach-med.jpg 150 99 

Atkreipkite dėmesį, kad naudodami XML, visą informaciją apie vieną paveikslėlį įdedate į vieną failą, o ne išsklaidote po tris ar keturias atskiras lenteles. Pavadinkime tai a .pix failas - taigi jūsų failų sistema gali atrodyti taip:

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

Technikos

Yra daugiau nei vienas būdas katę nulupti ir yra daugiau nei vienas būdas pateikti XML duomenis į jūsų JSP puslapį. Čia yra keletas iš šių būdų sąrašas. (Šis sąrašas nėra išsamus; daugelis kitų produktų ir sistemų būtų naudingi vienodai gerai.)

  • DOM: XML failui analizuoti ir tikrinti galite naudoti klases, įgyvendinančias DOM sąsają
  • XMLEntryList: Galite naudoti mano kodą įkelti XML į java.util.Sąrašas vardo ir vertės porų
  • XPath: Norėdami rasti elementus XML faile pagal kelio pavadinimą, galite naudoti XPath procesorių (pvz., „Resin“)
  • XSL: XML transformavimui į HTML galite naudoti XSL procesorių
  • Kokonas: Galite naudoti atvirojo kodo „Cocoon“ sistemą
  • Susuk savo pupelę: Galite parašyti pakavimo klasę, kuri naudoja vieną iš kitų metodų duomenims įkelti į pasirinktinį „JavaBean“

Atminkite, kad šiuos metodus galima vienodai gerai pritaikyti XML srautui, kurį gaunate iš kito šaltinio, pavyzdžiui, kliento ar programų serverio.

„JavaServer“ puslapiai

JSP spec turėjo daugybę įsikūnijimų, o skirtingi JSP produktai įgyvendina skirtingas, nesuderinamas spec versijas. „Tomcat“ naudosiu dėl šių priežasčių:

  • Jis palaiko naujausias JSP versijas ir servleto specifikacijas
  • Tai patvirtino Sun ir Apache
  • Galite paleisti atskirai, nekonfigūruodami atskiro žiniatinklio serverio
  • Tai atviras šaltinis

(Daugiau informacijos apie „Tomcat“ rasite šaltiniuose.)

Kviečiame naudoti bet kurį jums patinkantį JSP variklį, tačiau jo konfigūravimas priklauso tik nuo jūsų! Įsitikinkite, kad variklis palaiko bent JSP 1.0 specifikacijas; buvo daug pokyčių tarp 0,91 ir 1,0. JSWDK („Java Server Web Development Kit“) veiks puikiai.

JSP struktūra

Kuriant JSP valdomą svetainę (dar vadinamą a „Webapp“), Aš norėčiau įdėti bendras funkcijas, importą, konstantas ir kintamas deklaracijas į atskirą failą, vadinamą inic.jsp, esančiame šio straipsnio šaltinio kode.

Tada įkeliu tą failą į kiekvieną JSP failą naudodamas . direktyva veikia kaip C kalba # įtraukti, traukdami įtraukto failo tekstą (čia, inic.jsp) ir sudaryti jį taip, tarsi tai būtų įtraukimo failo dalis (čia, paveikslėlis.jsp). Priešingai, žyma kompiliuoja failą kaip atskirą JSP failą ir įdeda kvietimą jam į sukurtą JSP.

Failo radimas

Paleidus JSP, pirmas dalykas, kurį jis turi atlikti po inicializavimo, yra norimo XML failo radimas. Iš kur ji žino, kurio iš daugelio failų jums reikia? Atsakymas pateiktas iš CGI parametro. Vartotojas iškvies JSP su URL picture.jsp? file = summer99 / alex-beach.pix (arba praleidžiant a failą parametras per HTML formą).

Tačiau kai JSP gauna parametrą, jūs vis dar esate tik pusiaukelėje. Jūs vis tiek turite žinoti, kur failų sistemoje yra šakninis katalogas. Pavyzdžiui, „Unix“ sistemoje tikrasis failas gali būti kataloge /home/alex/public_html/pictures/summer99/alex-beach.pix. Vykdydami JSP neturi dabartinio katalogo koncepcijos, todėl turite nurodyti absoliutų kelio pavadinimą java.io pakuotė.

„Servlet“ API pateikia metodą, kaip URL kelią, palyginti su dabartiniu JSP arba „Servlet“, paversti absoliučiu failų sistemos keliu. Metodas „ServletContext.getRealPath“ (eilutė) daro triuką. Kiekvienas JSP turi „ServletContext“ vadinamas objektas taikymas, taigi kodas būtų:

String picturefile = application.getRealPath ("/" + request.getParameter ("failas")); 

arba

String picturefile = getServletContext (). GetRealPath ("/" + request.getParameter ("failas")); 

kuris taip pat veikia servleto viduje. (Privalote pridėti a / nes tikimasi, kad metodas bus perduotas request.getPathInfo ().)

Viena svarbi pastaba: kai tik prieinate prie vietinių išteklių, būkite labai atsargūs, kad patvirtintumėte gaunamus duomenis. Įsilaužėlis arba neatsargus vartotojas gali nusiųsti fiktyvius duomenis, kad nulaužtų jūsų svetainę. Pavyzdžiui, apsvarstykite, kas nutiktų, jei vertė failas = .. / .. / .. / .. / etc / passwd buvo įvesti. Tokiu būdu vartotojas galėjo perskaityti jūsų serverio slaptažodžio failą.

Dokumento objekto modelis

DOM reiškia Dokumento objekto modelis. Tai yra standartinė XML dokumentų naršymo API, kurią sukūrė „World Wide Web Consortium“ (W3C). Sąsajos yra pakuotėje org.w3c.dom ir yra dokumentuojami W3C svetainėje (žr. išteklius).

Yra daug DOM analizatoriaus diegimų. Aš pasirinkau IBM XML4J, bet galite naudoti bet kurį DOM analizatorių. Taip yra todėl, kad DOM yra sąsajų rinkinys, o ne klasės - ir visi DOM analizatoriai turi grąžinti objektus, kurie sąžiningai įgyvendina tas sąsajas.

Deja, nors standartinis, DOM turi du pagrindinius trūkumus:

  1. Nors API yra orientuota į objektą, ji yra gana sudėtinga.
  2. DOM analizatoriui nėra standartinės API, taigi, kol kiekvienas analizatorius pateikia a org.w3c.dom.Dokumentas Objektas, analizatoriaus inicijavimo ir paties failo įkėlimo būdas visada yra specifinis analizatoriui.

Pirmiau aprašytą paprastą paveikslėlio failą DOM vaizduoja keli objektai medžio struktūroje.

Dokumento mazgas -> elemento mazgas "paveikslėlis" -> teksto mazgas "\ n" (tarpai) -> elemento mazgas "pavadinimas" -> teksto mazgas "Alex On The Beach" -> elemento mazgas "data" - -> ... ir kt. 

Norėdami įgyti vertę Aleksas paplūdimyje jums tektų skambinti keliais metodais, einant DOM medžiu. Be to, analizatorius gali pasirinkti įterpti bet kokį tarpą tarp teksto mazgų, per kuriuos turėtumėte kilpti ir ignoruoti, arba susieti (galite tai ištaisyti paskambinę normalizuoti () metodas). Analizatorius taip pat gali apimti atskirus XML objektų mazgus (pvz., &), CDATA mazgai ar kiti elementų mazgai (pavyzdžiui, didelis turėti virstų bent trimis mazgais, iš kurių vienas yra a b elementas, kuriame yra teksto mazgas, kuriame yra tekstas didelis). DOM nėra metodo paprasčiausiai sakyti „gauti man pavadinimo elemento teksto vertę“. Trumpai tariant, vaikščioti DOM yra šiek tiek sudėtinga. (Norėdami rasti alternatyvą DOM, žr. Šio straipsnio skyrių „XPath“.)

Žiūrint iš aukštesnės perspektyvos, DOM problema yra ta, kad XML objektai nėra tiesiogiai prieinami kaip „Java“ objektai, tačiau juos reikia pasiekti po kelis per DOM API. Žr. Mano išvadą, aptartą „Java-XML Data Binding“ technologiją, kuri naudoja šį tiesiai į „Java“ metodą prieigai prie XML duomenų.

Parašiau mažą komunalinių paslaugų klasę, vadinamą DOMUtils, kuriame yra statiniai metodai įprastoms DOM užduotims atlikti. Pvz., Norint sužinoti teksto turinį pavadinimas šaknies vaikas (paveikslėlis) elementą, parašytumėte šį kodą:

Dokumentas doc = DOMUtils.xml4jParse (picturefile); Elemento mazgasRoot = doc.getDocumentElement (); Mazgas nodeTitle = DOMUtils.getChild (nodeRoot, "title"); Eilutės pavadinimas = (nodeTitle == null)? null: DOMUtils.getTextValue (nodeTitle); 

Vaizdo pogrupių vertes gauti taip pat paprasta:

Mazgas nodeImage = DOMUtils.getChild (nodeRoot, "vaizdas"); Mazgas nodeSrc = DOMUtils.getChild (nodeImage, "src"); String src = DOMUtils.getTextValue (nodeSrc); 

Ir taip toliau.

Kai turėsite „Java“ kintamuosius kiekvienam atitinkamam elementui, tereikia įterpti kintamuosius į HTML žymėjimą, naudojant standartines JSP žymas.

Norėdami gauti daugiau informacijos, žiūrėkite visą šaltinio kodą. JSP failo sukurta HTML išvestis - HTML ekrano kopija, jei norite, yra paveikslėlis-dom.html.

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