Programovanie

Java na strane servera: spoločné používanie XML a JSP

Na účely tohto článku predpokladám, že viete, čo sú JavaServer Pages (JSP) a Extensible Markup Language (XML), ale môže vám byť trochu nejasné, ako ich môžete použiť. Použitie JSP je celkom ľahké obhájiť. Umožňuje vám navrhnúť webovú stránku zostavenú zo súborov, ktoré vyzerajú a fungujú podobne ako HTML. Jediný rozdiel je v tom, že súbory JSP tiež fungujú dynamicky - napríklad môžu spracovávať formuláre alebo čítať databázy - pomocou jazyka Java ako skriptovacieho jazyka na strane servera. Ťažšie sa ospravedlňuje použitie XML. Aj keď sa zdá, že to podporuje každý nový produkt, zdá sa, že každý z nich používa XML na iný účel.

V tomto článku sa naučíte navrhovať systém pomocou XML pomerne skromným spôsobom. Mnoho webových stránok obsahuje rozsiahle zbierky údajov, ktoré sa zobrazujú viac-menej štandardným spôsobom. Navrhnem systém, ktorý používa súbory XML na ukladanie údajov na webovom serveri a súbory JSP na zobrazovanie týchto údajov.

XML verzus relačné databázy

„Ale počkajte,“ môžete sa opýtať, „na ukladanie údajov používate XML? Prečo nevyužiť databázu?“ Dobrá otázka. Odpoveď je, že z mnohých dôvodov je databáza prehnaná. Ak chcete používať databázu, musíte si nainštalovať a podporovať samostatný serverový proces, ktorý často vyžaduje aj inštaláciu a podporu správcu databázy. Musíte sa naučiť SQL a písať dotazy SQL, ktoré prevádzajú údaje z relačnej štruktúry objektu a späť. Ak svoje údaje uložíte ako súbory XML, stratíte réžiu ďalšieho servera. Získate tiež ľahký spôsob úpravy údajov: stačí použiť textový editor a nie zložitý databázový nástroj. Súbory XML je tiež jednoduchšie zálohovať, zdieľať s priateľmi alebo sťahovať do svojich klientov. Môžete tiež ľahko nahrať nové údaje na svoje stránky pomocou protokolu FTP.

Abstraktnejšou výhodou XML je to, že je hierarchickým a nie relačným formátom a dá sa použiť oveľa jednoduchším spôsobom na návrh dátových štruktúr, ktoré vyhovujú vašim potrebám. Nemusíte používať editor vzťahov medzi entitami ani normalizovať svoju schému. Ak máte jeden prvok, ktorý obsahuje ďalší prvok, môžete ho reprezentovať priamo vo formáte a nie pomocou tabuľky spojenia.

Upozorňujeme, že pre mnoho aplikácií nebude súborový systém stačiť. Ak máte veľké množstvo aktualizácií, súborový systém môže byť pri súčasnom zápise zmätený alebo poškodený; databázy zvyčajne podporujú transakcie, ktoré umožňujú súbežnosť bez poškodenia. Ďalej je databáza vynikajúcim nástrojom, ak potrebujete robiť komplikované dotazy, najmä ak sa budú občas líšiť. Databázy vytvárajú indexy a sú optimalizované tak, aby udržiavali indexy aktuálne s neustále sa meniacou množinou údajov. Relačné databázy majú tiež mnoho ďalších výhod, medzi ktoré patrí bohatý dotazovací jazyk, vyspelé nástroje na tvorbu obsahu a návrh schém, osvedčená škálovateľnosť, podrobná kontrola prístupu atď.

(Poznámka: Na zaistenie transakčného servera chudobného človeka môžete použiť jednoduché uzamknutie súborov. A tiež môžete implementovať nástroj XML na indexovanie a vyhľadávanie v prostredí Java, ale to je téma pre ďalší článok.)

V tomto prípade, rovnako ako vo väčšine webových stránok založených na publikovaní, s nízkym až stredným objemom, môžete predpokladať nasledovné: väčšina prístupu k údajom je čítanie, nie zápis; údaje, aj keď sú potenciálne veľké, sa relatívne nemenia; nebudete musieť robiť zložité vyhľadávania, ale ak tak urobíte, použijete samostatný vyhľadávací nástroj. Výhody použitia vyspelého RDBMS miznú, zatiaľ čo do popredia sa dostávajú výhody použitia objektovo orientovaného dátového modelu.

Nakoniec je úplne možné poskytnúť pre vašu databázu obálku, ktorá umožňuje dotazy SQL a prevádza ich do tokov XML, aby ste ich mohli mať oboje. XML sa stáva robustnejším, programátorsky vhodnejším rozhraním pre vyspelú databázu na ukladanie a vyhľadávanie. (Jedným z príkladov tejto techniky je servlet Oracle XSQL.)

Aplikácia: Online fotoalbum

Všetci milujú fotografie! Ľudia radi ukazujú fotografie seba, svojich priateľov, svojich domácich miláčikov a ich dovoleniek. Web je ultimátnym médiom pre pôžitkárskych shutterbugov - môžu otravovať svojich príbuzných z tisícov kilometrov ďaleko. Aj keď by si plnohodnotný web s fotoalbummi vyžadoval komplikovaný objektový model, zameriam sa na definíciu singlu Obrázok objekt. (Zdrojový kód tejto aplikácie je k dispozícii v zdrojoch.) Objekt predstavujúci obrázok potrebuje polia predstavujúce jeho názov, dátum vytvorenia, voliteľný titulok a samozrejme ukazovateľ na zdroj obrázka.

Obrázok zase potrebuje niekoľko vlastných polí: umiestnenie zdrojového súboru (GIF alebo JPEG) a výška a šírka v pixeloch (ktoré vám pomôžu pri vytváraní značky). Tu je výhodou systému súborov ako vašej databázy jedna výhoda: obrazové súbory môžete ukladať do rovnakého adresára ako dátové súbory.

Na záver rozšírime obrazový záznam o prvok definujúci množinu miniatúr, ktoré sa dajú použiť v obsahu alebo inde. Tu používam rovnaký koncept obrázok Definoval som skôr.

XML reprezentácia obrázka môže vyzerať asi takto:

 Alex On The Beach 08. 08. 1999 sa márne snaží opáliť alex-beach.jpg 340 200 alex-beach-sm.jpg 72 72 alex-beach-med.jpg 150 99 

Upozorňujeme, že pomocou XML vložíte všetky informácie o jednom obrázku do jedného súboru namiesto toho, aby ste ich rozptýlili medzi tri alebo štyri samostatné tabuľky. Hovorme tomu a .pix súbor - aby váš súborový systém mohol vyzerať takto:

 summer99 / alex-beach.pix summer99 / alex-beach.jpg summer99 / alex-beach-sm.jpg summer99 / alex-beach-med.jpg summer99 / alex-snorkeling.pix atď. 

Techniky

Existuje viac ako jeden spôsob, ako skinovať mačku, a existuje viac ako jeden spôsob, ako preniesť údaje XML na vašu stránku JSP. Tu je zoznam niektorých z týchto spôsobov. (Tento zoznam nie je vyčerpávajúci; rovnako dobre by poslúžilo aj mnoho ďalších produktov a rámcov.)

  • DOM: Na analýzu a kontrolu súboru XML môžete použiť triedy implementujúce rozhranie DOM
  • XMLEntryList: Môj kód môžete použiť na načítanie XML do a java.util.List párov mien-hodnota
  • XPath: Na vyhľadanie prvkov v súbore XML podľa názvu cesty môžete použiť procesor XPath (napríklad Živica)
  • XSL: Na transformáciu XML do HTML môžete použiť procesor XSL
  • Kokon: Môžete použiť rámec Cocoon otvoreného zdroja
  • Rolovať si vlastnú fazuľu: Môžete napísať obálkovú triedu, ktorá používa jednu z ďalších techník na načítanie údajov do vlastného JavaBean

Upozorňujeme, že tieto techniky je možné rovnako dobre použiť na tok XML, ktorý prijímate z iného zdroja, napríklad z klienta alebo aplikačného servera.

Stránky JavaServera

Špecifikácia JSP má veľa inkarnácií a rôzne produkty JSP implementujú rôzne nekompatibilné verzie špecifikácie. Tomcat použijem z nasledujúcich dôvodov:

  • Podporuje najaktuálnejšie verzie špecifikácií JSP a servletu
  • Podporujú to spoločnosti Sun a Apache
  • Môžete ho spustiť samostatne bez konfigurácie samostatného webového servera
  • Je to otvorený zdroj

(Viac informácií o Tomcat nájdete v Zdrojoch.)

Môžete použiť akýkoľvek motor JSP, ktorý sa vám páči, ale jeho konfigurácia je na vás! Uistite sa, že motor podporuje aspoň špecifikáciu JSP 1.0; medzi 0,91 a 1,0 došlo k mnohým zmenám. JSWDK (Java Server Web Development Kit) bude fungovať v pohode.

Štruktúra JSP

Pri vytváraní webových stránok riadených JSP (tiež známych ako Webapp), Uprednostňujem vkladanie bežných funkcií, importov, konštánt a deklarácií premenných do samostatného súboru s názvom init.jsp, ktorý sa nachádza v zdrojovom kóde tohto článku.

Tento súbor potom načítam do každého súboru JSP pomocou . The smernica funguje ako jazyk C. #include, vtiahnutím textu zahrnutého súboru (tu, init.jsp) a skompilovať to, akoby to bolo súčasťou súboru vrátane (tu, obrázok.jsp). Naopak, Značka skompiluje súbor ako samostatný súbor JSP a vloží ho do kompilovaného JSP.

Nájdenie súboru

Keď sa spustí JSP, prvá vec, ktorú musíte po inicializácii urobiť, je nájsť požadovaný súbor XML. Ako zistí, ktorý z mnohých súborov potrebujete? Odpoveď je z parametra CGI. Užívateľ vyvolá JSP s URL picture.jsp? file = summer99 / alex-beach.pix (alebo prejdením a spis prostredníctvom formulára HTML).

Keď však JSP prijme parameter, ste stále iba v polovici cesty. Stále musíte vedieť, kde na súborovom systéme leží koreňový adresár. Napríklad v systéme Unix môže byť skutočný súbor v adresári /home/alex/public_html/pictures/summer99/alex-beach.pix. JSP nemajú počas vykonávania koncept aktuálneho adresára, takže musíte k serveru zadať absolútny názov cesty java.io balíček.

Servlet API poskytuje metódu na premenu cesty URL vo vzťahu k aktuálnemu JSP alebo Servletu na cestu absolútneho súborového systému. Metóda ServletContext.getRealPath (reťazec) robí trik. Každý JSP má a ServletContext objekt volal žiadosť, takže kód by bol:

Reťazec picturefile = application.getRealPath ("/" + request.getParameter ("súbor")); 

alebo

Reťazec picturefile = getServletContext (). GetRealPath ("/" + request.getParameter ("súbor")); 

ktorý funguje aj vo vnútri servletu. (Musíte pridať a / pretože metóda očakáva, že bude odovzdaná s výsledkami request.getPathInfo ().)

Jedna dôležitá poznámka: vždy, keď pristupujete k miestnym zdrojom, buďte veľmi opatrní, aby ste overili prichádzajúce údaje. Hacker alebo neopatrný používateľ môže posielať falošné údaje, aby napadol vaše stránky. Zvážte napríklad, čo by sa stalo, keby bola hodnota súbor = .. / .. / .. / .. / etc / passwd boli zadané. Užívateľ by týmto spôsobom mohol prečítať súbor s heslom vášho servera.

Objektový model dokumentu

DOM je skratka pre Objektový model dokumentu. Jedná sa o štandardné API na prezeranie dokumentov XML, vyvinuté World Wide Web Consortium (W3C). Rozhrania sú v balíku org.w3c.dom a sú zdokumentované na webe W3C (pozri Zdroje).

Existuje veľa implementácií syntaktického analyzátora DOM. Vybral som si XML4J od IBM, ale môžete použiť akýkoľvek analyzátor DOM. Je to preto, že DOM je množina rozhraní, nie tried - a všetky analyzátory DOM musia vracať objekty, ktoré verne implementujú tieto rozhrania.

DOM má, bohužiaľ, štandardné dve hlavné chyby:

  1. Aj keď je API objektovo orientované, je dosť ťažkopádne.
  2. Pre analyzátor DOM neexistuje žiadne štandardné API, takže zatiaľ čo každý syntaktický analyzátor vracia a org.w3c.dom.Doklad objekt, prostriedok na inicializáciu syntaktického analyzátora a načítanie samotného súboru je vždy špecifický pre syntaktický analyzátor.

Jednoduchý obrazový súbor opísaný vyššie je v DOM zastúpený niekoľkými objektmi v stromovej štruktúre.

Uzol dokumentu -> obrázok uzla prvku -> textový uzol "\ n" (medzery) -> uzol prvku "nadpis" -> textový uzol "Alex na pláži" -> uzol prvku "dátum" - -> ... atď. 

Na získanie hodnoty Alex na pláži museli by ste uskutočniť niekoľko hovorov metódou a prejsť stromom DOM. Ďalej sa môže syntaktický analyzátor rozhodnúť preložiť ľubovoľný počet textových uzlov medzier, cez ktoré by ste sa museli opakovať a ignorovať alebo spájať (môžete to napraviť zavolaním normalizovať () metóda). Analyzátor môže tiež obsahovať samostatné uzly pre entity XML (ako &), Uzly CDATA alebo iné uzly prvkov (napríklad the veľký medveď by sa zmenil na najmenej tri uzly, z ktorých jeden je a b prvok obsahujúci textový uzol obsahujúci text veľký). V DOM neexistuje žiadna metóda, ktorá by hovorila „získajte textovú hodnotu prvku title“. Kráčanie DOMom je skrátka trochu ťažkopádne. (Alternatívu k modelu DOM nájdete v tomto článku v časti XPath.)

Z vyššej perspektívy problém s DOM spočíva v tom, že objekty XML nie sú k dispozícii priamo ako objekty Java, ale je potrebné k nim pristupovať po častiach prostredníctvom rozhrania DOM API. V mojom závere sa dozviem diskusiu o technológii Java-XML Data Binding, ktorá na prístup k údajom XML využíva tento priamy prístup k jazyku Java.

Napísal som malú úžitkovú triedu, tzv DOMUtils, ktorý obsahuje statické metódy na vykonávanie bežných úloh DOM. Napríklad na získanie textového obsahu súboru titul detský prvok koreňa (obrázok), napíšete nasledujúci kód:

Dokument doc = DOMUtils.xml4jParse (obrázkový súbor); Element nodeRoot = doc.getDocumentElement (); Uzol nodeTitle = DOMUtils.getChild (nodeRoot, "title"); Názov reťazca = (nodeTitle == null)? null: DOMUtils.getTextValue (nodeTitle); 

Získanie hodnôt pre čiastkové prvky obrázka je rovnako jednoduché:

Uzol nodeImage = DOMUtils.getChild (nodeRoot, "obrázok"); Uzol nodeSrc = DOMUtils.getChild (nodeImage, "src"); Reťazec src = DOMUtils.getTextValue (nodeSrc); 

A tak ďalej.

Keď máte premenné Java pre každý relevantný prvok, musíte ich vložiť do svojich značiek HTML pomocou štandardných značiek JSP.

Ďalšie informácie nájdete v úplnom zdrojovom kóde. Výstup HTML vyprodukovaný súborom JSP - screenshot HTML, ak chcete - je v obrázok-dom.html.

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