Ohjelmointi

Palvelinpuolen Java: XML: n ja JSP: n käyttö yhdessä

Oletan tämän artikkelin tarkoituksessa, että tiedät, mitä JavaServer Pages (JSP) ja Extensible Markup Language (XML) ovat, mutta saatat olla hieman epäselvä siitä, miten voit käyttää niitä. JSP-käyttöä on melko helppo puolustaa. Sen avulla voit suunnitella verkkosivuston, joka on rakennettu tiedostoista, jotka näyttävät ja toimivat paljon kuin HTML. Ainoa ero on, että myös JSP: t toimivat dynaamisesti - esimerkiksi ne voivat käsitellä lomakkeita tai lukea tietokantoja - käyttämällä Java-palvelinta palvelinpuolen komentosarjakielenä. XML-käyttöä on vaikea perustella. Vaikuttaa siltä, ​​että jokainen uusi tuote tukee sitä, mutta jokainen näyttää käyttävän XML: ää eri tarkoitukseen.

Tässä artikkelissa opit suunnittelemaan järjestelmän XML: ää käyttäen melko vaatimattomalla tavalla. Monilla verkkosivustoilla on laajat tietokokoelmat, jotka näytetään enemmän tai vähemmän tavanomaisella tavalla. Suunnittelen järjestelmän, joka käyttää XML-tiedostoja tietojen tallentamiseen Web-palvelimeen ja JSP-tiedostot näiden tietojen näyttämiseen.

XML vs. relaatiotietokannat

"Mutta odota", voit kysyä, "käytät XML-tiedostoa tietojen tallentamiseen? Miksi et käyttäisi tietokantaa?" Hyvä kysymys. Vastaus on, että moniin tarkoituksiin tietokanta on ylivoimainen. Tietokannan käyttämiseksi sinun on asennettava ja tuettava erillinen palvelinprosessi, joka usein edellyttää myös tietokannan järjestelmänvalvojan asentamista ja tukemista. Sinun on opittava SQL ja kirjoitettava SQL-kyselyt, jotka muuntavat tietoja relaatioista objektirakenteiksi ja takaisin. Jos tallennat tietoja XML-tiedostoina, menetät ylimääräisen palvelimen yleiskustannukset. Saat myös helpon tavan muokata tietojasi: käytä vain tekstieditoria monimutkaisen tietokantatyökalun sijaan. XML-tiedostoja on myös helpompi varmuuskopioida, jakaa ystävien kanssa tai ladata asiakkaillesi. Voit myös helposti ladata uusia tietoja sivustoosi FTP: n avulla.

XML: n abstraktimpi etu on, että koska se on pikemminkin hierarkkinen kuin relaatiomuoto, sitä voidaan käyttää paljon yksinkertaisemmalla tavalla tarpeidesi mukaisten tietorakenteiden suunnitteluun. Sinun ei tarvitse käyttää entiteettisuhteen muokkausohjelmaa eikä normalisoida malliasi. Jos sinulla on yksi elementti, joka sisältää toisen elementin, voit edustaa sitä suoraan muodossa liitostaulukon sijaan.

Huomaa, että monissa sovelluksissa tiedostojärjestelmä ei riitä. Jos sinulla on paljon päivityksiä, tiedostojärjestelmä voi sekoittua tai vioittua samanaikaisilla kirjoituksilla; tietokannat tukevat yleensä tapahtumia, jotka mahdollistavat samanaikaisuuden ilman korruptiota. Lisäksi tietokanta on erinomainen työkalu, jos haluat tehdä monimutkaisia ​​kyselyjä, varsinkin jos ne vaihtelevat ajoittain. Tietokannat rakentavat hakemistoja, ja ne on optimoitu pitämään indeksit ajan tasalla jatkuvasti muuttuvasta tietojoukosta. Relaatiotietokannoilla on myös monia muita etuja, kuten runsas kyselykieli, kypsä kirjoittaja ja skeeman suunnittelutyökalut, todistettu skaalautuvuus, hienorakeinen pääsynvalvonta ja niin edelleen.

(Huomaa: Voit käyttää yksinkertaista tiedostojen lukitusta köyhän miehen tapahtumapalvelimen tarjoamiseksi. Ja voit myös ottaa käyttöön XML-hakemisto- ja hakutyökalun Javalassa, mutta se on toisen artikkelin aihe.)

Tässä tapauksessa, kuten useimmissa pienikokoisissa ja keskisuurissa julkaisupohjaisissa verkkosivustoissa, voidaan olettaa seuraavaa: Suurin osa tiedonsiirrosta lukee, ei kirjoita; vaikka tiedot ovatkin mahdollisesti suuria, ne ovat suhteellisen muuttumattomia; sinun ei tarvitse tehdä monimutkaisia ​​hakuja, mutta jos et, käytä erillistä hakukonetta. Aikuisen RDBMS: n käytön edut haalistuvat, kun taas olio-tietomallin käytön edut tulevat esiin.

Lopuksi on täysin mahdollista tarjota tietokannallesi kääre, joka tekee SQL-kyselyitä ja kääntää ne XML-virtoiksi, joten sinulla voi olla molempiin suuntiin. XML: stä tulee vankempi, ohjelmoijaystävällisempi käyttöliittymä vanhalle tietokannalle tallennusta ja hakua varten. (Oraclen XSQL-palvelin on yksi esimerkki tästä tekniikasta.)

Sovellus: Online-valokuva-albumi

Kaikki rakastavat valokuvia! Ihmiset rakastavat näyttää kuvia itsestään, ystävistään, lemmikeistään ja lomastaan. Verkko on perimmäinen väline itsestään tyydyttäville laukaisijoille - ne voivat ärsyttää sukulaisiaan tuhansien mailien päästä. Vaikka täysimittainen valokuva-albumisivusto vaatisi monimutkaisen objektimallin, keskityn yhden määrittämiseen Kuva esine. (Tämän sovelluksen lähdekoodi on saatavana Resursseista.) Kuvaa edustava objekti tarvitsee kentät, jotka edustavat sen otsikkoa, ottamispäivämäärää, valinnaista kuvatekstiä ja tietenkin kuvan lähteen osoitinta.

Kuva puolestaan ​​tarvitsee muutaman oman kentän: lähdetiedoston sijainnin (GIF tai JPEG) sekä korkeuden ja leveyden pikseleinä (auttaakseen sinua rakentamaan tunnisteet). Tässä on yksi siisti etu tiedostojärjestelmän käytöstä tietokantana: voit tallentaa kuvatiedostot samaan hakemistoon kuin datatiedostot.

Laajennetaan lopuksi kuvatietue elementillä, joka määrittelee joukon pikkukuvia käytettäväksi sisällysluettelossa tai muualla. Tässä käytän samaa käsitettä kuva Määritin aiemmin.

Kuvan XML-esitys voi näyttää tältä:

 Alex rannalla 1999-08-08 Yritetään turhaan saada rusketus alex-beach.jpg 340200 alex-beach-sm.jpg 72 72 alex-beach-med.jpg 150 99 

Huomaa, että XML: n avulla laitat kaikki yhden kuvan tiedot yhteen tiedostoon sen sijaan, että hajartaisit sitä kolmen tai neljän erillisen taulukon kesken. Kutsutaan tätä a .pix tiedosto - joten tiedostojärjestelmäsi saattaa näyttää tältä:

 summer99 / alex-beach.pix summer99 / alex-beach.jpg summer99 / alex-beach-sm.jpg summer99 / alex-beach-med.jpg summer99 / alex-snorklausta .pix jne. 

Tekniikat

Kissan iho on useita tapoja, ja XML-tietoja voidaan tuoda JSP-sivullesi useammalla kuin yhdellä tavalla. Tässä on luettelo joistakin näistä tavoista. (Tämä luettelo ei ole tyhjentävä; monet muut tuotteet ja kehykset palvelisivat yhtä hyvin.)

  • DOM: Voit jäsentää ja tarkastaa XML-tiedoston DOM-käyttöliittymää käyttävillä luokilla
  • XMLEntryList: Voit käyttää koodia lataamaan XML-tiedoston a java.util.List nimi-arvo-parien
  • XPath: Voit etsiä elementtejä XML-tiedostosta polun nimen mukaan XPath-prosessorin (kuten Resin) avulla
  • XSL: Voit muuttaa XML: n HTML-muotoon XSL-prosessorin avulla
  • Koteloida: Voit käyttää avoimen lähdekoodin Cocoon-kehystä
  • Roll oma papu: Voit kirjoittaa käärintäluokan, joka käyttää jotain muuta tekniikkaa tietojen lataamiseksi mukautettuun JavaBean-tiedostoon

Huomaa, että näitä tekniikoita voidaan soveltaa yhtä hyvin toisesta lähteestä, kuten asiakkaalta tai sovelluspalvelimelta, vastaanotettuun XML-streamiin.

JavaServer-sivut

JSP-specillä on ollut monia inkarnaatioita, ja erilaiset JSP-tuotteet toteuttavat erilaisia, yhteensopimattomia versioita spesifikaatioista. Käytän Tomcatia seuraavista syistä:

  • Se tukee JSP: n ja servlet-määritysten ajantasaisimpia versioita
  • Sen ovat vahvistaneet Sun ja Apache
  • Voit suorittaa sen itsenäisesti määrittämättä erillistä Web-palvelinta
  • Se on avointa lähdekoodia

(Lisätietoja Tomcatista, katso Resurssit.)

Olet tervetullut käyttämään mitä tahansa JSP-moottoria, mutta pidät siitä! Varmista, että moottori tukee vähintään JSP 1.0 -ominaisuuksia; välillä oli paljon muutoksia välillä 0,91 - 1,0. JSWDK (Java Server Web Development Kit) toimii hienosti.

JSP-rakenne

Rakennettaessa JSP-pohjaista verkkosivustoa (tunnetaan myös nimellä Web-sovellus), Asetan mieluummin yhteiset toiminnot, tuonnit, vakiot ja muuttujailmoitukset erilliseen tiedostoon nimeltä init.jsp, joka sijaitsee tämän artikkelin lähdekoodissa.

Ladaan sitten tiedoston jokaiseen JSP-tiedostoon käyttämällä . direktiivi toimii kuin C-kieli #sisältää, vetämällä mukana olevan tiedoston teksti (tässä, init.jsp) ja kokoamalla se ikään kuin se olisi osa tiedostoa (tässä, kuva.jsp). Sen sijaan tag kokoaa tiedoston erillisenä JSP-tiedostona ja upottaa kutsun siihen käännettyyn JSP: hen.

Tiedoston löytäminen

Kun JSP käynnistyy, ensimmäinen asia, joka sen on tehtävä alustuksen jälkeen, on löytää haluamasi XML-tiedosto. Mistä se tietää, mitä monista tiedostoista tarvitset? Vastaus on CGI-parametrista. Käyttäjä kutsuu JSP: n URL-osoitteen kanssa picture.jsp? tiedosto = summer99 / alex-beach.pix (tai ohittamalla a tiedosto parametri HTML-lomakkeen kautta).

Kuitenkin, kun JSP vastaanottaa parametrin, olet silti vasta puolivälissä. Sinun on silti tiedettävä, missä juurihakemisto on tiedostojärjestelmässä. Esimerkiksi Unix-järjestelmässä varsinainen tiedosto voi olla hakemistossa /home/alex/public_html/pictures/summer99/alex-beach.pix. JSP: llä ei ole nykyisen hakemiston käsitettä suorituksen aikana, joten sinun on annettava absoluuttinen polunimi java.io paketti.

Servlet-sovellusliittymä tarjoaa menetelmän URL-polun muuttamiseksi nykyiseen JSP: hen tai Servlet-sovellukseen nähden absoluuttiseksi tiedostojärjestelmän poluksi. Menetelmä ServletContext.getRealPath (merkkijono) tekee temppu. Jokaisella JSP: llä on ServletKonteksti nimetty objekti sovellus, joten koodi olisi:

Merkkijono kuvatiedosto = application.getRealPath ("/" + request.getParameter ("tiedosto")); 

tai

Merkkijono picturefile = getServletContext (). GetRealPath ("/" + request.getParameter ("tiedosto")); 

joka toimii myös servletin sisällä. (Sinun on liitettävä a / koska menetelmä odottaa läpäisevän tulokset request.getPathInfo ().)

Yksi tärkeä huomautus: aina kun käytät paikallisia resursseja, ole varovainen saapuvien tietojen vahvistamiseksi. Hakkeri tai huolimaton käyttäjä voi lähettää väärennettyjä tietoja hakkeroidakseen sivustoasi. Mieti esimerkiksi, mitä tapahtuisi, jos arvo tiedosto = .. / .. / .. / .. / etc / passwd ilmoitettiin. Käyttäjä voi tällä tavalla lukea palvelimesi salasanatiedoston.

Asiakirjan objektimalli

DOM tarkoittaa Asiakirjan objektimalli. Se on standardi sovellusliittymä XML-asiakirjojen selaamiseen, jonka on kehittänyt World Wide Web Consortium (W3C). Liitännät ovat paketissa org.w3c.dom ja ne on dokumentoitu W3C-sivustolla (katso Resurssit).

Saatavilla on monia DOM-jäsennintoteutuksia. Olen valinnut IBM: n XML4J: n, mutta voit käyttää mitä tahansa DOM-jäsennintä. Tämä johtuu siitä, että DOM on joukko rajapintoja, ei luokkia - ja kaikkien DOM-jäsentäjien on palautettava objektit, jotka toteuttavat nämä rajapinnat uskollisesti.

Valitettavasti DOM: lla on vakiona vakiona kaksi suurta puutetta:

  1. API on objektiivinen, mutta melko hankala.
  2. DOM-jäsentimelle ei ole standardia API: ta, joten kun kukin jäsennin palauttaa a org.w3c.dom.Document objektin, keino jäsentää jäsennin ja ladata tiedosto itse on aina jäsenninkohtainen.

Edellä kuvattua yksinkertaista kuvatiedostoa edustaa DOM: ssä useita puurakenteen objekteja.

Asiakirjan solmu -> elementtisolmu "kuva" -> tekstisolmu "\ n" (välilyönti) -> elementtisolmu "otsikko" -> tekstisolmu "Alex rannalla" -> elementtisolmu "päivämäärä" - -> ... jne. 

Arvon hankkimiseksi Alex rannalla joudut soittamaan useita menetelmäpuheluja kävelemällä DOM-puuta. Lisäksi jäsentäjä voi päättää viipaloida minkä tahansa määrän välilyöntejä tekstisolmuja, joiden läpi sinun on silmukoitava ja joko jätettävä huomiotta tai ketjutettava (voit korjata tämän soittamalla normalisoi () menetelmä). Jäsennys voi sisältää myös erillisiä solmuja XML-entiteeteille (kuten &), CDATA-solmut tai muut elementtisolmut (esimerkiksi iso karhu muuttuisi vähintään kolmeksi solmuksi, joista yksi on b elementti, joka sisältää tekstisolmun, joka sisältää tekstin iso). DOM: ssa ei ole menetelmää sanoa "hanki minulle otsikkoelementin teksti-arvo". Lyhyesti sanottuna DOM: n kävely on hieman hankalaa. (Katso tämän artikkelin XPath-osiosta vaihtoehto DOM: lle.)

DOM: n ongelmana on korkeammasta näkökulmasta se, että XML-objekteja ei ole saatavana suoraan Java-objekteina, mutta niihin on päästävä pala kerrallaan DOM-sovellusliittymän kautta. Katso johtopäätökseni Java-XML Data Binding -tekniikasta, joka käyttää tätä suoraan Java-lähestymistapaa XML-tietojen käyttämiseen.

Olen kirjoittanut pienen apuluokan nimeltä DOMKäyttäjät, joka sisältää staattisia menetelmiä yleisten DOM-tehtävien suorittamiseksi. Esimerkiksi hankkia tekstisisältö otsikko juuren lapsielementti (kuva) -elementti, kirjoitat seuraavan koodin:

Asiakirja doc = DOMUtils.xml4jParse (picturefile); Elementin solmuRoot = doc.getDocumentElement (); Solmu nodeTitle = DOMUtils.getChild (nodeRoot, "otsikko"); Merkkijonon nimi = (nodeTitle == null)? null: DOMUtils.getTextValue (nodeTitle); 

Kuva-alaelementtien arvojen saaminen on yhtä suoraviivaista:

Solmu nodeImage = DOMUtils.getChild (nodeRoot, "kuva"); Solmu nodeSrc = DOMUtils.getChild (nodeImage, "src"); Merkkijono src = DOMUtils.getTextValue (nodeSrc); 

Ja niin edelleen.

Kun sinulla on Java-muuttujat jokaiselle asiaankuuluvalle elementille, sinun tarvitsee vain upottaa muuttujat HTML-merkintöihisi käyttämällä tavallisia JSP-tunnisteita.

Katso lisätietoja lähdekoodista. JSP-tiedoston tuottama HTML-lähtö - HTML-kuvakaappaus, jos haluat - on picture-dom.html.

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