Programování

Java na straně serveru: Společné používání XML a JSP

Pro účely tohoto článku budu předpokládat, že víte, co jsou JavaServer Pages (JSP) a Extensible Markup Language (XML), ale může vám být trochu nejasné, jak je můžete použít. Použití JSP je docela snadné bránit. Umožňuje vám navrhnout web vytvořený ze souborů, které vypadají a fungují podobně jako HTML. Jediným rozdílem je, že soubory JSP také jednají dynamicky - například mohou zpracovávat formuláře nebo číst databáze - pomocí jazyka Java jako skriptovacího jazyka na straně serveru. Použití XML je obtížnější ospravedlnit. I když to vypadá, jako by to podporoval každý nový produkt, zdá se, že každý používá XML pro jiný účel.

V tomto článku se naučíte navrhovat systém pomocí XML poměrně skromným způsobem. Mnoho webů má rozsáhlou sbírku dat, která se zobrazují víceméně standardním způsobem. Navrhnu systém, který používá soubory XML k ukládání dat na webovém serveru a soubory JSP k zobrazení těchto dat.

XML versus relační databáze

„Ale počkejte,“ zeptáte se, „používáte XML k ukládání dat? Proč nepoužívat databázi?“ Dobrá otázka. Odpověď je, že z mnoha důvodů je databáze přehnaná. Chcete-li použít databázi, musíte nainstalovat a podporovat samostatný proces serveru, který často také vyžaduje instalaci a podporu správce databáze. Musíte se naučit SQL a psát dotazy SQL, které převádějí data z relační struktury objektu a zpět. Pokud uložíte svá data jako soubory XML, přijdete o režii dalšího serveru. Získáte také snadný způsob úpravy dat: použijte spíše textový editor než komplikovaný databázový nástroj. Soubory XML lze také snadněji zálohovat, sdílet se svými přáteli nebo stahovat do svých klientů. Můžete také snadno nahrát nová data na svůj web pomocí FTP.

Abstraktnější výhodou XML je, že je hierarchický a nikoli relační formát a lze jej použít mnohem přímočařejším způsobem k navrhování datových struktur, které vyhovují vašim potřebám. Není nutné používat editor vztahů s entitami ani normalizovat vaše schéma. Pokud máte jeden prvek, který obsahuje jiný prvek, můžete jej reprezentovat přímo ve formátu, nikoli pomocí tabulky spojení.

Všimněte si, že pro mnoho aplikací nebude souborový systém stačit. Pokud máte velké množství aktualizací, může dojít k záměně nebo poškození souborového systému současným zápisem; databáze obvykle podporují transakce, které umožňují souběžnost bez poškození. Dále je databáze vynikajícím nástrojem, pokud potřebujete zadávat komplikované dotazy, zejména pokud se čas od času budou lišit. Databáze vytvářejí indexy a jsou optimalizovány pro udržování indexů v aktuálním stavu s neustále se měnící sadou dat. Relační databáze mají také mnoho dalších výhod, včetně bohatého dotazovacího jazyka, vyspělých nástrojů pro vytváření a návrh schémat, ověřené škálovatelnosti, podrobného řízení přístupu atd.

(Poznámka: K zajištění transakčního serveru chudáka můžete použít jednoduché zamykání souborů. A můžete také implementovat nástroj XML pro indexování a vyhledávání v Javě, ale to je téma pro další článek.)

V tomto případě, stejně jako u většiny nízkých až středních objemů webových stránek založených na publikování, můžete předpokládat následující: většina přístupu k datům je čtení, nikoli zápisy; data, i když jsou potenciálně velká, se relativně nemění; nebudete muset provádět komplikovaná vyhledávání, ale pokud tak učiníte, použijete samostatný vyhledávač. Výhody použití zralého RDBMS slábnou, zatímco výhody používání objektově orientovaného datového modelu přicházejí do popředí.

Nakonec je zcela možné poskytnout obálku pro vaši databázi, která provádí dotazy SQL a překládá je do streamů XML, takže je můžete mít oběma způsoby. XML se stává robustnějším a programovatelnějším rozhraním vyspělé databáze pro ukládání a vyhledávání. (Jedním z příkladů této techniky je servlet Oracle XSQL.)

Aplikace: Online fotoalbum

Všichni milují fotografie! Lidé rádi ukazují fotografie sebe, svých přátel, svých mazlíčků a svých prázdnin. Web je dokonalým prostředkem pro požitkáře - mohou otravovat své příbuzné z tisíců kilometrů daleko. Zatímco plnohodnotný web fotoalba by vyžadoval komplikovaný objektový model, zaměřím se na definici jediného Obrázek objekt. (Zdrojový kód této aplikace je k dispozici v prostředcích.) Objekt představující obrázek potřebuje pole představující jeho název, datum pořízení, volitelný titulek a samozřejmě ukazatel na zdroj obrázku.

Obrázek zase potřebuje několik vlastních polí: umístění zdrojového souboru (GIF nebo JPEG) a výšku a šířku v pixelech (aby vám pomohl při vytváření značky). Zde je jedna výhoda použití souborového systému jako databáze: obrazové soubory můžete ukládat do stejného adresáře jako datové soubory.

Nakonec rozšíříme obrazový záznam o prvek definující sadu miniatur pro použití v obsahu nebo jinde. Zde používám stejný koncept obraz Definoval jsem dříve.

XML reprezentace obrázku může vypadat asi takto:

 Alex On The Beach 08. 08. 1999 se marně snaží opálit alex-beach.jpg 340 200 alex-beach-sm.jpg 72 72 alex-beach-med.jpg 150 99 

Všimněte si, že pomocí XML umístíte všechny informace o jediném obrázku do jednoho souboru, místo aby jej rozptýlil mezi tři nebo čtyři samostatné tabulky. Říkejme tomu a .pix file - takže váš souborový systém může vypadat takto:

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

Techniky

Existuje více než jeden způsob, jak skinovat kočku, a existuje více než jeden způsob, jak přenést data XML na vaši stránku JSP. Zde je seznam některých z těchto způsobů. (Tento seznam není vyčerpávající; stejně dobře by posloužilo mnoho dalších produktů a rámců.)

  • DOM: K analýze a kontrole souboru XML můžete použít třídy implementující rozhraní DOM
  • XMLEntryList: Můj kód můžete použít k načtení XML do a java.util.List párů název-hodnota
  • XPath: K vyhledání prvků v souboru XML podle názvu cesty můžete použít procesor XPath (například Pryskyřice)
  • XSL: K transformaci XML do HTML můžete použít procesor XSL
  • Kokon: Můžete použít open source Cocoon framework
  • Roll vlastní fazole: Můžete napsat obálkovou třídu, která používá jednu z dalších technik k načtení dat do vlastního prostředí JavaBean

Všimněte si, že tyto techniky lze použít stejně dobře na stream XML, který obdržíte z jiného zdroje, například z klienta nebo aplikačního serveru.

Stránky JavaServeru

Specifikace JSP má mnoho inkarnací a různé produkty JSP implementují různé nekompatibilní verze spec. Tomcat použiji z následujících důvodů:

  • Podporuje nejaktuálnější verze specifikací JSP a servletu
  • Je schválen Sunem a Apache
  • Můžete jej spustit samostatně bez konfigurace samostatného webového serveru
  • Je to otevřený zdroj

(Další informace o službě Tomcat naleznete v části Zdroje.)

Můžete použít jakýkoli motor JSP, který se vám líbí, ale jeho konfigurace je na vás! Ujistěte se, že motor podporuje alespoň specifikaci JSP 1.0; mezi 0,91 a 1,0 došlo k mnoha změnám. JSWDK (Java Server Web Development Kit) bude fungovat dobře.

Struktura JSP

Při vytváření webových stránek založených na JSP (také známých jako Webapp), Raději vložím běžné funkce, importy, konstanty a deklarace proměnných do samostatného souboru s názvem init.jsp, který se nachází ve zdrojovém kódu tohoto článku.

Tento soubor pak načtím do každého souboru JSP pomocí . The směrnice funguje jako jazyk C. #zahrnout, vtažením textu přiloženého souboru (zde, init.jsp) a kompilace, jako by byla součástí souboru včetně (zde, picture.jsp). Naproti tomu tag zkompiluje soubor jako samostatný soubor JSP a vloží jej do kompilovaného JSP.

Nalezení souboru

Po spuštění JSP je po inicializaci první věcí, kterou musíte udělat, najít požadovaný soubor XML. Jak zjistí, který z mnoha souborů potřebujete? Odpověď je z parametru CGI. Uživatel vyvolá JSP pomocí adresy URL picture.jsp? file = summer99 / alex-beach.pix (nebo předáním a soubor prostřednictvím formuláře HTML).

Když však JSP obdrží parametr, jste stále jen v polovině cesty. Stále musíte vědět, kde na souborovém systému leží kořenový adresář. Například v systému Unix může být skutečný soubor v adresáři /home/alex/public_html/pictures/summer99/alex-beach.pix. Soubory JSP nemají během provádění koncept aktuálního adresáře, takže k němu musíte zadat absolutní cestu java.io balík.

Servlet API poskytuje metodu pro přeměnu cesty URL vzhledem k aktuálnímu JSP nebo Servletu na cestu absolutního souborového systému. Metoda ServletContext.getRealPath (řetězec) dělá trik. Každý JSP má ServletContext volal objekt aplikace, takže kód bude:

Řetězec picturefile = application.getRealPath ("/" + request.getParameter ("soubor")); 

nebo

Řetězec picturefile = getServletContext (). GetRealPath ("/" + request.getParameter ("soubor")); 

který také funguje uvnitř servletu. (Musíte přidat a / protože metoda očekává, že budou předány výsledky request.getPathInfo ().)

Jedna důležitá poznámka: při každém přístupu k místním zdrojům buďte velmi opatrní, abyste ověřili příchozí data. Hacker nebo neopatrný uživatel může zasílat falešná data, aby hackl váš web. Zvažte například, co by se stalo, kdyby hodnota file = .. / .. / .. / .. / etc / passwd byly zadány. Uživatel by tímto způsobem mohl přečíst soubor s hesly na vašem serveru.

Objektový model dokumentu

DOM znamená Model objektu dokumentu. Jedná se o standardní API pro procházení dokumentů XML, vyvinuté konsorciem World Wide Web Consortium (W3C). Rozhraní jsou v balíčku org.w3c.dom a jsou dokumentovány na webu W3C (viz Zdroje).

Existuje mnoho implementací analyzátoru DOM. Vybral jsem XML4J od IBM, ale můžete použít jakýkoli analyzátor DOM. Je to proto, že DOM je sada rozhraní, nikoli tříd - a všechny analyzátory DOM musí vrátit objekty, které věrně implementují tato rozhraní.

Bohužel, i když standardně, má DOM dvě hlavní chyby:

  1. API, i když je objektově orientované, je poměrně těžkopádné.
  2. Pro analyzátor DOM neexistuje žádné standardní API, takže zatímco každý analyzátor vrací a org.w3c.dom.Document objekt, prostředky inicializace analyzátoru a načtení samotného souboru jsou vždy specifické pro analyzátor.

Výše popsaný jednoduchý obrázkový soubor je v DOMu reprezentován několika objekty ve stromové struktuře.

Uzel dokumentu -> Obrázek uzlu prvku -> Textový uzel "\ n" (prázdné znaky) -> Uzel prvku "název" -> Uzel textu "Alex On The Beach" -> Uzel prvku "datum" - -> ... atd. 

Získat hodnotu Alex na pláži budete muset provést několik volání metod procházením stromu DOM. Analyzátor se dále může rozhodnout proložit libovolný počet mezer mezi textovými uzly, kterými byste se museli smyčkovat a buď ignorovat, nebo zřetězit (můžete to opravit voláním normalizovat() metoda). Analyzátor může také obsahovat samostatné uzly pro entity XML (jako &), Uzly CDATA nebo jiné uzly prvků (například the velký medvěd by se změnilo na nejméně tři uzly, z nichž jeden je a b prvek obsahující textový uzel obsahující text velký). V DOM neexistuje žádná metoda, jak jednoduše říci „získejte textovou hodnotu elementu title“. Stručně řečeno, chodit po DOM je trochu těžkopádné. (Alternativu k DOM najdete v tomto článku v části XPath.)

Z vyšší perspektivy problém s DOM spočívá v tom, že objekty XML nejsou k dispozici přímo jako objekty Java, ale je nutné k nim přistupovat po částech prostřednictvím rozhraní API DOM. Podívejte se na můj závěr k diskusi o technologii Java-XML Data Binding, která používá tento přímý přístup k Java pro přístup k datům XML.

Napsal jsem malou třídu nástrojů nazvanou DOMUtils, který obsahuje statické metody pro provádění běžných úloh DOM. Například k získání textového obsahu titul podřízený prvek kořene (obrázek) prvek, napsali byste následující kód:

Dokument doc = DOMUtils.xml4jParse (picturefile); Prvek nodeRoot = doc.getDocumentElement (); Uzel nodeTitle = DOMUtils.getChild (nodeRoot, "title"); Název řetězce = (nodeTitle == null)? null: DOMUtils.getTextValue (nodeTitle); 

Získání hodnot pro dílčí prvky obrazu je stejně jednoduché:

Uzel nodeImage = DOMUtils.getChild (nodeRoot, "obrázek"); Uzel nodeSrc = DOMUtils.getChild (nodeImage, "src"); Řetězec src = DOMUtils.getTextValue (nodeSrc); 

A tak dále.

Jakmile máte proměnné jazyka Java pro každý relevantní prvek, musíte pouze vložit proměnné do značek HTML pomocí standardních značek JSP.

Další podrobnosti najdete v úplném zdrojovém kódu. Výstup HTML vytvořený souborem JSP - pokud chcete - snímek obrazovky HTML - je uvnitř picture-dom.html.