4.2 Server Pages

advertisement
Web Application Server
Prof. dr. Herwig Mannaert
1
2
3
Inleiding ......................................................................................................... 2
Interactiviteit .................................................................................................. 3
Cruciale problemen .......................................................................................... 3
3.1 Proces per Verzoek ..................................................................................... 3
3.2 Geen toestandsbeheer ................................................................................ 4
3.3 Geen software structuur .............................................................................. 4
3.3.1 Tussen logische lagen ............................................................................ 4
3.3.2 In de presentatielaag ............................................................................ 5
4 Standaard oplossingen ..................................................................................... 5
4.1 APIs - Servlets ........................................................................................... 5
4.2 Server Pages ............................................................................................. 5
4.3 Frameworks ............................................................................................... 6
5 Een totaaloplossing .......................................................................................... 6
5.1 De applicatielaag ........................................................................................ 6
5.2 De presentatielaag ..................................................................................... 7
1
1 Inleiding
De bekende Internet goeroe Simon Phipps stelt: “The web works because shared
standards make grow the value faster than the costs”. Phipps bedoelt hier dat de
doorbraak van het Internet niet gebaseerd is op een revolutionaire nieuwe technologie,
maar op de immense schaalvoordelen die zijn ontstaan door de wereldwijde verspreiding
van een aantal open standaarden. De verspreiding van het Internet en de hierop
gebaseerde standaarden betekent immers dat wanneer iemand hierop aansluit, hij of zij
onmiddellijk kan communiceren met iedereen die van deze gemeenschap deel uitmaakt.
En iedereen die op dit open platform is aangesloten kan op zijn beurt automatisch
communiceren met iemand die nieuw toetreedt.
Volgens Phipps moeten deze wereldwijde informatie- en communicatiestandaarden op
vijf verschillende vlakken beschouwd worden. Alleen de aanwezigheid van open
standaarden op al deze vlakken kan het success van een universeel
communicatieplatform garanderen. Deze vijf deelgebieden, schematisch voorgesteld in
figuur 1 met de overeenkomstige standaarden, zijn:
1. Netwerkprotocols:
computernetwerken
moeten
op
basis
van
een
gemeenschappelijk protocol communiceren, wat op het Internet TCP/IP
(Transport Control Protocol / Internet Protocol) is.
2. Gegevensformaten: gegevens moeten in een voor iedereen leesbaar formaat
worden uitgewisseld, wat op het Internet XML (eXtensible Markup Language) aan
het worden is.
3. Software objecten: software objecten of modules moeten vrij uitwisselbaar zijn en
met elkaar kunnen communiceren, wat in het algemeen wordt verzekerd door een
componentenmodel, of in het bijzonder volgens Phipps door de programmeertaal
Java.
4. Toegangsplatform: een universeel beschikbaar platform wat toegang geeft tot de
verschillende informatie- en communicatiediensten, wat op het Internet het
WWW (World Wide Web) is.
5. Beveiligingsdiensten: gegevens en communicatiesessies moeten op uiterst
betrouwbare wijze beveiligd kunnen worden op basis van uitwisselbare
beveiligingsinfrastructuren, die men PKI (Public Key Infrastructure) is gaan
noemen.
PKI
Web
Comp, Java
XML
TCP/IP
Figuur 1: Voorstelling van de Internet standaarden volgens Simon Phipps.
In deze bijdrage wordt de aard en problematiek van het toegangsplatform of World
Wide Web uiteengezet, met inbegrip van conceptuele problemen en oplossingen.
2
2 Interactiviteit
In de meest eenvoudige communicatie tussen een browser en webserver wordt door de
browser een bestand gevraagd, die vervolgens door de webserver wordt teruggestuurd.
Om dit bestand te identificeren wordt gebruik gemaakt van een URL (Universal Resource
Locator) die als volgt gestructureerd is:
http://www.cnn.com/2003/TECH/biztech/02/24/microsoft.htm
protocol
domein naam
naam folder
bestand
Vandaag is het echter de bedoeling om vanuit het web interactieve toegang te
verschaffen tot alle mogelijke applicaties, en alle mogelijke applicaties te koppelen aan
het web: het web geeft toegang tot alles, alles heeft toegang via het web. Hiervoor dient
de webserver uitgebreid te worden tot een zogenaamde Web Application Server: een
koppeling tussen het web en back-end of legacy applicaties.
Om te kunnen interageren met logica aan de server zijde, wordt in de URL de naam van
een programma opgegeven, waarna de verschillende parameters met hun naam en
waarde volgen. Deze parameters zijn van elkaar gescheiden door een & teken. Een
voorbeeld van een dusdanig gestructureerde URL is:
http://www.amazon.com/cgi-bin/view-basket&name=mannaert&first=herwig&...
protocol
domein
folder applicatie
parameters
De historische manier om op basis hiervan logica aan de server op te roepen wordt
Common Gateway Interface (CGI) genoemd. Hierbij start de webserver een applicatie op,
die in een willekeurige taal kan geschreven zijn, en geeft de string van parameters mee
aan dit programma. Dit programma kan in gelijk welke programmeertaal worden
geschreven, maar werd historisch veel in Perl ontwikkeld omdat deze taal zeer geschikt is
om de string met de parameterwaarden te ontrafelen. Als antwoord stuurde het
applicatieprogramma een nieuw HTML bestand door naar de browser. Hij doet dit door
deze HTML te schrijven of printen op de standaard uitvoer. Het bestand is doorgaans
zeer analoog aan dat HTML bestand waaruit de oproep ontstond, mits invulling van de
gevraagde resultaten.
3 Cruciale problemen
3.1 Proces per Verzoek
In een Common Gateway Interface (CGI) web applicatie, start de web server een nieuw
proces voor elk verzoek of request dat binnenkomt vanuit een web browser. Dit betekent
dat er een nieuw proces wordt opgestart voor elke interactie van elke gebruiker of surfer:
niet alleen wanneer hij een product koopt, maar ook wanneer hij naar de prijs
informeert, wanneer hij naar de status van zijn winkelwagentje of shopping cart kijkt,
enz. Dit is vanuit computationeel standpunt onaanvaardbaar en zelfs ronduit belachelijk
te noemen.
3
3.2 Geen toestandsbeheer
Aangezien er bij elk verzoek een nieuw proces wordt opgestart, wordt er uiteraard ook
geen informatie bijgehouden over de toestand van een bepaalde gebruiker. Er is met
andere woorden geen state management, om tijdens een sessie op een website relevante
gegevens bij te houden. Hier denken we bijvoorbeeld aan de persoonlijke gegevens van
een klant of gebruiker, de toestand van zijn winkelwagentje, het volgnummer van de
getoonde mails bij een webmail applicatie, enz.
3.3 Geen software structuur
De applicatie aan de server zijde dient een volledig nieuw HTML blad te genereren bij elk
verzoek. Vooreerst genereert dit een overhead aan te verzenden informatie. Aangezien
vandaag vrijwel alle informatie voorzien wordt van meta-informatie en het hier niet om
grote hoeveelheden extra gegevens gaat, is dit geen onoverkomelijk probleem. Het feit
echter dat de grafische HTML output wordt geschreven vanuit applicatielogica maakt deel
uit van een veel groter en fundamenteler probleem. Het leidt tot ongestructureerde en
bijgevolg onbeheersbare software.
3.3.1 Tussen logische lagen
Tijdens de ontwikkeling van grote pakketten applicatiesoftware zoals ERP (Enterprise
Resource Planning) is men gaan inzien dat er verschillende conceptuele diensten zijn in
software (Presentatie – Applicatie - Databank), en dat men deze diensten conceptueel
moet scheiden in verschillende lagen of tiers. Dit wordt schematisch weergegeven in de
volgende tekening.
Toegang
Presentatie
Applicatie
Databank
Als je dit model op het web toepast, dan worden de presentatiediensten in de webserver
uitgevoerd, en is de browser of thin client een universeel toegangsplatform:
Browser
Webserver
Applicatie
4
Databank
Dit betekent dat, indien we vanuit de browser op gestructureerde wijze toegang willen
verschaffen tot bedrijfsapplicaties, we de volgende 4-lagige architectuur moeten
beschouwen:
Toegang
Presentatie
Applicatie
Databank
In de historische CGI applicaties was er geen onderscheid tussen presentatie- en
applicatielaag.
3.3.2 In de presentatielaag
De presentatielaag is wellicht de meest ingewikkelde. Hier hebben we immers niet alleen
te maken met logica, maar eveneens met grafische stijl, en met inhoud of content. Dit
zijn niet alleen drie fundamenteel verschillende zaken, ze worden bovendien doorgaans
uitgevoerd door verschillende personen met een zeer heterogeen profiel. Het is daarom
cruciaal om deze zaken op een conceptuele wijze te scheiden.
4 Standaard oplossingen
4.1 APIs - Servlets
Een eerste oplossing bestond erin om applicatielogica niet in een apart CGI programma
te plaatsen, maar ze als functies of modules te integreren in de webserver. Dit lost het
eerste probleem op van de enorme hoeveelheid processen, maar vereist wel een
gestandaardiseerde API (Application Programming Interface) waarmee de webserver de
functies of modules van de applicatieprogrammeur kan oproepen. Hiertoe werd door
Microsoft de ISAPI gedefinieerd en door Netscape de NSAPI of latere WAI (Web
Application Interface). Daarnaast is er de gekende Servlet API om Java modules te
integreren in een webserver, die dan Servlet container wordt genoemd.
Webservers die gebruikerscode bevatten worden in het algemeen containers genoemd.
Dergelijke webservers voorzien meestal ook in een oplossing voor het tweede probleem
of het toestandsbeheer. Zij zullen voor elke gebruiker een session id of identificatiecode
genereren die ze met de browser uitwisselen, en zullen vervolgens bepaalde informatie
voor elke gebruiker bewaren en deze ter beschikking stellen van de gebruikerscode.
4.2 Server Pages
De generatie van grafische uitvoer blijft in het geval van servlets nog steeds deel
uitmaken van de programmacode. Dit leidt tot ongestructureerde code en heeft
bovendien tot gevolg dat grafische vormgevers in programmeerbestanden moeten
5
duiken. Om dit te vermijden hebben verschillende software fabrikanten het principe van
server pages ontworpen. Bij server pages is het mogelijk voor de applicatieprogrammeur
om programmeercode te laten deel uitmaken van HTML pagina’s. Deze code wordt
vervolgens - indien nodig - intern verwerkt door de webserver of container. Varianten
hiervan zijn de Active Server Pages (ASP) van Microsoft op basis van VB Script, en de
Java Server Pages van Sun Microsystems op basis van Java.
Ofschoon dit het grote voordeel biedt dat de graficus niet meer in
programmeerbestanden moet duiken, biedt het geen oplossing voor het fundamentele
probleem van de vermenging van logica, inhoud, en stijl. En in dit geval moet de
programmeur nog steeds in grafische bestanden duiken.
4.3 Frameworks
Aangezien Server Pages bezwaarlijk echte applicatielogica kunnen bevatten, stellen
software bedrijven raamwerken of frameworks om grote applicaties te ontwikkelen. Het
gaat hier om zogenaamde componenten modellen, die beschrijven hoe applicaties in
verschillende componenten dienen te worden opgedeeld, en hoe deze componenten in
een globale infrastructuur kunnen worden ontplooid. De twee dominante raamwerken
voor web applicaties zijn J2EE (Java 2 Enterprise Edition) van Sun Microsystems en .Net
van Microsoft.
Het is belangrijk op te merken dat .Net een software product is van Microsoft, terwijl
J2EE een standaard is met implementaties in producten van verschillende software
bedrijven. Zo ontwikkelen bijvoorbeeld IBM, Sun, BEA, SAP, en Novell J2EE applicatie
servers of containers voor componenten van applicatieprogrammeurs
5 Een totaaloplossing
Omwille van het gestandaardiseerd karakter en de maturiteit van de technologie opteren
we voor het J2EE platform in onze totaaloplossing. Voor de presentatielaag volgen we het
J2EE platform slechts gedeeltelijk wegens de gebrekkige scheiding tussen inhoud, stijl,
en logica. Hier maken we gebruik van een XML (eXtensible Markup Language) raamwerk
of XML Publishing Framework.
5.1 De applicatielaag
Voor de applicatielaag of logica nemen we het EJB (Enterprise Java Beans) model, deel
van het J2EE platform. Dit platform, in meer diepgang uiteengezet in de nota over
Gedistribueerde Object Systemen, voorziet in twee soorten applicatiecomponenten:
entity beans en session beans. Het eerste type object komt overeen met
gestructureerde data en wordt verbonden aan een tabel in een databank, terwijl de
tweede soort objecten worden aangewend voor acties.
De applicatiecode of objecten wordt opgelopen in een EJB container, die een aantal
algemene aspecten zoals schaalbaarheid, betrouwbaarheid, en transactionele integriteit
voor zijn rekening neemt. Daarnaast verzorgt een dergelijke container ook het mappen
van objecten en attributen op tabellen en velden in de databank. En indien aldus
geconfigureerd, kan de container ook de persistentie van de verschillende datastructuren
voor zijn rekening nemen.
6
5.2 De presentatielaag
Voor de presentatielaag maken we gebruik van een J2EE servlet container, en van het
Open Source XML publicatieraamwerk Cocoon. De reden hiervoor is dat Cocoon vandaag
wellicht de meest gestructureerde en geavanceerde scheiding biedt tussen inhoud, stijl,
en logica voor webapplicaties. Hiertoe maakt het gebruik van een structurele
ontkoppeling, schematisch voorgesteld in de volgende figuur.
Management
Inhoud
Logica
Stijl
Hierbij valt onmiddellijk op dat er vijf verschillende structurele interfaces voorzien zijn
tussen de verschillende componenten. Cocoon is geïmplementeerd als een servlet, en het
globale raamwerk waarin de gebruikerscode wordt opgenomen is voorgesteld in de
volgende figuur.
Ingaande logica
Output generatie
Inhoud
Uitgaande logica
xml
x
xsl
Interface logica
Verzoek doorgave
xml
Stijl
x
xsl
html
De inhoud of content van de website of applicatie wordt voorgesteld in XML bestanden,
terwijl de stijl dient te worden ondergebracht in XSL (eXtensible Style Language). Op
deze wijze wordt de eigenlijke grafische uitvoer gegenereerd door XSLT (eXtensible Style
Language Transformations) transformaties. Dit houdt een complete ontkoppeling van
inhoud en stijl in.
Voor de gebruikerslogica maakt Cocoon een vrij fundamenteel onderscheid tussen
ingaande en uitgaande logica in de levenscyclus van een verzoek over het web. De
Cocoon servlet zal het verzoek doorgeven aan de ingaande logica. Hierbij zal hij de
verschillende parameters formatteren, en eveneens de informatie van de
7
gebruikerssessie ter beschikking stellen. De ingaande logica kan nu – mits eventuele
interface logica in de presentatielaag – interageren met de applicatielaag en de
databank. Op basis van resultaten tijdens deze verwerkingsstap kan hij de Cocoon
servlet echter instructies geven wanneer deze met zijn generatie van de uitvoer begint.
Zo kan de ingaande logica bijvoorbeeld bepalen van welk XML inhoudsbestand moet
worden vertrokken en van welk XSL bestand dient gebruik gemaakt te worden voor de
transformatie. Maar hij kan ook informatie opslaan via het sessiebeheer van de Cocoon
servlet en de servlet container.
Tijdens de generatie van de uitvoer wordt een XSLT transformatie uitgevoerd op basis
van een stijlbestand, maar kan via een analoge transformatie kan gebruik gemaakt
worden van de uitgaande logica. Deze wordt gegroepeerd in logische bestanden of XSL
logicsheets, en via XML tags opgeroepen. De uitgaande logica dient om informatie te
verzamelen die in de uitvoerpagina moet worden weergegeven. Hij kan hiervoor –
eventueel via interface logica – een beroep doen op de applicatielaag, maar kan via het
sessiebeheer van Cocoon en de container ook beroep doen op informatie die is verzameld
door de ingaande logica.
8
Download