ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS-...

80
Faculteit Wetenschappen Faculty of Sciences Vakgroep Toegepaste Wiskunde en Informatica i.s.m. Biocentrum Agri-Vet Scriptie ingediend tot het behalen van de academische graad van Licentiaat Informatica Academiejaar 2002-2003 ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- EN INFORMATIEBANK VOOR DE BOUW EN INRICHTING VAN VEESTALLEN PROMOTOR prof. dr. A. De Clercq BEGELEIDER prof. dr. ir. J.P.A. Christiaens Steven Verstockt 2 e Licentie Informatica Optie : Toepassingsgerichte Stamnr. : 19993763

Transcript of ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS-...

Page 1: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Faculteit Wetenschappen Faculty of Sciences

Vakgroep Toegepaste Wiskunde en Informatica i.s.m. Biocentrum Agri-Vet

Scriptie ingediend tot het behalen van de academische graad van Licentiaat Informatica

Academiejaar 2002-2003

ONTWIKKELING VAN EEN WEB GEORIËNTEERDE

GEGEVENS- EN INFORMATIEBANK

VOOR DE BOUW EN INRICHTING VAN VEESTALLEN

PROMOTOR

prof. dr. A. De Clercq BEGELEIDER

prof. dr. ir. J.P.A. Christiaens

Steven Verstockt2e Licentie Informatica

Optie : ToepassingsgerichteStamnr. : 19993763

Page 2: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Woord vooraf Het idee voor deze thesis werd aangereikt door prof. dr. ir. J.P.A. Christiaens,

diensthoofd van het biocentrum Agrivet aan de universiteit Gent. Hij hielp als begeleider

vanaf het begin de krijtlijnen van de webapplicatie uitzetten. Doorheen dit onderzoek

bleef hij een onmisbare hulp bij het doorspelen van data en het testen van de applicatie.

Voorts is het niet mogelijk voorbij te gaan aan mijn promotor prof. dr. A. De Clercq die

steeds een goede inspiratiebron voor mij was. Zo werd in overleg met hem besloten om

de webapplicatie voor de bouw en de inrichting van veestallen te ontwerpen in de nieuwe

.NET ontwikkelomgeving. Daarnaast kon ik ook steeds op zijn hulp rekenen bij eventuele

problemen tijdens het uitwerken van de thesis. Alsook zijn waardevolle tips bij het

schrijven van deze scriptie waren van goudwaarde.

Het is verder gepast hier Nick Howard te bedanken. Aan de hand van zijn artikel op de

Wrox ASPToday site en enkele mails die ik met hem verstuurde heeft hij mij geholpen bij

het ontwikkelen van een menu user control in asp.net.

Tot slot wil ik al mijn kennissen bedanken die mij tijdens dit thesisjaar begeleid en

ondersteund hebben. In het bijzonder mijn medestudenten Cliff De Clerck, Thierry Du Tre

en Tim Van der Hulst voor hun nuttige informatie tijdens de ontwikkeling van de

applicatie.

De afgelegde weg overziende kan ik zeggen met veel enthousiasme aan deze thesis

gewerkt te hebben. Dat laatste was mede mogelijk door de ruimte die ik hierbij ontving

van mijn begeleiders, prof. dr. ir. J.P.A. Christiaens en prof. dr. A. De Clercq. Ik wil hen

in het bijzonder nogmaals bedanken voor hun stimulerende kritiek en hun geduld.

Steven Verstockt Lede, 21 mei 2003 "De auteur geeft de toelating deze scriptie voor consultatie beschikbaar te stellen en delen van de scriptie te kopiëren voor persoonlijk gebruik. Elk ander gebruik valt onder de beperkingen van het auteursrecht, in het bijzonder met betrekking tot de verplichting de bron uitdrukkelijk te vermelden bij het aanhalen van resultaten uit deze scriptie."

- WOORD VOORAF - 1

Page 3: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Inhoustafel Woord Vooraf Inhoudstafel Omschrijving afstudeeropdracht Inleiding

p. 1 p. 2 p. 5 p. 6

Hoofdstuk 1 : Literatuuronderzoek : Wat maakt een user interface goed ?

1.1 Inleiding 1.2 Doelgerichtheid 1.3 Goede ontsluiting 1.4 Structuur 1.5 Gebruiksvriendelijkheid 1.6 Stijl van schrijven 1.7 De systematische ontwerpmethode 1.8 User-gerichte benadering tot interface design

p. 8 p. 8 p. 10 p. 11 p. 12 p. 13 p. 14 p. 15

Hoofdstuk 2 : Het .Net platform

2.1 Inleiding 2.2 Ontwerpdoelstellingen 2.3 Architectuur van het .NET framework 2.4 ASP.NET

2.4.1 Wat is ASP.NET en hoe werkt het ? 2.4.2 ASP.NET web forms & server controls 2.4.3 ASP.NET & VB.NET

2.5 ADO.NET 2.5.1 Wat is ADO.NET ? 2.5.2 Wat maakt ADO.NET zo sterk ? 2.5.3 Belangrijkste ADO.NET objecten

p. 16 p. 17 p. 18 p. 19 p. 20 p. 22 p. 23 p. 23 p. 24

Hoofdstuk 3 : Internationalisatie van een applicatie

3.1 Inleiding : Wat is internationalization ? 3.2 Technieken voor internationalization

3.2.1 Internationalization algemeen 3.2.2 Internationalisation via registry 3.2.3 Internationalisation via text file 3.2.4 Internationalisation via database 3.2.5 Internationalisation via resource files 3.2.6 Internationalisation via XML

3.3 Lokalisatie van de applicatie 3.4 Internationalization van de applicatie voor de bouw en de

inrichting van veestallen

p. 27 p. 27 p. 28 p. 28 p. 29 p. 29 p. 30 p. 31 p. 31

- INHOUDSTAFEL - 2

Page 4: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Hoofdstuk 4 : Cookies & Session Object in ASP.NET

4.1 Cookies 4.1.1 Wat zijn cookies ? 4.1.2 Hoe cookies maken in ASP.NET ? 4.1.3 Hoe cookies verzenden in ASP.NET ? 4.1.4 Hoe cookies terugkrijgen in ASP.NET ? 4.1.5 Wat als de gebruiker geen cookies toelaat ? 4.1.6 Zijn cookies wel veilig ?

4.2 Session Object 4.2.1 Wat is een sessie ? 4.2.2 Wat is een session object ? 4.2.3 Hoe maak je een session object ? 4.2.4 Hoe werkt een session object ?

p. 33 p. 33 p. 34 p. 34 p. 35 p. 35 p. 36 p. 36 p. 36 p. 37

Hoofdstuk 5 : Global.asax & Web.config

5.1 Global.asax 5.1.1 Wat is global.asax ? 5.1.2 Application object 5.1.3 Applicatie- en sessiegebeurtenissen 5.1.4 Voorbeeld van een global.asax file 5.1.5 Het gebruik van @Import in global.asax 5.1.6 Server-side object tags 5.1.7 Foutafhandeling via global.asax

5.2 Web.config 5.2.1 Machine.config versus Web.config 5.2.2 Hoe is web.config opgebouwd ? 5.2.3 Algemene instellingen in web.config 5.2.4 Pagina-instellingen in web.config 5.2.5 Sessie-instellingen in web.config 5.2.6 Toepassingsinstellingen in web.config 5.2.7 Voorbeeld van een web.config file

p. 38 p. 38 p. 39 p. 40 p. 41 p. 41 p. 42 p. 43 p. 43 p. 44 p. 44 p. 45 p. 45 p. 46

Hoofdstuk 6 : Server side include directives/user controls

6.1 Wat zijn server side include directives ? 6.2 Wat zijn user controls ? 6.3 Hoe user controls maken ?

p. 47 p. 47 p. 48

- INHOUDSTAFEL - 3

Page 5: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Hoofdstuk 7 : Menu-ontwerp

7.1 Inleiding 7.2 Menu user control

7.2.1 Beschrijving van menu en menu-items in XML 7.2.2 Transformatie van menu.XML via XSL 7.2.3 Manipulatie van de structuur van het menu in de browser 7.2.4 Opbouw van de code voor de menu control 7.2.5 Gebruik van de menu control

7.3 Andere mogelijkheden voor menu-ontwerp

p. 50 p. 51 p. 53 p. 53 p. 53 p. 54 p. 55

Hoofdstuk 8 : Beveiliging in ASP.NET

8.1 Inleiding 8.2 Forms beveiliging 8.3 Passport beveiliging 8.4 Session beveiliging

p. 57 p. 57 p. 61 p. 62

Hoofdstuk 9 : Foutafhandeling in ASP.NET

9.1 Inleiding 9.2 Fouten voorkomen 9.3 Foutafhandelingstechnieken

9.3.1 Foutafhandelingspagina’s 9.3.2 Foutafhandeling in de code

On Error , Try…Catch…Finally , Throwing Exceptions

9.4 Foutafhandeling via global.asax

p. 63 p. 63 p. 64 p. 65 p. 66

Hoofdstuk 10 : Flash.NET

10.1 Inleiding 10.2 Werkwijze flash.NET

9.2.1 Hoe data uitwisselen tussen flash en de server ? 9.2.2 Hoe data uitwisselen tussen de server en flash ?

10.3 Andere vormen van data-uitwisseling met flash.net 9.3.1 Uitwisseling van XML data 9.3.2 Uitwisseling van geluid, film en afbeeldingen

10.4 Simulatie van de luchtcirculatie in een veestal

p. 67 p. 68 p. 70 p. 71 p. 73 p. 73

Conclusie Referenties Bijlagen

p. 74 p. 75 p. 79

- INHOUDSTAFEL - 4

Page 6: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Omschrijving afstudeeropdracht

Hieronder staat de omschrijving van de afstudeeropdracht, zoals die vóór de start is

geformuleerd:

Ontwikkeling van een web georiënteerde gegevens- en informatiebank voor

de bouw en inrichting van veestallen.

Een rudimentair programma in VisualBasic bestaat en dient verder te worden uitgebouwd

tot een volwaardige gegevens- en informatiebank voor ontwerpers en voorlichters van

veestallen. Het programma dient naast de loutere weergave van een aantal gegevens

(materiaalkenmerken, diergegevens, adressen,..) en illustraties (ventilatiepatronen,

toestellen,enz.) tevens toe te laten een aantal berekeningen uit te voeren

(diergewichten, ventilatiedebieten, k-waarde,..) evenals simulaties.

Van de student wordt verwacht dat hij het huidig programma optimaliseert en verder

uitbreidt met de beschikbaar gestelde informatie. Verder dienen een aantal illustraties

(o.m. ventilatiepatronen) te worden omgebouwd tot bewegende figuren met simulatie

van veranderende voorwaarden (voor ventilatiepatronen is dat ondermeer de

windrichting). Tenslotte dient het geheel geschikt gemaakt te worden voor toepassing op

het Web, liefst in meerdere talen.

- OMSCHRIJVING - 5

Page 7: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Inleiding

In deze scriptie wordt de afstudeeropdracht van Steven Verstockt beschreven. In het kort

was hierbij de opdracht een applicatie te schrijven in ASP.NET voor de bouw en de

inrichting van veestallen. Dit onder begeleiding van prof. dr. ir. J.P.A. Christiaens,

diensthoofd van het Biocentrum Agri-Vet, en prof. dr. A. De Clercq, Vakgroep Toegepaste

Wiskunde en Informatica van de Faculteit Wetenschappen.

De afstudeeropdracht kan worden onderverdeeld in drie luiken. In de oriëntatiefase

(ongeveer een maand) heb ik een literatuurstudie gedaan omtrent user interfaces. De

centrale vraag die ik hierbij hanteerde was : “Wat maakt een user interface goed ?”. In

het eerste hoofdstuk van deze scriptie vindt u de bevindingen terug van dit onderzoek.

Samenvattend zijn de volgende kenmerken typerend voor een goede user interface :

doelgericht, goede ontsluiting, duidelijke structuur, gebruiksvriendelijk, goede schrijfstijl.

In de hoofdfase (ongeveer vijf maand) heb ik het eigenlijke werk gedaan, het

programmeren van de applicatie en het onderzoek naar de mogelijkheden van ASP.NET

met betrekking tot de uitwerking van de applicatie. Deze hoofdfase werd aangevat met

een studie van het .NET platform, in het bijzonder werd ASP.NET en ADO.NET onder de

loep genomen. Alle informatie hieromtrent werd ondergebracht in hoofdstuk 2 van deze

scriptie.

Daar de applicatie meerdere talen moest ondersteunen werd een onderzoek gedaan naar

verschillende technieken voor de internationalisatie en lokalisatie van applicaties. In

hoofdstuk 3 worden deze technieken besproken. Hoofdstuk 4 handelt over cookies en het

session object in ASP.NET. Een studie hieromtrent was nodig om gebruikers steeds te

kunnen begroeten en bedienen in hun eigen taal zonder ze steeds opnieuw deze taal te

doen specificeren.

Voor de configuratie van de applicatie en het afhandelen van applicatie- en

sessiegebeurtenissen beschikt ASP.NET over web.config en global.asax. Een bespreking

van deze 2 bestanden en hun mogelijkheden vindt u terug in hoofdstuk 5 dat hier

volledig aan gewijd is.

Daar er in Visual Studio geen besturingselement voor menu’s aanwezig is werd er zelf

een user control voor ontworpen. Het resultaat van de algemene studie omtrent user

controls en de bespreking van het ontwerp van de menu user control zit bevat in

hoofdstuk 6 en hoofdstuk 7.

- INLEIDING - 6

Page 8: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Hoofdstuk 8 en hoofdstuk 9 van deze scriptie handelen over security en error handling in

ASP.NET. Voor het beveiligen van de private pagina’s van de applicatie, die enkel door de

leden van het biocentrum Agri-Vet geraadpleegd mogen worden, was een onderzoek

naar de security-mogelijkheden in asp.net immers onmisbaar binnen het kader van dit

afstudeerwerk. Daarnaast werden, voor het bewaren van de consistentie van de

gegevens in de applicatie en voor het vermijden van foutmeldingen aan de gebruiker, de

verschillende foutafhandelingsmechanismen die mogelijk zijn in ASP.NET onderzocht.

Hoofdstuk 10 tot slot bevat een bespreking van Flash.Net. Voor de simulatie van de

luchtstroom in de veestal was er immers nood aan bewegende beelden die dynamisch

konden worden aangepast. Hiervoor werd Macromedia Flash MX gebruikt. Voor het

uitwisselen van gegevens met de server werd de integratie van Flash en ASP.NET

onderzocht.

In de slotfase van deze afstudeeropdracht (de laatste maand) heb ik gezorgd voor de

afronding van dit verslag, het voorbereiden van een presentatie en het aanpassen van de

interface van de applicatie naar de wensen van prof. dr. ir. J.P.A. Christiaens.

In de bijlage achteraan deze scriptie bevindt zich een handleiding voor het aanpassen

van de applicatie. Daarnaast vindt u er ook een CD-ROM met de code van de applicatie

en de code van enkele proefapplicaties.

- INLEIDING - 7

Page 9: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

1. Literatuuronderzoek : Wat maakt een user interface goed ? 1.1 INLEIDING Bij vele user interfaces/websites wordt nog steeds te weinig rekening gehouden met het gebruikersgedrag. “Ik vind de informatie niet die ik nodig had” of “Ik voel me zo onwennig” zijn veel gehoorde uitspraken van gebruikers.1

Een fout die vele ontwikkelaars immers maken is het overvloedig gebruik van tekst. Een computer is niet zo zeer gemaakt om er op te lezen, maar wel om er iets op te doen. Voortdurend klikkend gaat een bezoeker op zoek naar iets interessants. Hierbij slaat hij praktisch alle tekst over. Lezen gebeurt pas in een laatste fase, wanneer ze hun gading gevonden hebben.2 Dit houdt dus in dat user interfaces niet alleen informatie moeten bieden, maar deze ook optimaal moeten ontsluiten. Een ander aandachtspunt voor de ontwikkeling van een goede user interface is de structuur. Bezoekers hebben meestal geen kennis van de inhoud van een site of de mogelijkheden van een applicatie en zullen iets niet snel vinden als het ergens onverwachts is ondergebracht. Een applicatie kan alleen goed functioneren wanneer bezoekers er goed mee overweg kunnen en de gewenste inhoud kunnen vinden. Een duidelijke structuur is daarom noodzakelijk om de bezoeker te kunnen overtuigen.3 Nauw aansluitend bij de structuur is de stijl van schrijven. Korte teksten, goed leesbare lettertypes, beperkt kleurgebruik, enz. zijn enkele kenmerken van een schrijfstijl die de bezoeker aanspreekt. Waar men ook aandacht dient aan te besteden is de doelgerichtheid van een site. Als u bijvoorbeeld een website van een autofabrikant bezoekt hoopt u daar ook terug te vinden wat die auto’s kosten, waar u die auto kan bestellen. Men moet dus goed weten met welk doel gebruikers een site zullen raadplegen. De belangrijkste aspecten voor een goede werking van een user interface zijn aldus :

• doelgericht • goede ontsluiting • duidelijke structuur • gebruiksvriendelijk • stijl van schrijven

In de volgende puntjes zal ik de belangrijkste aspecten voor de goede werking van een user interface uitdiepen. Vervolgens zal ik de systematische ontwerpmethode bespreken en een voorbeeld geven van een user-gerichte benadering tot interface design. 1.2 DOELGERICHTHEID Het succes van een website of een user interface hangt in de eerste plaats af van de inhoud die de site biedt. Is deze wel interessant voor de bezoekers van je site ? Want zij zijn het die bepalen of de inhoud hun al dan niet kan bekoren. Een site die hen weinig te bieden heeft vinden ze een slecht site. Hoe beter een site dus afgestemd is op de verwachtingen van de bezoeker, des te groter de doelgerichtheid van de site zal zijn.4 Om de doelgerichtheid te verhogen doet men er goed aan leden van de doelgroep te raadplegen en te achterhalen wat hun verwachtingen zijn wanneer ze een site bezoeken. Zo is het ook aangeraden om een aantal proefbezoekers de site grondig te laten uitdiepen en aan de hand van hun bevindingen de doelgerichtheid te verhogen.

- HOOFDSTUK 1 - 8

Page 10: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Goede inhoudelijke keuzes hangen ook nauw samen met de doelstellingen bij de bouw van een site/user interface. Wat moeten bezoekers kunnen doen ? Wat moet opvallen ? Welke informatie moet de site voorzien ? De antwoorden op deze vragen vormen de doelstellingen die ten grondslag liggen bij de bouw van een website. Goede doelstellingen formuleren heel concreet wat de bezoekers te weten moeten komen, wat zij op de site moeten vinden en wat ze geneigd zijn te gaan doen. Zonder dergelijke doelstellingen blijken websites vaak niet goed te functioneren. Wanneer deze doelstellingen niet aanwezig zijn gaat men zich bij de inrichting van de site meer bezighouden met de vraag welke informatie beschikbaar is binnen de organisatie, dan wat met de website bereikt moet worden, en hoe dat kan. Dit komt de doelgerichtheid van de site echter niet ten goede. Websites blijken in de praktijk op verschillende manieren tekort te schieten op het gebied van doelgerichtheid. Een onderzoek naar de doelgerichtheid van websites in Denemarken bevestigt dit.5 Een gebruikstest van Deense websites bracht immers nogal wat problemen aan het licht, namelijk gemiddeld per site:

• 11 catastrofes (gebruiker kan taak niet volbrengen) • 20 serieuze gebruiksproblemen (gebruiker moet veel moeite doen om te slagen) • 29 cosmetische problemen (duurt lang of wekt irritatie)

Deze resultaten, gerapporteerd door de Denen Rolf Molich en Christian Gram, zijn niet zo verbazingwekkend volgens Jacob Nielsen, de usability-goeroe. Ze zijn waarschijnlijk nog geflatteerd omdat delen van de sites niet zijn getest. En het ging hier om Deense websites, bezocht door Deense proefbezoekers. Bij sites die door buitenlanders worden bezocht spelen ook cultuurverschillen een complicerende rol. Ook verwijst Nielsen naar een onderzoek van Jared Spool, die 15 grote commerciële Amerikaanse websites heeft getest. Gebruikers bleken in slechts 42% van de gevallen specifieke informatie te kunnen vinden.

Volgens de bovenvermelde Jared Spool gaat het zelfs zeer slecht met de doelgerichtheid van websites. De resultaten van vijf jaar onderzoek laten zien dat zelfs de beste sites nog niet goed genoeg zijn.6

Een veel voorkomend probleem is het feit dat sommige zaken voor een organisatie zo vanzelfsprekend zijn, dat zij vergeet om de bezoekers erover te informeren. Net niet voldoende informatie is daar een gevolg van. Anderzijds moet men trachten om overbodige informatie te vermijden. Dit is informatie die niet interessant is voor de bezoeker. Bij vele websites is het immers een probleem om de informatie op een overzichtelijke en vindbare manier aan te bieden. Alle overbodige informatie gaat dan ook ten koste van de overzichtelijkheid en zorgt ervoor dat interessante informatie minder goed wordt teruggevonden. Bovendien is oninteressante informatie voor de bezoeker verspilde tijd en moeite. In een vroeg stadium informeren over welke informatie er te vinden is, zal het eindeloos zoeken naar (misschien niet aanwezige) informatie tot een minimum beperken. Daar websites zelden compleet zijn en bezoekers er vaak niet de gewenste informatie terugvinden, kan men de doelgerichtheid verhogen door de bezoekers verder te verwijzen naar andere plaatsen waar de informatie misschien wel beschikbaar is. Hoe meer extra links er met betrekking tot informatie voor de doelgroep op de site staan, hoe groter de kans dat de bezoeker terugkeert. De website gaat dan voor hem als een soort portal gaan functioneren. Ook emailadressen en telefoonnummers van contactpersonen kunnen users helpen bij hun zoektocht naar informatie omtrent een bepaald onderwerp. En dat is toch de bedoeling van een goede website … gebruikers voorzien van de informatie die ze zoeken.

- HOOFDSTUK 1 - 9

Page 11: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

1.3 GOEDE ONTSLUITING De goede werking van een website hangt grotendeels ook af van het al dan niet vinden van de informatie door de gebruiker. Dat is immers niet altijd zo makkelijk. Het scherm is klein en biedt geen houvast bij het vinden van de gewenste informatie. Dit in tegenstelling tot een boek of tijdschrift, waarbij de lezer zich makkelijk een indruk kan vormen van de omvang en de inhoud. Hierdoor komt het vaak voor dat informatie niet gevonden wordt, doordat ze op een onverwachte plaats is ondergebracht of zich achter een onduidelijke link bevindt. Daarom mag men zeker het belang van de indeling van de verschillende onderwerpen en het belang van duidelijke links niet over het hoofd zien. Ze zijn de steunpilaren in het zoekproces van de gebruiker.7 Zoals reeds vermeld in de inleiding van deze literatuurstudie gaan bezoekers pas beginnen lezen als ze gevonden hebben wat hun interesseert. In de stappen daar voorafgaand zoeken zij met een minimum aan moeite naar deze informatie. Daarom is het belangrijk dat de informatie, of de weg om aan die informatie te geraken, visueel goed gepresenteerd wordt. Alles op een website moet immers gericht zijn op het vergemakkelijken van de keuzes van de gebruiker. De bezoeker bevindt zich immers voortdurend in een keuzeproces. Hij stelt zich constant vragen : “Druk ik hier ?”, “Lees ik dit ?”, “Ga ik ergens anders zoeken ?”. Aangezien bezoekers ook zelden scrollen moet er voor gezorgd worden dat het belangrijkste direct op het scherm verschijnt. Daarom is het ook aangeraden om uit te gaan van een scherm van 800x600 pixels, de meest voorkomende schermgrootte bij computergebruikers. Wanneer men een site ontwerpt met een grotere schermgrootte heeft deze immers het nadeel dat hij maar gedeeltelijk wordt weergegeven bij gebruikers met een kleinere schermgrootte. En dat is nadelig. De meeste websites kennen een hiërarchische indeling8, waarbij de inhoud opgedeeld is in rubrieken, subrubrieken en pagina’s. De rubrieken vormen de hoofdthema’s en de subrubrieken de subthema’s. Een probleem is dat de bouwer van de site vaak een andere visie heeft op deze indeling dan de gebruiker. Een indeling van informatie die niet aansluit bij de verwachtingen van de gebruiker belemmert dan ook de vindbaarheid. Duidelijke titels van de (sub)rubrieken, die op de knoppen in de navigatiebalk verschijnen, kunnen hier hulp bieden. Ze wekken de juiste verwachtingen bij de bezoeker over de inhoud van de (sub)rubriek. Bovendien vormen ze een goede weergave van de complete inhoud van de (sub)rubriek en beperken ze de overlap tussen rubrieken tot een minimum. Een onduidelijke titel heeft immers tot gevolg dat bezoekers bepaalde onderdelen niet in deze rubriek verwachten en informatie omtrent dat onderdeel daar dan ook niet zullen gaan zoeken. Bovendien kan door een slechte keuze van de titels informatie die bij elkaar hoort op verschillende plaatsen terecht komen. Tot slot bepaalt ook de homepage de goede ontsluiting van een website. Bezoekers weten graag direct wat ze op een site kunnen vinden. Daarom is het ook aangeraden om op de homepage een duidelijk overzicht te geven van wat er op de site te vinden is aan de hand van een duidelijke beschrijving van de rubrieken. Op de homepage moet ook duidelijk terug te vinden zijn op wie zijn site ze terecht zijn gekomen. ENKELE VOORBEELDEN VAN GOEDE/SLECHTE ONTSLUITING Om enkele voorbeelden te geven van goede en slechte ontsluiting van websites ben ik via de portaalsite van de Universiteit Gent (http://www.rug.ac.be/) op zoek gegaan naar enkele websites binnen de universiteit die een goede/slechte ontsluiting hebben. Hiervoor heb ik de websites onderzocht op de hierboven vermelde kenmerken van een goede ontsluiting. De meeste van de onderzochte websites vertoonden behoorlijk wat kenmerken van een goede ontsluiting. Sommige zijn echter voor verbetering vatbaar.

- HOOFDSTUK 1 - 10

Page 12: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

De portaalsite zelf is trouwens al een goed voorbeeld van goede ontsluiting. De informatie is makkelijk te vinden en kan meestal bekeken worden zonder te moeten scrollen. De indeling van de verschillende onderwerpen is goed gekozen zodat men meestal vlug de gewenste informatie terugvindt. Op de homepage vindt men bovendien een duidelijk overzicht van wat er allemaal op de site te vinden is. De bezoeker weet dus direct wat de site hem allemaal te bieden heeft. Nog een mooi voorbeeld van hoe het wel moet is de site van de faculteit Toegepaste Wetenschappen (http://www.ftw.rug.ac.be/). Op deze website is de hiërarchische indeling goed merkbaar. De inhoud is opgedeeld in rubrieken, subrubrieken en pagina’s. De titels van de (sub)rubrieken zijn duidelijke en wekken de juiste verwachtingen bij de bezoeker over de inhoud van de (sub)rubriek. Ze vormen bovendien een goede weergave van de inhoud van de rubriek en de overlap tussen de rubrieken is tot een minimum beperkt. Allemaal kenmerken van een goede ontsluiting. In mijn onderzoek naar de ontsluiting van de websites heb ik echter ook enkele voorbeelden tegengekomen waar van een goede ontsluiting weinig merkbaar was. Zo is er bijvoorbeeld op de website van de faculteit geneeskunde en gezondheids-wetenschappen (http://allserv.rug.ac.be/~chrdpauw/index.html) geen indeling terug te vinden van de verschillende onderwerpen. De bezoeker moet de informatie trachten te vinden aan de hand van een alfabetische woordenlijst. De informatie, of de weg om aan die informatie te geraken, is dus visueel niet goed gepresenteerd. De bezoeker heeft geen idee van wat hij op de site zal kunnen terugvinden. 1.4 STRUCTUUR De structuur van een website wordt grotendeels bepaald door het bedieningspaneel van vaste knoppen en andere terugkerende navigatie-elementen, waarmee de bezoeker door de site surft. Een goed bedieningspaneel zorgt ervoor dat de bezoeker zich overal goed kan oriënteren en doelgericht door de site kan navigeren. Bezoekers weten immers graag waar ze zich op de website bevinden. Hoe meer idee de bezoeker krijgt van waar hij zich bevindt, hoe beter ook de ontsluiting van de website is. Op elke pagina vermeldt men dan ook best :

• De naam of het logo van de organisatie • De rubrieken van de site (in de navigatiebalk) • De subrubrieken van de rubriek waarin de user zich bevindt • Aanduiding van de plaats waar de bezoeker zich op dit moment in de site bevindt

Een goede structuur is ook het gevolg van de juiste indeling van het scherm. Deze indeling dient dan ook goed te zijn afgestemd op de manier waarop bezoekers een website bekijken. Een onderzoek omtrent oogbewegingregistratie bracht aan het licht dat het midden en de linkerkant van het scherm het best bekeken werden.9 Daarom is het ook aangeraden om navigatieknoppen aan de linkerkant onder te brengen en de informatie in het midden van het scherm te presenteren. Uit de studie bleek dat wat onderaan en rechts wordt ondergebracht nauwelijks werd bekeken. Aan de bovenkant brengt men het best de navigatiebalk onder. Knoppen vormen een belangrijk onderdeel van de hierboven besproken schermindeling. Ze functioneren over het algemeen het best als ze op plaatsen staan waar ze op de meeste websites te vinden zijn. Voorbeelden hiervan zijn het onderbrengen van de knop naar de homepage linksboven en de navigatieknoppen aan de linkerzijde van het scherm. Knoppen moeten net als titels duidelijk zijn. Men moet kunnen zien aan de knop wat zijn functie is. Daarom loopt het dikwijls eens fout bij het gebruik van illustraties en iconen. Bezoekers hebben soms geen idee wat de functionaliteit van een bepaalde knop kan zijn.

- HOOFDSTUK 1 - 11

Page 13: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Naast het gebruik van een hiërarchische indeling aan de hand van (sub)rubrieken in een navigatiebalk is het soms ook handig om koppelingen te gebruiken. Koppelingen zijn verwijzingen naar andere plaatsen op de site aan de hand van hyperlinks. Het is één van de krachtigste ontsluitingsmogelijkheden. Zeker bij grote websites komen ze goed van pas, daar het soms moeilijk is om de inhoud via een goede indeling in rubrieken te ontsluiten. Koppelingen attenderen bezoekers, tijdens het doornemen van informatie, op andere onderdelen die voor hen van belang kunnen zijn. Een klik op de hyperlink brengt hem dan bij deze informatie. Ze kunnen worden aangebracht via losse tekst,links in lopende tekst, of aan de hand van iconen en illustraties. Koppelingen moeten net zoals knoppen en titels een duidelijke verwachting scheppen. Hoe duidelijker ze zijn, hoe beter ze ook de inhoud zullen ontsluiten. Het aanbrengen van koppelingen verbetert de structurering van de inhoud. Men moet echter iets wat terughoudend te werk gaan bij het aanbrengen ervan. Pagina’s vol links naar andere onderdelen zijn onoverzichtelijk en worden nauwelijks bekeken. Te veel links na elkaar zorgen ervoor dat ze minder gaan opvallen. Links hebben ook het nadeel dat bezoekers de tekst die zich op dezelfde pagina bevindt niet meer lezen. Gebruikers klikken nu eenmaal liever dan dat ze lezen. Voorzichtigheid is dus aangeraden bij het aanbrengen ervan. 1.5 GEBRUIKSVRIENDELIJKHEID Vele van de in de vorige punten vermelde aspecten voor de goede werking van een site, zoals een goede indeling van de informatie en duidelijke knoppen, iconen en titels, zijn medebepalend voor het gebruiksgemak van een site. Daarnaast zijn er nog een aantal andere aspecten die de gebruiksvriendelijkheid van een site bepalen. Het gebruiksgemak van een site wordt zo ook bepaald door de laadtijd. Aangezien bezoekers van nature uit nogal ongeduldig zijn, duurt het voor velen al veel te lang als ze 10 seconden moeten wachten tot een pagina op hun scherm verschijnt. Ze wachten in dat geval zelfs niet meer. Ze surfen dan vlug ergens anders heen. De laadtijd hangt natuurlijk af van het type verbinding die men heeft. Mensen met een kabel- of ADSL-verbinding krijgen webpagina’s in enkele seconden binnen, waar mensen met een analoge telefoonverbinding soms minuten moeten op wachten. Daardoor zijn sites met hoge laadtijd voor deze mensen bijna onbruikbaar. Alhoewel het percentage analoge verbindingen daalt, mag men zeker deze mensen met een trage verbinding niet in de kou laten staan. Als men wil dat een website voor iedereen geschikt is, moet men er dus voor zorgen dat de pagina’s ook met trage verbindingen snel laden. Een 50 KB per pagina, inclusief beelden, is dan ook een bovengrens.Wanneer het dan toch voorvalt dat er een lange wachttijd optreedt bij het laden van een pagina geeft men best aan dat er iets geladen wordt. Alleen dan zullen mensen misschien bereid zijn om te wachten. Want als ze niet merken dat er iets geladen wordt, en het duurt lang, haken ze snel af. Zeker als ook niet duidelijk is waarop ze wachten zijn ze het wachten snel beu. Een voorbeeld van lange laadtijd is bijvoorbeeld het gebruik van flash intro’s. Het gebruik van een “skip intro” knop wordt hierbij zeer gewaardeerd door bezoekers die zo snel mogelijk aan informatie wensen te geraken. De platform- en browser-onafhankelijkheid van een website is mede bepalend voor de gebruiksvriendelijkheid van een site. Een website zal er op een Mac (Apple) altijd anders uitzien dan op een pc. De kleuren zijn anders en de letters zijn vaak kleiner. Alhoewel het aantal Mac gebruikers sterk in de minderheid is, doet men er soms best aan om de site op beide platforms goed tot zijn recht te laten komen. Een site kan er ook anders uitzien al naargelang het type browser. Hier dient ook rekening mee te worden gehouden.

- HOOFDSTUK 1 - 12

Page 14: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

1.6 STIJL VAN SCHRIJVEN Het lezen van een tekst op het scherm is minder prettig en verloopt zo’n 25% trager dan lezen van een blad.10 Er wordt maar zelden rekening gehouden met de specifieke eisen en vooral de beperkingen van het medium. Webteksten zijn daardoor grammaticaal meestal wel in orde, maar ze zijn vaak te lang en slagen er door een overaanbod aan links en continue animaties niet in om de aandacht van de lezer lang vast te houden. Bovendien zijn teksten met een ongeschikte opmaak vaak moeilijk leesbaar op beeldschermen van minder goede kwaliteit of op schermen in zakformaat, zoals bv. de (weinig populaire) e-books. Redenen genoeg die kunnen verklaren waarom je als ongeduldige en kritische surfer webteksten al snel links laat liggen. Hierbij komt ook nog dat surfers niet lineair-chronologisch lezen zoals bij een boek, maar eerder zappen en een tekst scannen. Ze lezen bovendien niet zo zeer om te leren maar om te doen. Daarom is het des te belangrijker om voldoende aandacht te besteden aan de stijl. Moeilijk leesbare lettertypes moeten vermeden worden omdat letters op een scherm niet messcherp zijn. Daarom is het aangeraden om gebruik te maken van schreefloze fonts die speciaal voor het web zijn ontwikkeld, zoals Trebuchet en Verdana. Als lettergrootte neemt men best een grootte van 12 tot 14 punten. Cursiefletters en hoofdletters worden best tot een minimum beperkt omdat ze het leesplezier vergallen.11 Het overmatig gebruik van kleuren werkt bovendien ook zeer negatief daar dit het lezen bemoeilijkt.12 Zwarte tekst op een witte achtergrond is daarom het meest leesbaar. Wanneer je dan toch kleuren wil gebruiken binnen je tekst doe je er best aan om duidelijk contrasterende kleuren te gebruiken. Zelfs bij voldoende contrast is het nog aangeraden de gekleurde tekst groter en/of vetter te maken om het lezen te vergemakkelijken. De juiste kleur zal de aandacht trekken naar een belangrijke plek. Informatie in een foute kleur leidt af en wordt minder makkelijk onthouden. Bij de opbouw van een webtekst moet je er bovendien voor zorgen dat je de tekst opdeelt in kleine segmenten. In tegenstelling tot een tekst op papier, moet je lange webteksten elimineren en ze opknippen in meerdere segmenten die op zichzelf kunnen bestaan. Het merendeel van de Internetters is immers op zoek naar zeer specifieke informatie. Meestal willen ze niet verplicht worden om grote tekstblokken te lezen. Korte tekstalinea's zijn ook beter geschikt om via het beeldscherm gelezen te worden omdat lezers dan niet al te veel doorheen de pagina hoeven te schuiven. Elk segment van een webtekst bouwt men het best op volgens de ‘omgekeerde piramidestructuur’.13 Men moet met andere woorden proberen om direct met de deur in huis te kunnen vallen. Hierdoor wordt vermeden dat gebruikers onnodig moeten klikken of scrollen om de gewenste informatie te vinden en dat belangrijke gegevens onder de scrollijn over het hoofd worden gezien. In ieder geval moet vermeden worden dat gebruikers ook horizontaal moeten scrollen. Het laten bewegen van de tekst in plaats van de ogen van de lezer is een bijkomende moeilijkheid bij het lezen van een tekst en wordt daarom beter niet gebruikt. Het automatisch laten scrollen van een webtekst of het gebruik van zogeheten ‘ticker-teksten’ die horizontaal voorbijschuiven, hebben immers zeer nadelige gevolgen voor de scanbaarheid van je tekst. Bij de opmaak van een webtekst bied men het best ook duidelijk geformuleerde en relevante kopjes aan die de hoofdgedachte van de alinea’s samenvatten. Het gebruik van witregels tussen de alinea’s, lijsten met nummers of opsommingtekens en vette kernwoorden om de aandacht te vestigen op belangrijke informatie wordt in vele artikels sterk aangeraden. Daartegenover moet men proberen te vermijden dat zuiver decoratieve illustraties, bewegende beelden, continue animaties en geluiden de aandacht van de lezer afleiden.

- HOOFDSTUK 1 - 13

Page 15: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

ENKELE VOORBEELDEN VAN STIJL VAN SCHRIJVEN Om enkele voorbeelden te kunnen geven van een slechte stijl van schrijven heb ik beroep gedaan op de omstreden site van Vincent Flanders, WebPagesThatSuck.com . Aan de hand van deze website tracht Flanders zijn bezoekers goed webdesign aan te leren door ze te confronteren met slechte websites.14 Daar Flanders voortdurend anderen hun sites gebruikt om voorbeelden te geven van slecht webdesign ben ik eerst eens op zoek gegaan naar een voorbeeld van een slechte stijl van schrijven op zijn eigen site. Een eerste pagina die behoorlijk wat kenmerken hiervan vertoont is de pagina die terug te vinden is onder “Original Sucky Pages” (http://www.webpagesthatsuck.com/begin.htm). De alinea’s op deze pagina zijn veel te lang en de opmaak van de tekst miniem. Enkele goed geformuleerde koppen boven de alinea’s en enkele vette kernwoorden zouden de aandacht van de lezer kunnen verhogen. Een ander voorbeeld van een slechte stijl van schrijven is de site van de “Arizona Art Education Association”, (http://www.azarted.org/pages/home.htm). Deze site wordt ook vermeld op de site van Flanders. De tekst wordt gepresenteerd met een groot aantal verschillende achtergrondkleuren waardoor de bezoeker waarschijnlijk al snel geïrriteerd raakt. Sommige alinea’s zijn bovendien veel te lang gemaakt waardoor ze al snel eens zullen worden overgeslagen. Het overmatig gebruik van ongepaste illustraties leiden de aandacht van de lezer ook af. Natuurlijk zijn er ook heel wat voorbeelden te vinden op het web van hoe het wel moet. Een mooi voorbeeldje hiervan is de website van de stad Gent, (http://www.gent.be). De

Ontwikkel prototype Test prototype

evel ontwerp Documenteer ontwerp

teksten die terug te vinden zijn op alle pagina’s van deze site vertonen veel kenmerken van een goede stijl van schrijven :

• korte alinea’s met witregels tussen de alinea’s • duidelijk geformuleerde en relevante kopjes • omgekeerde piramidestructuur • beperkt gebruik van kleuren (witte tekst en gele koppen en titels) • lijsten met nummers of opsommingstekens

1.7 DE SYSTEMATISCHE ONTWERPMETHODE ANALYSE ONTWERP CONSTRUCTIE Bepaal de reikwijdte Kies de objecten Gebruikersprofiel Stel storyboard op Data verzamelen High-L Documenteer data Selecteer metaforen Omschrijf de taken Ontwikkel supportplan Ontwikkel scenario’s Test Test Een systematisch ontworpen interface is makkelijk in gebruik en stelt de gebruiker in staat zijn werk te doen of een taak uit te voeren op een voor hem vanzelfsprekende manier. Dit in plaats van dat de gebruiker zich aan de interface moet aanpassen. Zulks een interface is aldus op maat gesneden voor de mensen die er moeten mee werken, verkleint bovendien de kans op fouten, verkort de tijd nodig om de interface onder de knie te hebben, leidt tot een betere klantenservice en zal meer gebruikt worden. Wanneer men moet kiezen tussen de aanpassing van de interface of de aanpassing van de gebruiker kiest men dus het best voor de aanpassing van de interface. 15

FIGUUR 1 – Systematische ontwerpmethode

- HOOFDSTUK 1 - 14

Page 16: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Tijdens de analysefase wordt een analyse gedaan van wat men weet van de mensen die de interface zullen gebruiken. In deze fase analyseert en documenteert men wie het zijn, hoe ze momenteel te werk gaan en hoe men verwacht dat ze in de toekomst zullen te werk gaan met de applicatie waarvoor de interface wordt ontworpen. Na de analysefase beschikt men over een compleet overzicht van de eisen die aan de interface worden gesteld. Tijdens de ontwerpfase wordt alle informatie die de analysefase heeft opgeleverd gebruikt om de interface vorm te geven. Uit de verschillende opeenvolgende taken die tijdens de analysefase werden bestudeerd wordt een structuur afgeleid die geschikt is voor de specifieke gebruikersgroep. Deze fase is dus een soort van ontwerp van een interface-structuur, bestaande uit de interface-objecten die door de gebruiker worden gemanipuleerd en de handelingen die met die objecten worden verricht tijdens zijn werkzaamheden. Tot slot wordt in de constructiefase een prototype van de interface geconstrueerd. Deze wordt waar nodig herzien en aan een grondige test onderworpen om eventuele problemen met de bruikbaarheid aan het licht te brengen. Het documenteren van het prototype mag men ook niet vergeten. Het biedt een hulp bij de verdere ontwikkeling. 1.8 USER-GERICHTE BENADERING TOT INTERFACE DESIGN (Human Interface Group)

In de onderstaande figuur ziet u de methode die de Human Interface Group16 hanteert om de kwaliteit te garanderen van z’n user interface design projecten. Al hun interface design projecten zijn gebaseerd op een gedetailleerde analyse van de users en hun specifieke behoeften. Het resultaat van elke stap in het process, van task analyse en conceptueel design tot navigatie design en prototypes, wordt besproken met de client, voor wie de interface ontworpen wordt, en eventueel hernomen. De goedgekeurde designs worden geverifieerd en getest op usability door end-users. Het resultaat van die usability test dienen dan als input voor een verder verfijning.

FIGUUR 2 – User-centered approach to interface design

- HOOFDSTUK 1 -

15
Page 17: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

2. Het .Net platform

2.1 INLEIDING

Daar het grootste gedeelte van mijn applicatie voor de bouw en inrichting van veestallen geschreven is in ASP.NET vind ik het belangrijk dat ik het in mijn thesis ook even heb over het .NET platform. Daarom dit gedeelte dat volledig aan het .Net platform is gewijd.

Het .Net platform is een nieuw ontwikkelraamwerk van Microsoft met een nieuwe programmeerinterface naar Windows services en API’s. Het concentreert zich bovendien in sterke mate op het internet.17 In .Net zijn een aantal technologieën opgenomen die eind jaren negentig van de vorige eeuw door Microsoft werden ontwikkeld :

• COM+ component services • ASP web development framework • koppeling met XML en objectgeoriënteerd ontwerp • ondersteuning voor nieuwe webserviceprotocollen (SOAP,WDSL,UDDI)

Het platform bestaat uit vijf onderdelen18, zoals ook te zien is in onderstaande figuur. De onderste laag wordt gevormd door het besturingssysteem (operating system). Dit kan Windows XP, Windows 2000, Windows Me of Windows CE zijn.

VISUAL STUDIO.NET

.NET Enterprise Servers

.NET Framework

.NET Building Block Services

Operating system on servers, desktops and devices

Boven het besturingssysteem bevindt zich een laag met onder andere de .NET Enterprise server-producten. Deze zorgen er voor dat grote bedrijfsgerichte systemen makkelijker en in korte tijd kunnen worden ontwikkeld. Voorbeelden hiervan zijn Biztalk Server 2000, Application Center 2000, Commerce Server 2000, SQL Server 2000, enz.

FIGUUR 3 – .NET PLATFORM

In dezelfde laag als waar de .NET Enterprise server-producten terug te vinden zijn vindt men een aantal bouwstenen terug onder de vorm van de .NET Building Block Services. Web Services kunnen op het web immers gemakkelijk steeds opnieuw worden gebruikt. Microsoft lanceert daarom deze bouwstenen die door applicatieontwikkelaars kunnen worden gebruikt tegen betaling. Microsoft Passport is bijvoorbeeld zo’n .NET Building Block Service. Deze bouwsteen maakt het mogelijk om op alle door Passport ondersteunde websites dezelfde gebruikersnaam en wachtwoord te gebruiken. HailStorm is een ander voorbeeld van zulks een .NET Building Block Services. Het bevat een aantal bouwstenen ter ondersteuning van gebruikerspersoonsgegevens.

Centraal in de .Net architectuur treft met het Microsoft .NET Framework aan. Dit is tevens het laatste nog te bespreken deel van deze middelste laag. Het is een nieuwe infrastructuur voor ontwikkeling en runtime-ondersteuning. Het .NET framework bevat de Common Language Runtime (CLR) , waarover ik straks meer zal vertellen , en een verzameling elementaire classes die het ontwikkelen van grootschalige applicaties en services op revolutionaire wijze vereenvoudigen.

- HOOFDSTUK 2 - 16

Page 18: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

De bovenste laag van het .NET platform is Visual Studio.NET (VS.NET). Het is een splinternieuw ontwikkelgereedschap dat een snelle ontwikkeling van Web Services en andere toepassingen ondersteunt. Visual Studio.NET is een geïntegreerde ontwikkelomgeving (IDE of Integrated Development Environment) die vier verschillende programmeertalen ondersteunt en functies bevat zoals taaloverkoepelende foutopsporing (cross-language debugging) en een XML schema editor. Een deel van de applicatie die ik geschreven heb werd gemaakt met behulp van Visual Studio.Net. Het is immers een zeer handig gereedschap bij het schrijven van ASP.Net applicaties. Meer uitleg over wat ASP.NET juist inhoud en hoe een ASP.NET pagina is opgebouwd vindt u terug in het onderdeel ASP.NET.

2.2 ONTWERPDOELSTELLINGEN

In dit onderdeel zal ik het hebben over de ontwerpdoelstellingen die ten gronde lagen bij het ontwikkelen van het .NET framework.19 Een overzicht van al deze doelstellingen zou ons echter te ver leiden, daarom zal ik enkel de voornaamste doelstellingen even kort bespreken. De voornaamste doelstellingen zijn :

• Taalintegratie • Samenwerkingsmogelijkheden tussen applicaties • Eenvoudige ontwikkeling en ingebruikneming • Grotere betrouwbaarheid en veiligheid

Microsoft .NET ondersteunt naast taalonafhankelijkheid ook taalintegratie. Dit houdt in dat overerving van classes mogelijk is, dat excepties kunnen worden opgevangen en dat er gebruik kan worden gemaakt van polymorfisme over verschillende programmeertalen heen. Dit alles is mogelijk dankzij het Common Type System (CTS). Deze specificatie houdt in dat alles in .NET een object is uit een specifieke klasse die is afgeleid van de basisklasse System.Object. Omdat elke taal bovendien moet voldoen aan een minimale verzameling regels die zijn vastgelegd in de Common Language Specification (CLS) en omdat elke taal code genereert die overeenstemt met de CTS, kunnen verschillende .NET talen door elkaar worden gebruikt. Dit verwijst naar de samenwerkingsmogelijkheden tussen applicaties.

De ontwikkeling van een nieuwe applicatie met een nieuwe compiler was niet altijd eenvoudig. Het was immers eerst nodig om de nieuwe API te leren of een class library. Dit kwam doordat er geen onderlinge consistentie bestond tussen de verschillende libraries en interfaces. .NET brengt hier verandering in en voorziet dus in eenvoudige ontwikkeling. Het biedt een verzameling raamwerkclasses die door alle talen gebruikt kunnen worden. Hierdoor is het niet meer nodig om steeds een nieuwe API aan te leren wanneer men een andere taal gaat gebruiken. De ingebruikneming van .NET is ook sterk vereenvoudigd. Zo is bij het gebruik van .NET het registreren van componenten in de registry niet nodig, de installatie en verwijdering van componenten probleemloos,enz… .

Grotere betrouwbaarheid en veiligheid waren zoals hierboven reeds aangehaald ook één van de ontwerpdoelstellingen bij het maken van het .NET framework. Microsoft .NET vereist daarom veilige typpen. Elke klasse in .NET is afgeleid van de Object klasse. Deze ondersteunt ondermeer runtime type-identificatie. De CLR moet typen herkennen en controleren voordat ze geladen en uitgevoerd kunnen worden. Hierdoor wordt de kans op elementaire programmafouten kleiner. Bovendien verkleint dit de kans op het overlopen van buffers, hetgeen de beveiliging in gevaar kan brengen. Excepties worden in CLR ondersteunt met een consistent foutafhandelingsmechanisme. Dit houdt in dat excepties werken in alle door .NET ondersteunde programmeertalen. Tot slot past .NET, net zoals java, garbage collection toe en worden alle objecten verwijderd die niet meer gebruikt worden.

- HOOFDSTUK 2 - 17

Page 19: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

2.3 ARCHITECTUUR VAN HET .NET FRAMEWORK

Zoals reeds besproken in de inleiding van dit onderdeel bevindt het .NET framework zich in de laag boven het besturingssysteem. Het besturingssysteem is één van de mogelijke versies van Windows. Het .NET framework zelf is samengesteld uit een aantal componenten, zoals te zien is in onderstaande figuur.20

.NET Framework

Web Services Web Forms Windows Forms

Data & XML classes ( ADO.NET, SQL, XSLT, Xpath, XML, etc. )

Framework Base Classes

( IO, stringmanipulation, security, threading, etc. )

Common Language Runtime ( debug, exception, type checking, etc. )

Windows Platform

Operating System

De belangrijkste component inCLR beheert en activeert in .Nde .NET architectuur als de Javde .NET architectuur. Op eenwaarop beveiligingscontroles whet geheugen, uitgevoerd en ondersteunt alle talen die in dkunnen worden. Dit zijn alle dohet ondersteunt compileert icompileren en uit te voeren do

Boven de CLR bevindt zich eeklassen ondersteunen een pbeveiliging, netwerkcommunicazulks een klasse is de sqrt klberekent de vierkantswortel vahet .NET framework deze framsqrt methode uit verschillendonderliggende code.

Naast deze elementaire op hetklassen aanwezig voor de ondklassen voor gegevensbehee(gegevens die in een databamanipulatie wordt het manipucode en het vertalen ervan).

FIGUUR 4 – .NET FRAMEWORK

het framework is de CLR, Common Language Runtime. De ET-talen geschreven code en is een soortgelijke basis voor a Virtual Machine voor Java. Het is het zenuwcentrum van hoog niveau van abstractie activeert de CLR objecten, orden uitgevoerd. De objecten worden gepositioneerd in verwijderd door middel van garbage collection. De CLR e Common Intermediate Language (CIL) gerepresenteerd or VS.NET ondersteunde talen, daar VS.NET alle talen die n een common intermediate language alvorens ze te or de CLR.

n laag met op het framework gebaseerde klassen. Deze rimitieve vorm van in en uitvoer, stringmanipulatie, tie, threadbeheer, tekstbeheer, enz. . Een voorbeeld van

asse die terug te vinden is in System.Math. Deze klasse n een getal. Handig is dat alle talen die gebaseerd zijn op ework klassen kunnen gebruiken. Alle oproepen naar de e .NET talen zijn dus identiek en gebruiken dezelfde

framework gebaseerde klassen is er ook een verzameling ersteuning van gegevensbeheer en XML-manipulatie. De

r ondersteunen het beheer van persistente gegevens se op de achtergrond worden opgeslagen). Met XML-leren van data in XML-formaat bedoelt (zoeken in XML-

- HOOFDSTUK 2 - 18

Page 20: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

De bovenste laag kan opgesplitst worden in 3 delen die overeenstemmen met 3 verschillende technologieën. Deze vormen een uitbreiding op de op de vorige pagina behandelde elementaire klassen en XML klassen.

1. Web services voorziet in een aantal klassen voor het ontwikkelen van gedistribueerde componenten die ook bij gebruik van firewalls en NAT-software kunnen functioneren.

2. Web forms voorziet in een aantal klassen die het maken van grafische

gebruikersinterfaces (GUI) vereenvoudigt en versnelt.

3. Windows forms voorziet in een verzameling klassen voor het ontwikkelen van op Windows gebaseerde GUI-applicaties. Het maken van een grafische user interface voor Windows wordt hierdoor sterk vergemakkelijkt en bovendien kan men beschikken over een gemeenschappelijke interface die in alle talen te gebruiken is.

Het gemeenschappelijk programmeringsmodel van .NET maakt bovendien de leercurve minder steil en verhoogt de productiviteit. Zodra u immers weet hoe u iets met behulp van de klassen in het .NET framework kunt doen, kunt u deze kennis in alle door .NET ondersteunde talen toepassen.

2.4 ASP.NET

2.4.1 WAT IS ASP.NET & HOE WERKT HET ?

Veel websites zijn vandaag de dag veranderlijk, doordat ze actuele informatie weergeven of reageren op keuzes van de gebruiker. Een website met nieuws of file informatie moet bijvoorbeeld heel actueel zijn, en in een online winkel verandert de inhoud van een winkelwagentje door de producten die een gebruiker kiest. Dit soort websites zijn voorbeelden van wat we webapplicaties noemen. Webapplicaties bestaan uit meer dan HTML alleen. HTML verzorgt over het algemeen wel het uiterlijk, maar meer kan het ook niet, want het is alleen bedoeld om pagina's op te maken. Voor een webapplicatie is daarom ook een platform nodig waarop de functionaliteit ontwikkeld en uitgevoerd kan worden, en ASP.NET is zo'n platform.

ASP.Net is het vervolg van Microsoft op ASP (Active Server Pages). Het is een door Microsoft uitgebrachte techniek voor het ontwikkelen van dynamische pagina's. ASP en ASP.NET bieden immers de mogelijkheid om dynamische en interactieve "applicatie" webpagina's te maken. Het zijn serverside talen. Dit houdt in dat al het werk om de pagina te maken geschiedt op de server en dat de server vervolgens de pagina kant en klaar verstuurd naar de bezoeker. Probleem is wel dat veel Webservers nog geen of slechts gedeeltelijk ASP.Net ondersteunen.21

ASP.NET is een stap vooruit vergeleken bij ASP in het vereenvoudigen van het ontwikkelen van webpagina’s en het vergroten van de schaalbaarheid. Bij het ontwikkelen met ASP van persoonlijke websites en enkele websites voor bedrijven kwam ik dikwijls tot een ingewikkeld mengsel van HTML-markups en serverside script. Zo heb ik wel een aantal keren veel tijd verloren met het zoeken naar de oplossing voor bepaalde eenvoudige problemen. Dit kwam doordat de ASP-code niet gescheiden kon worden van de HTML. Een groot voordeel van ASP.NET is dus dat de ASP-code netjes gescheiden kan worden van de html. Hierdoor kan het ontwerp van de pagina’s en de functionaliteit zowel parallel als gescheiden van elkaar ontwikkeld worden.

- HOOFDSTUK 2 - 19

Page 21: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

In ASP.NET kan je ook bekende html-controls, zoals button, textbox en dergelijke, server-side programmeren. Zo krijg je meer controle over de pagina. Naast de bekende html-controls zijn er ook nog een aantal nieuwe controls toegevoegd, bvb datalist. Deze stelt je in staat om op een eenvoudige manier lijsten met data te tonen.

Scripts in ASP kunnen bovendien alleen worden gemaakt met geïnterpreteerde talen zoals VBScript en JavaScript. Hierdoor kan geen typeveiligheid geëist worden. Daarenboven worden serverside scripts in ASP-pagina’s telkens opnieuw geïnterpreteerd wanneer de pagina geopend wordt. Dit heeft vanzelfsprekend een nadelige invloed op het prestatieniveau. ASP.NET bouwt voort op ASP en heeft vrijwel alle hierboven genoemde nadelen geëlimineerd. Zo wordt elke pagina éénmaal gecompileerd en in de cache bewaard en niet ieder keer als hij wordt aangeroepen opnieuw geïnterpreteerd.

ASP.NET is dus niet zomaar een nieuwe versie van ASP. ASP.NET is anders in aanpak, zo lijkt het maken van ASP.NET applicaties veel meer op het maken van bijvoorbeeld Visual Basic applicaties. Dit heeft te maken met het feit dat ASP.NET onderdeel is van het .NET Framework, waarover ik het vroeger al heb gehad. In .NET maken alle soorten applicaties gebruik van dezelfde onderliggende infrastructuur en kunnen ze dus ongeveer op dezelfde wijze worden gemaakt.

Er is bij de ontwikkeling van ASP.NET ook veel aandacht besteed aan het vereenvoudigen van dingen die vaak gedaan worden. Zo is bijvoorbeeld het weergeven van gegevens uit een database veel makkelijker geworden, de meeste 'code' daarvoor heeft ook veel weg van HTML, waardoor het ook voor HTML-ontwikkelaars betrekkelijk makkelijk te gebruiken is.

2.4.2 ASP.NET WEB FORMS & SERVER CONTROLS

Met webformulieren introduceert ASP.NET een nieuwe manier om weboplossingen te creëren.22 Dankzij deze web formulieren wordt het maken van webpagina’s eenvoudiger. Deze webformulieren zijn vergelijkbaar met formulieren in VB. Zo is het programmeren ervan ook gebeurtenisgeoriënteerd. Dit betekent dat er geen inline asp-scripts meer moeten worden geschreven die vervolgens topdown moeten worden ontleed. Een voordeel van ASP.NET dat hierboven al eens werd aangehaald. Deze techniek wordt ook wel code behind genoemd. Het maakt de scheiding mogelijk tussen de gebruikersinterface en het afhandelen van de gebeurtenissen.

De interfacecode die wordt geschreven bevindt zich in een .aspx file. Deze kan een Codebehind–verwijzing bevatten naar de code die de gebeurtenissen afhandelt (de applicatielogica genaamd). De code die de gebeurtenis afhandelt kan zich bvb in een .aspx.vb file bevinden als de code in VB.net werd geïmplementeerd. Men kan deze code echter ook in de aspx file zelf onderbrengen. Bij het maken van de applicatie voor de bouw en de inrichting van veestallen heb ik zo veel mogelijk van Codebehind gebruik gemaakt. Voor sommige pagina’s met beperkte functionaliteit werd de code echter bovenaan de aspx-pagina ingevoegd.

Het maken van een webformulier is zoals gezegd zeer eenvoudig. Je neemt de traditionele tag voor het maken van een formulier en voegt daar runat="server" aan toe en sluit af met de gebruikelijke </form> tag. Een webformulier geeft alzo aan dat het formulier op de server in elkaar gezet dient te worden.

Het webformulier wordt deels opgebouwd aan de hand van server controls. Deze server controls moeten zich tussen de twee web form tags bevinden om deel uit te maken van het formulier. Een server control vertelt de webserver hoe de weergave van het besturingselement dient te gebeuren in de browser.

- HOOFDSTUK 2 - 20

Page 22: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Het afhandelen van de code van de server control geschiedt volledig aan de kant van de server en niet bij de cliënt. Door aan een server control runat="server" mee te geven weet de server dat het iets moet doen alvorens de pagina te versturen naar de bezoeker. Als het besturingselement een html element bevat, wordt dit ook wel een HTML control genoemd.

Als je de weergave van een server control wilt gaan veranderen, kun je de server control een attribuut meegeven. Bijna elk server control heeft een attribuut id="..." om de control te benoemen. Verder kun je aan een server control ook code hangen als er iets moet gebeuren na het drukken op een knop bijvoorbeeld. Je kunt dan vanuit de browser van de bezoeker iets laten gebeuren met de server control. Hieronder ziet u de code voor een label server control :

<asp:label id="LabelVoorbeeld" runat="server">.......</asp:label>

In onderstaand voorbeeld komt de op de vorige pagina besproken opbouw van een webformulier duidelijk naar voren. Tussen de form tags in komen de server controls te staan, in dit geval de button control (knop). Aan de knop wordt een unieke naam gegeven door middel van de id en dit kan later worden gebruikt om er code aan vast te maken (zie voorbeeld 2 op deze pagina).

<html> <head> <title> Button Control Voorbeeld </title> </head> <body> <form id=”vb-form” runat=”server”> Dit is een voorbeeld van een <b> webformulier met een knop </b> <asp:button id=”vb-button” Text=”VoorbeeldKnop” runat=”server” /> </form> </body> </html>

In het volgende voorbeeld wordt dan vervolgens de code gemaakt om een server control aan te passen. Door de id weet de code aan welk besturingselement iets aangepast moet worden. In het voorbeeldje zal de tekst “geklikt” op de knop te voorschijn komen als er op de lege knop gedrukt wordt. Hiervoor dient de knop een extra attribuut te hebben, namelijk het onclick – attribuut. Op de code voor het afhandelen van de gebeurtenis wordt later ingegaan als ik het heb over het gebruik van VB.NET in ASP.NET pagina’s.

<script language="vb" runat="server"> sub vb_click(sender As Object, e As EventArgs) vb-button.text = "GEKLIKT" end sub </script>

<form id=”vb-form” runat=”server”> Dit is een voorbeeld van een <b> webformulier met een knop </b> <asp:button id=”vb-button” onclick="vb_Click" runat=”server” /> </form>

Alle besturingselementen in ASP.NET, zoals labels en knoppen, zijn afgeleid van de klasse Control. Deze klasse definieert eigenschappen (properties), methoden en gebeurtenissen (events) die door alle serverbesturingselementen kunnen gebruikt worden. De belangrijkste eigenschappen van de klasse control zijn id, parent, controls, visible (zichtbaarheid), context en viewState.

- HOOFDSTUK 2 - 21

Page 23: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

2.4.3 ASP.NET en VB.NET

Over het algemeen bestaat een ASP.NET pagina niet alleen uit code. Een groot gedeelte van de pagina bestaat uit HTML. Deze HTML dient als sjabloon voor de veranderlijke delen van de pagina. Uw bestaande HTML kennis is dus nog steeds onmisbaar bij het maken van ASP.NET applicaties. Naast uw HTML kennis heeft u echter ook kennis nodig van een programmeertaal die door ASP.NET ondersteund wordt. De talen die standaard door ASP.NET ondersteund worden zijn:

• Visual Basic .NET (VB.NET) • C# • JavaScript (Jscript.NET)

De applicatie voor de bouw en inrichting van veestallen maakt gebruik van VisualBasic.NET voor het afhandelen van de gebeurtenissen. Ik zal het hier dan ook nog alleen maar hebben over het gebruik van VB.NET in ASP.NET.

VB.NET is de opvolger van VB 6.0 en verschilt hier duidelijk van. VB.NET is bijvoorbeeld geheel object georiënteerd gemaakt. In tegenstelling tot Visual Basic, waarin primitieve typen in feite geen objecten waren, zijn ze dit in de .NET versie wel. Vorige versies van Visual Basic boden ook geen ondersteuning voor de implementatie van overerving.De .NET versie doet dit wel. Een ander voordeel van VB.NET is dat je fouten op een gecontroleerde en gestructureerde wijze kunt afhandelen. Het grootste verschil zit hem misschien nog in de syntaxis van VB.NET. Deze is ingrijpend verandert. Voor mensen die vertrouwd waren in Visual Basic te programmeren zal het dus even wennen zijn. Gelukkig betekent de verandering dat de taal meer is gaan lijken op andere objectgeoriënteerde talen zoals C++ en C#.23

Het belangrijkste voordeel van de nieuwe taal (VB.NET) is dat het nu mogelijk is om interfaces en klassen te schrijven die sterk lijken op deze in andere .NET talen. De nieuwe syntaxis maakt het immers mogelijk om :

• overerving van basisklassen toe te passen • interfaces te implementeren • overriding op virtuele functies toe te passen • abstracte basisklassen te maken

Hoe moet je nu de VB.NET code toevoegen aan zo’n ASP.NET pagina ? Eerst en vooral dien je bovenaan de aspx pagina aan te geven dat je wil werken met VB.NET als programmacode voor het afhandelen van de gebeurtenissen. Dit doe je door gebruik te maken van het asp directief van de klasse Page. Alle webpagina’s zijn in ASP.NET afgeleiden van deze klasse. Het directief is als volgt : <%@ Page Language=”VB” %> .

Nu da pagina weet dat er gebruik zal gemaakt worden van VB.NET kun je naar hartelust code gaan toevoegen om de gebeurtenissen die optreden af te handelen. De code voor het afhandelen van de gebeurtenissen moet tussen script tags staan, <script> en </script>. De begintag heeft net zoals Page ook een language-attribuut, dit attribuut krijgt opnieuw de waarde “VB”. Binnen de script tags kun je dan gebruik maken van VB.Net code. Een voorbeeld van het gebruik van VB.NET in ASP.NET zie je hieronder.

<%@ Page Language=”VB” %> <script language="VB" runat="server"> sub vb_function() ... end sub </script>

- HOOFDSTUK 2 - 22

Page 24: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

2.5 ADO.NET

2.5.1 WAT IS ADO.NET ?

In de software-industrie heeft vrijwel alles op de een of andere manier met data te maken. Alle softwareontwikkelaars krijgen op een gegeven moment met data te maken, of het nu werken met een database is, met een tekstbestand, met een spreadsheet of met een andere vorm van gegevensopslag. Ook bij webapplicaties krijgt men steeds meer te maken met gegevensverwerking.24

ADO.NET is de manier om in .NET data aan te spreken en aan te passen. Binnen het .NET framework is ADO.NET de opvolger van het bestaande ActiveX Data Objects (ADO). Het verzorgt de communicatie van de softwarecomponenten met de database server en stelt de ontwikkelaar in staat om geavanceerde handelingen met gegevens te doen, zoals het combineren van verschillende stukken gegevens. Er zijn reeds vele methoden en technieken om gegevens te representeren, te gebruiken en te beheren en er komen er steeds nog nieuwe bij. Zo kunnen de gegevens relationeel, in XML formaat en in andere vormen zijn, maar de benadering voor de ontwikkelaar blijft het zelfde dankzij ADO.NET.

ADO.NET is níet ADO dat is aangepast voor de .NET-infrastructuur, het is meer. Dit wordt duidelijk als je de eigenschappen van ADO.NET bekijkt op het gebied van syntaxis, codeontwerp en migratie. ADO is een nieuw programmeermodel voor gegevenstoegang en kent een aantal grote veranderingen vergeleken met ADO: het is een volledig gedistribueerd model geworden waardoor toepassing van 'optimistic locking' mogelijk wordt, het is geheel gebaseerd op XML en het Recordset- object is verdwenen.

2.5.2 WAT MAAKT ADO.NET ZO STERK ?

ADO.NET kent heel wat voordelen.25 De belangrijkste zijn :

• Onderlinge samenwerking • Schaalbaarheid • Productiviteit • Prestatievermogen

Met de onderlinge samenwerking bedoelt men de mogelijkheid om elementen uit verschillende omgevingen te laten samenwerken of communiceren. In ADO.NET worden de beperkingen bij het uitwisselen van gemeenschappelijke data opgelost door XML te gebruiken. Daar XML tekstgeoriënteerd en eenvoudig te ontleden is, is het een goede keuze als het gaat om een gemeenschappelijk platform-onafhankelijk formaat voor gegevensuitwisseling.

VOORBEELD ONDERLINGE SAMENWERKING

Ter verduidelijking van wat er bedoelt wordt met de onderlinge samenwerking die ADO.NET ondersteunt heb ik een voorbeeldje uitgewerkt. Stel dat computerwinkel A een productenoverzicht heeft in een MS Access databank en computerwinkel B het overzicht van zijn producten bewaart in een Oracle databank. Bedrijf A koopt bedrijf B op en wenst een overzicht te geven op z’n website van alle producten die het nu bezit. Dit kan nu heel eenvoudig dankzij ADO.net. Van zodra de connectie met de 2 databanken is gelegd en de dataset is opgevuld met de gegevens die men wenst te presenteren kan men werken met de gegevens alsof ze afkomstig zijn uit 1 databank. De bewerkingen op de gegevens in de dataset zijn dus identiek of ze nu van een Oracle databank of van een Access databank afkomstig zijn.

- HOOFDSTUK 2 - 23

Page 25: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

De schaalbaarheid is de mogelijkheid om een groeiend aantal gebruikers te blijven bedienen zonder dat de systeemprestaties merkbaar achteruit gaan. Om de schaalbaarheid te verhogen maakt ADO.NET gebruik van losgekoppelde datasets. Wanneer een gebruiker om data vraagt, wordt deze data overgedragen en de verbinding zo snel mogelijk verbroken. Omdat de verbinding tussen de gebruiker en de gegevensbron van korte duur is, kunnen meer gebruikers de server om informatie vragen en wordt het probleem van beperkte verbindingsmogelijkheden opgelost. ADO.NET is hierdoor veel schaalbaarder dan zijn voorgangers.

De productiviteit van ADO.NET is zeer hoog, daar het met ADO.NET mogelijk is om snel robuuste toepassingen te maken voor het benaderen van gegevens. Dit alles is te danken aan het rijke en uitbreidbare componentenobjectmodel van ADO.net, waarover ik meer zal vertellen als ik het heb over de belangrijkste ADO.NET objecten.

Het laatste voordeel van ADO.NET dat hier besproken zal worden is het prestatievermogen. Omdat ADO.NET met losgekoppelde datasets werkt is niet alleen de schaalbaarheid maar ook het prestatievermogen gestegen. De databaseserver vormt immers geen knelpunt meer wanneer het aantal verbindingen toeneemt. Daar ook impliciete pooling van verbindingen mogelijk is, kan de tijd die nodig is om een connectie te openen sterk dalen. ADO.NET bewaart dan de verbindingen naar gegevensbronnen in een pool. Dit maakt het hergebruik van verbindingen mogelijk waardoor het geheel opnieuw tot stand brengen van de verbinding in belangrijke mate wordt vermeden.

2.5.3 BELANGRIJKSTE ADO.NET OBJECTEN 26

Object

Klassenaam

Functie

Connection

OleDBConnection

SQLConnection

Bevat de informatie die nodig is om een koppeling naar de database te maken.

Command

OleDBCommand

SQLCommand

Bevat een opdracht (query) die je naar de databank wil sturen. Verwijst naar een Connection-object via de Connection-eigenschap.

DataAdapter

OleDBDataAdapter

SQLDataAdapter

Geeft opdrachten aan de database en haalt gegevens op in een DataSet. De SelectCommand - eigenschap die het bevat verwijst naar een Command – object.

DataSet

DataSet

Biedt een weergave in het geheugen van een deel van de database. Kan meerdere tabellen en hun onderlinge relaties bevatten.

FIGUUR 5 – ADO.NET Objecten

- HOOFDSTUK 2 - 24

Page 26: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Voordat je in een applicatie gebruik kan maken van de ADO.NET objecten moet je ze beschikbaar maken voor de code. Hiervoor dien je twee naamruimtes te importeren, System.Data en System.Data.OleDB.

<%@Import Namespace=”System.Data” %> <%@Import Namespace=”System.Data.OleDb” %> ‘of System.Data.SqlClient

Opmerking : Wanneer je SQL Server als Database gebruikt kun je ook een alternatieve naamruimte gebruiken met een alternatieve set objecten die specifiek zijn ontworpen en geoptimaliseerd voor SQL Server. De werking van deze SQL Server-objecten is net zoals deze van de standaard ADO.NET objecten, het enige verschil betreft de klassenamen.

Het Connection object is verantwoordelijk voor het maken van de verbinding met de database. De informatie die aan het Connection object dient te worden meegegeven hangt af van het DBMS (Database Management System) waarmee je werkt. In het geval van een Microsoft Access-database hoef je enkel te vertellen dat je access gebruikt en geef je het Connection object het pad en de bestandsnaam van de database zelf. Bij het gebruik van SQL-Server moet je een servernaam, databasenaam, gebruikersnaam en wachtwoord opgeven. Onderstaande code toont hoe je een Connection object aanmaakt.

Dim VBConnect As OleDbConnection = New OleDBConnection

Dit connection object moet dan opgevuld worden met de hierboven vermelde informatie. De provider vertelt het object VBConnect welke DBMS je gebruikt en Data Source bevat de bestandsnaam van de database. Al deze informatie wordt ondergebracht in de ConnectionString van het VBConnect Object. Eens je deze ConnectionString hebt hoef je niet meer over de gebruikte DBMS na te denken. Alle ADO.NET-objecten werken immers op dezelfde manier.

VBConnect.ConnectionString = “Provider=Microsoft.Jet.OLEDB.4.0; & _ Data Source=" & Server.MapPath("\db\material.mdb")

Met het Command object kun je opdrachten maken om gegevens op te halen en ook nog andere bewerkingen op deze gegevens te doen. Deze opdrachten worden dan naar de database gezonden. De CommandText-eigenschap van het Command object bevat deze opdrachten (query’s). Het Command object bevat daarnaast ook een Connection-eigenschap waaraan je het Connection object moet toekennen dat de informatie bevat die nodig is om verbinding te maken met de database.

Dim VBCommand As OleDbCommand = _ New OleDbCommand("Select * from MaterialConstants") VBCommand.Connection = VBConnect

DataAdapter is het object dat het eigenlijke ophalen van de data voor zijn rekening neemt. De hiervoor besproken ADO.NET objecten slaan enkel de juiste informatie op. Het DataAdapter object zal deze informatie gebruiken. Hiervoor dient het VBCommand object aan de DataAdapter te worden gekoppeld.

Dim VBAdapter As OleDbDataAdapter = New OleDbDataAdapter() VBAdapter1.SelectCommand=command1

Om de verbinding tot stand te brengen moet je dan nog de methode open van het Connection object aanroepen. Hiermee wordt de databaseverbinding gemaakt. Als deze faalt, zit er waarschijnlijk een fout in de ConnectionString van het Connection Object.

VBAdapter.SelectCommand.Connection.Open

- HOOFDSTUK 2 - 25

Page 27: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Al de informatie die opgehaald wordt uit de database kan je onderbrengen in een DataSet object. Het is een plek in het geheugen waar opgehaalde gegevens kunnen ondergebracht worden. De gegevens worden opgeslagen in tabelvorm, net zoals dat het geval is in de database. Eveneens kunnen de relaties tussen de tabellen uit de database behouden worden in de DataSet. Het aanmaken van een DataSet object gebeurt net zoals het aanmaken van de andere ADO.NET objecten.

Dim VBDataSet As DataSet = New DataSet

Da DataAdapter wordt dus niet alleen gebruikt om de verbinding tot stand te brengen, maar ook om informatie uit de databank op te halen. Hiervoor wordt de Fill methode van het DataAdapter object gebruikt. Deze methode zal de data die uit de databank wordt opgehaald in de DataSet onderbrengen. Wanneer je deze methode aanroept geef je de DataSet door die je wenst te vullen en de naam die je de tabel in die DataSet wil geven. Deze mag dezelfde zijn als de tabelnaam uit de database. De data die Fill in de DataSet stopt wordt bekomen door het uitvoeren van de opdracht (query) die zich in SelectCommand bevindt.

VBAdapter.Fill(VBDataSet,”VBTabel”)

Om het onderdeel rond ADO.NET af te sluiten zal ik de onderlinge samenhang tussen de verschillende objecten verduidelijken aan de hand van onderstaande figuur.

object DataAdapter methode Fill

object Command eigenschap Command Text

object Connection eigenschap Connection String methode Open

Eigenschap Connection Eigenschap SelectCommand

Tot hier mijn bespredit platform dan wahet platform die ik webapplicatie aan dwerken die aangeha

FIGUUR 6 – Onderlinge samenhang ADO.NET

king van het .NET platform. Er valt nog veel meer te vertellen over t ik er over verteld heb. Doch volstaat deze bondige beschrijving van gemaakt heb in het kader van mijn thesis rond het maken van een e hand van .NET. Voor meer informatie verwijs ik u door naar de ald worden in de referenties achteraan deze thesis.

- HOOFDSTUK 2 - 26

Page 28: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

3. Internationalisatie van een applicatie 3.1 INLEIDING : WAT IS INTERNATIONALIZATION ? Het internet werd oorspronkelijk vooral gebruikt door Engelssprekenden. Het percentage van niet-Engelssprekenden is de laatste jaren echter enorm gestegen. Met het stijgende aantal Aziatische gebruikers en het succes van het internet in al de Europese landen is er nood aan een aantal technieken die websites in de taal van users uit verschillende landen kan weergeven.27 Internationalization biedt hier de oplossing voor. Internationalization is een reeks van technieken om een applicatie te maken die eenvoudig in verschillende talen kan worden weergegeven zonder grote veranderingen te moeten doen aan de code. Internationalization wordt soms afgekort tot i18n.28 De verklaring hiervoor is dat er 18 tekens staan tussen de i en de n van de term internationalization. De karakteristieken van een geïnternationaliseerde applicatie zijn :

• Door het toevoegen van de gelokaliseerde data kan dezelfde applicatie wereldwijd worden gebruikt. Het enige wat men dus moet doen om de applicatie in een bepaalde taal te verkrijgen is de gelokaliseerde data voor die taal aanvullen.

• Tekstuele elementen, zoals menu-items,labels,enz. , worden niet hard-gecodeerd in de code. Ze worden buiten de applicatiecode bewaard en dynamisch verkregen.

• Het ondersteunen van nieuwe talen vergt geen hercompilatie. • Cultuurafhankelijke data, zoals datums en valuta, verschijnen in een formaat dat

overeenkomstig is met de end-user zijn regio en taal. • Localization kan heel snel gebeuren

Localization is het aanpassen van de applicatie voor een bepaalde regio of taal door het toevoegen van lokaal-specifieke componenten en het vertalen van tekst. Lokalization wordt soms afgekort tot l10n, wederom omdat er 10 letters staan tussen de l en de n van de term localization.29 Het grootste gedeelte van de tijd in het lokalisatie-proces wordt besteed aan het vertalen van de tekst. Ander datatypes zoals geluiden en afbeeldingen moeten enkel worden gelokaliseerd als ze cultuurgevoelig zijn. Het onderscheid tussen internationalization en localization is aldus heel simpel. Internationalization is het aanpassen van de applicatie om meertaligheid eenvoudig te kunnen ondersteunen. Localization is het proces waarbij een nieuwe taal of regio wordt toegevoegd zodat de applicatie ook in die taal kan worden weergegeven. Een vraag die u zich misschien stelt is : “Hoe komt een geïnternationaliseerd programma nu de taal en regio van zijn end-user te weten ?”. Dit gebeurt aan de hand van een “locale object”. Een locale object is een identificatie voor de combinatie van de taal en regio van de gebruiker. In de applicatie voor de bouw en de inrichting van veestallen heb ik hiervoor gebruik gemaakt van cookies om de taal van de gebruiker te kunnen achterhalen. Hierover zal ik meer vertellen in het onderdeel “het gebruik van cookies”. In wat volgt zal ik de verschillende technieken bespreken die heden ten dage worden gebruikt voor het internationaliseren van een applicatie. Daarna zal ik het even hebben over hoe het lokaliseren van de applicatie voor een bepaalde taal in zijn werk gaat. 3.2 TECHNIEKEN VOOR INTERNATIONALIZATION 3.2.1 INTERNATIONALIZATION ALGEMEEN Eén van de eerste zaken die je moet doen bij het bouwen van een geïnternationaliseerde applicatie is, zoals reeds aangehaald hierboven, het scheiden van de strings uit de user interface van de applicatie code. Dit is voor alle technieken van internationalization zo.

- HOOFDSTUK 3 - 27

Page 29: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Het programma of de website moet in staat zijn om de strings die verschijnen op labels, menu-items, buttons en andere user interface elementen aan te passen aan de taal die de gebruiker wenst te gebruiken tijdens zijn bezoek aan de site of tijdens het werken met het programma. De applicatie moet bovendien shortcuts, afbeeldingen en icons die cultuurspecifiek zijn kunnen weergeven. Bovendien moet men er ook rekening mee houden dat hetzelfde woord of dezelfde uitdrukking in verschillende talen een verschillende karakterlengte kan hebben. Een voorbeeld hiervan is bijvoorbeeld de startknop. In het engels zal deze “Start” als label hebben, in het frans “démarer”. Er zal dus plaats moeten worden voorzien voor de langste waarde die het woord of de uitdrukking heeft in de talen die de applicatie wenst te ondersteunen. Op het einde doet men er ook goed aan de applicatie te testen in de verschillende talen om te controleren of er voldoende plaats werd opengehouden voor alle strings. Tot slot moet men er ook rekening mee houden dat deze strings niet kunnen gebruikt worden door functies in de applicatiecode. Zo is het bijvoorbeeld niet mogelijk om te controleren op welke knop er werd gedrukt aan de hand van Button.Text. Er zijn verschillende plaatsen waar men de strings die een applicatie gebruikt kan opslaan. Resource files hebben de grootste flexibiliteit en vergen niet zo veel meer werk dan de andere methoden die we hieronder zullen bespreken. 3.2.2 INTERNATIONALIZATION VIA REGISTRY 30 Bij internationalization via de registry worden de strings opgeslagen in verschillende key sections voor elke taal die ondersteunt dient te worden. Als de string variabele string_Language de taal bijhoudt die gebruikt dient te worden, kan het programma onderstaande code gebruiken om bvb. de tekst die op een knop dient te verschijnen te bekomen. Buttton1.Text = GetSetting(App.ProductName, _ string_Language, "Button1", "Name") Deze methode is heel eenvoudig in gebruik. Nadeel is natuurlijk dat al de informatie dient te worden opgeslagen in de registry. Je kan gebruik maken van het RegEdit programma om het gedeelte van de registry die de strings bevat te exporteren en dan de .reg file uit te voeren om de waarden op elke computer te installeren. Dit is echter een nogal complex proces. De waarden moeten bovendien op elke computer afzonderlijk geïnstalleerd en bewaard worden. Andere strategieën zijn daarom beter doordat de waarden maar op 1 plaats moeten bewaard worden voor computers die via een netwerk verbonden zijn. 3.2.3 INTERNATIONALIZATION VIA TEXT FILE 30 Er kan ook gebruik worden gemaakt van een tekstfile voor het opslaan van de strings. De text file kan er dan bijvoorbeeld uitzien zoals het voorbeeld hieronder. English.YesButton:Yes English.NoButton:No : French.YesButton:Oui French.NoButton:Non :

- HOOFDSTUK 3 - 28

Page 30: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Het programma (applicatie) kan deze file dan lezen en zoeken naar lijnen die beginnen met de naam van de taal dat het wenst te gebruiken. De waardeparen kunnen dan worden opgeslagen in een strings_Language collection. Elk paar bestaat uit de stringnaam (bvb YesButton) en de waarde voor deze string in de gekozen taal. De applicatie kan dan een waarde aan een string toekennen op onderstaande manier.

cmdYes.Text = strings_Language("YesButton")

Deze methode is zeer eenvoudig. Bovendien kost het niet zo veel moeite om de stringwaarden te laden in de collectie. Als de tekstfile zich in een shared directory binnen het netwerk bevindt kunnen meerdere computers deze tegelijkertijd gebruiken. Om de strings aan te passen dient ook alleen deze file te worden aangepast en alle computers zullen dan up to date zijn.

Het grote nadeel van deze methode is dat ze alleen tekst kan opslaan. Deze methode kan immers geen afbeeldingen,icons,enz. bijhouden die van taal tot taal kunnen verschillen. 3.2.4 INTERNATIONALIZATION VIA DATABASE 31

Voordeel van een database is dat een database in iets meer security voorziet dan een tekstfile. Het is immers mogelijk een database aan de hand van een paswoord te beschermen en sommige databases laten daarenboven toegang toe voor specifieke users tot bepaalde delen van de database. Een applicatie kan gebruik maken van een query om de strings te selecteren die ze nodig heeft uit de databank. Hieronder ziet u een voorbeeldje.

SELECT * FROM Strings WHERE Language = 'English'

De applicatie kan dan het resultaat van de query opslaan in een collectie zoals bij het gebruik van tekstfiles. Als in de databank de exacte namen van de controls worden gebruikt kan de applicatie de control makkelijk vinden in de controls collection en de waarde opvragen.

Deze methode heeft ongeveer dezelfde sterkten en zwakten als het gebruik van tekstfiles. De database kan shared zijn zodat het hier ook mogelijk is om slechts 1 databank te gebruiken voor meerdere computers. Deze methode werkt het best voor tekstuele data. Het is ook mogelijk om afbeeldingen op te slaan in de database, maar dit is iets moeilijker. Deze methode werd gebruikt voor de ontwikkeling van de applicatie voor de bouw en inrichting van veestallen waarover deze thesis handelt.

3.2.5 INTERNATIONALIZATION VIA RESOURCE FILES 30

Strings kunnen ook worden bijgehouden in resource files. Er zijn 3 strategieën die ik hier zal bespreken met betrekking tot internationalization via resource files. De LoadResourceString functie gebruikt een resource ID nummer als parameter en haalt de corresponderende string uit de resource file. Het programma moet gebruik maken van constanten of een reeks van genummerde waarden om de ID’s te definiëren.

Public Enum StringIDs resourceCmdNo = 101 resourceCmdYes = 102 End Enum Text = LoadResourceString(resourceCmdNo)

- HOOFDSTUK 3 - 29

Page 31: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

De resource file kan meerdere tabellen met strings bevatten en aldus meerdere talen ondersteunen. Tijdens de uitvoering zal de applicatie de juiste tabel selecteren op basis van de LCID (Locale ID) van het systeem. Als er geen tabel bestaat voor de LCID zal de applicatie de eerste tabel gebruiken uit de resource file.

Een 2de strategie maakt gebruik van een offset (1000) voor de basis string ID’s. Elke taal laat men dan overeenstemmen met een bepaald nummer. Engels kan zo bvb offset 0 hebben, Frans ofset 1000 enz.

Public Enum LanguageOffsets langEnglish = 0 langFrench = 1000 End Enum Public Enum LabelText textOkButton = 1 End Enum

Stel nu dat de variabele string_Language de taal offset bevat. Het toekennen van de tekstwaarde voor bvb een knop kan dan als volgt gebeuren :

OkButton.Text = LoadResString(string_Language + textOkButton)

Deze strategie heft het voordeel dat de applicatie expliciet zijn taal kan kiezen waardoor het bvb makkelijk is om de taal te wijzigen tijdens de uitvoering om te testen.

De 3de en tevens laatste strategie gebruikt verschillende resource files voor elke taal. Daar de resource file wordt meegecompileerd in de executable vergt deze aanpak het distribueren van een verschillende executable voor elke taal.

Resource files hebben het grote voordeel dat ze eenvoudig strings en figuren kunnen bijhouden. Nadeel is dat ze gecompileerd zitten in de executable. Elke verandering in de resource file vereist een hercompilatie en herdistributie van het programma.

3.2.6 INTERNATIONALIZATION VIA XML 32

Het basisidee bij internationalization via xml is dat de informatie die verschillend dient te zijn voor verschillende talen of regio’s dient te worden opgeslagen in XML files. Tijdens de uitvoering wordt deze file dan geladen en wordt de correcte informatie voor elke control gelocaliseerd. Deze aanpak vereist geen resource files of andere gecompileerde bronnen. Het enige wat nodig is zijn eenvoudige text files in XML formaat.

Het xml:lang attribuut kan gebruikt worden om de taal en eventueel ook de regio te specificeren van een xml-element. De taal kan gespecificeerd worden aan de hand van een ISO language code1. Optioneel kan de regio ook worden gespecificeerd aan de hand van de ISO country code2. Engels zal bijvoorbeeld als volgt worden voorgesteld :

<element xml:lang=“en”>This is Englisch</element>

Naast het gebruik van de ISO language code is het ook mogelijk om een IANA language code3 (met prefix i-) of een user-gedefinieerde code (met prefix x-) te gebruiken.

1 ISO language code : http://lcweb.loc.gov/standards/iso639-2/langhome.html 2 ISO country code : http://www.iso.org/iso/en/prods-services/iso3166ma/index.html 3 IANA language code : http://www.iana.org/assignments/language-tags

- HOOFDSTUK 3 - 30

Page 32: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

3.3 LOKALISATIE VAN DE APPLICATIE 33

Zoals reeds aangehaald in de inleiding van dit onderdeel staat de term localization voor het aanpassen van de applicatie voor een bepaalde regio of taal door het toevoegen van lokaal-specifieke componenten en het vertalen van tekst. Daar het grootste gedeelte van de tijd in het lokalisatie-proces wordt besteed aan het vertalen van de tekst zal ik het hier even kort hebben over het vertaalproces.

Daar het vertaalproces soms even belangrijk is, of misschien zelfs in sommige gevallen belangrijker, dan de technologie zelf, zijn er een aantal vragen die men zich best stelt bij het ontwerpen van een geïnternationaliseerde applicatie.

• Wie zal de inhoud vertalen ? • Welke talen moet de applicatie ondersteunen ? • Welke gegevens moeten enkel beschikbaar zijn in een aantal gelimiteerde talen ? • Als de taal voor bepaalde gegevens niet wordt ondersteunt, worden deze

gegevens dan getoond in de basistaal of worden ze niet weergegeven ? • Welke taal zal de basistaal zijn ? • …

Men doet er ook best aan zo vlug mogelijk deze vragen in overweging te nemen. Hoe vroeger men start met het aanvatten van het vertaalproces bij de bouw van een applicatie, hoe minder men voor grote problemen zal komen te staan achteraf.

3.4 INTERNATIONALZATION VAN DE APPLICATIE VOOR DE BOUW EN DE INRICHTING VAN VEESTALLEN

Bij het ontwerpen van de applicatie voor de bouw en de inrichting van veestallen heb ik gebruik gemaakt van de techniek via databases. Ik heb hiervoor een Access Databank gekozen omdat het voor deze applicatie vooral om tekstuele informatie gaat die taalafhankelijk is en er reeds een deel van de gegevens in een Access databank waren ondergebracht. Bovendien kost het niet zo veel moeite om de stringwaarden te laden in de collectie. De collectie die ik gebruikt heb is een sortedList met als keywoord de naam van de control in de basistaal. Deze collectie wordt opgevuld met het resultaat van de query die alle records voor de in het session object gespecificeerde taal ophaalt. De code voor het ophalen van de records uit de databank ziet u hieronder :

Dim ds As New DataSet ‘dataset voor het resultaat van de query

Dim connection1 As OleDbConnection = New OleDbConnection("Provider =Microsoft.Jet.OLEDB.4.0; _ Data Source=" & Server.MapPath("\db\strings.mdb"))

Dim command1 As OleDbCommand = New OleDbCommand("Select StringKey, _ StringHolder from Strings where StringLanguage=" & Session("Taal"))

connection1.Open() command1.Connection=connection1 Dim adapter1 As OleDbDataAdapter = New OleDbDataAdapter() adapter1.SelectCommand=command1

ds = new DataSet("Strings")

adapter1.Fill(ds) ‘vult de dataset met de resultaten van de query connection1.Close()

- HOOFDSTUK 3 - 31

Page 33: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

In de code op de vorige pagina werd reeds gebruik gemaakt van het session-object. Dit object wordt onder andere gebruikt om de taal bij te houden van de bezoeker tijdens zijn bezoek aan de site. Wanneer de bezoeker de webapplicatie binnentreedt zal dit session-object onmiddellijk worden opgevuld met de voorkeurstaal van de bezoeker. Gedurende zijn verblijf op de site kan de voorkeurstaal van de bezoeker dan uit dit session-object worden gelezen. De verdere bespreking van de werking van het session-object vind u enkele pagina’s verder in deze thesis bij het onderdeel “Session Object in ASP.NET”.

Wanneer alle records voor een bepaalde taal zijn opgehaald uit de string databank worden deze toegevoegd aan de SortedList collection. Hiervoor wordt de dataset met de resultaten van de query overlopen en voor elke record het keywoord en de string in de gespecificeerde taal aan de SortedList toegevoegd.

<object id="StringDict" runat="server" scope="Session" class="System.Collections.SortedList" /> Dim RowLoopIndex As Integer Dim SKey As String Dim SHolder As String

For RowLoopIndex = 0 To (ds.Tables(0).Rows.Count -1) SKey = ds.Tables(0).Rows(RowLoopIndex).Item("StringKey") SHolder = ds.Tables(0).Rows(RowLoopIndex).Item("StringHolder") StringDict.Add(Skey,SHolder) Next RowLoopIndex

End Sub

In de asp.net files worden de juiste strings ingevuld door de SortedList collection te bevragen met het keywoord waarvan men de string wenst te bekomen. Hoe dit in zijn werk gaat ziet u in onderstaande code :

<%=StringDict("StartLink")%>

- HOOFDSTUK 3 - 32

Page 34: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

4. Cookies & Session Object in ASP.NET

4.1 COOKIES

4.1.1 WAT ZIJN COOKIES ?

Hoe een webapplicatie internationalisatie kan ondersteunen werd in het deel omtrent internationalization reeds besproken. Maar hoe weet de webapplicatie nu welke taal de gebruiker wenst te gebruiken bij zijn bezoek aan de applicatie? Een eerste mogelijkheid is dat de applicatie elke keer opnieuw de gebruiker naar zijn keuze vraagt. Dit is echter niet zo gebruiksvriendelijk. Beter zou zijn moest de applicatie de informatie over de taalkeuze van de gebruiker ergens kunnen opslaan. Deze informatie kan op 2 plaatsen worden bijgehouden, ofwel op de server ofwel bij de client zelf. Om de informatie bij te houden op de server zal er steeds identificatie nodig zijn om te achterhalen welke taal de gebruiker verkiest. Langs de clientzijde is dit niet nodig. Daar gebruiken we cookies voor.

Een cookie is een klein tekstbestand dat door de browser van de client wordt opgeslagen op diens harde schijf. De browser maakt deze tekstbestanden wanneer het daar opdracht toe krijgt door een website. De website is ook de leverancier van de informatie die in dat tekstbestand dient opgeslagen te worden.34

Wanneer een bezoeker enige tijd nadien terugkeert naar de website waarvoor hij een cookie op z’n harde schijf heeft staan dan zal de website de browser naar de informatie in deze cookie kunnen vragen. De naam van de cookie is meestal de naam van die website. Als de browser de cookie, waarnaar de website vraagt, vindt op z’n harde schijf stuurt hij de informatie uit deze cookie terug naar de site. Bij de applicatie voor de bouw en inrichting van veestallen heb ik deze techniek gebruikt om de taal en de datum van het laatste bezoek aan de site bij te houden.

4.1.2 HOE COOKIES MAKEN IN ASP.NET ?

Om cookies te maken heb je eerst en vooral een cookieklasse nodig. Het .NET framework voorziet hierin door middel van de naamruimte System.Web. Deze bevat een klasse HttpCookie. Daar System.Web automatisch wordt geïmporteerd hoef je deze naamruimte niet zelf te importeren en kan je de klasse in elke aspx file gebruiken. Om nu een cookie te maken dien je een variabele aan te maken van het type HttpCookie-object.35

Dim VBCookie As HttpCookie = New HttpCookie("NaamWebsite")

De cookie bevat informatie in sleutel/waarde-paren, vergelijkbaar met een hashtabel. De sleutel is de naam die wordt gegeven aan de informatie, zoals taal en datum in de applicatie voor de bouw en de inrichting van veestallen. De waarde is de informatie zelf, zoals Nederlands en 15/04/03. Als het cookie object is gemaakt kan je er deze sleutel/waarde-paren aan toevoegen met behulp van de eigenschap values en de methode Add.

VBCookie.Values.Add("Taal",Nederlands) VBCookie.Values.Add("Datum",Today)

Om te voorkomen dat de cookie te lang wordt bijgehouden op de harde schijf van de gebruiker kan men een datum meegeven aan de cookie wanneer deze moet worden verwijderd. Hiervoor heeft het object HttpCookie de eigenschap Expires.

VBCookie.Expires =#12/31/2010#

- HOOFDSTUK 4 - 33

Page 35: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

4.1.3 HOE COOKIES VERZENDEN IN ASP.NET ?

Nu de cookie is aangemaakt op de server moet deze nog op de harde schijf van de gebruiker komen. Hiervoor dient het Response object te worden gebruikt. Het Response object zal de cookie naar de browser van de gebruiker versturen en vervolgens zal deze de cookie opslaan op de client-machine. Dit doet het aan de hand van de Cookies eigenschap.35

De eigenschap Response.Cookies vertegenwoordigt immers de cookies die moeten worden opgeslagen door de browser van de gebruiker. Met de methode Add kan een object van het type HttpCookie worden opgegeven aan deze eigenschap. De code voor het versturen van de cookie is dan als volgt :

Response.Cookies.Add(VBCookie)

4.1.4 HOE COOKIES TERUGKRIJGEN IN ASP.NET ?

Hoe weet de webapplicatie nu in welke taal het de gebruiker moet verwelkomen bij zijn bezoek aan de applicatie? Hiervoor kan de applicatie nagaan of de gebruiker reeds een cookie heeft staan op zijn harde schijf die deze informatie bevat. Als de bezoeker de webapplicatie al eens bezocht heeft en toen zijn taal heeft gespecificeerd zal er een cookie voor deze applicatie op diens machine terug te vinden zijn. Tenminste als de browser van de gebruiker cookies ondersteunt. Anders zal de gebruiker steeds opnieuw zijn taal moeten kiezen.

Wanneer er zo’n cookie te vinden is op de clientmachine kan de server deze cookie opvragen. Hiervoor wordt het Request object gebruikt. Het Request object heeft net zoals het Response object een eigenschap Request.Cookies.36 Deze zal de browser aanzetten om de cookie waarom de server vraagt te lezen van de harde schijf van de gebruiker en de gewenste informatie door te sturen naar de server.

Om te controleren of er een cookie bestaat op de clientmachine van de applicatie kan je onderstaand trucje uitvoeren. Dit stukje code vraagt de browser om de cookie en controleert dan of deze wel informatie bevat.

Dim cookie As HttpCookie = New HttpCookie("NaamWebsite") cookie = Request.Cookies("NaamWebsite") ‘haalt de cookie op If (cookie Is Nothing) Then … ‘geen cookie gevonden Wanneer er een cookie met informatie wordt gevonden moet men het sleutel/waarde-paar opvragen waarvoor men de informatie wenst te bekomen. Voor de webapplicatie voor de bouw en inrichting van veestallen dien ik zo bijvoorbeeld de taal en de datum van het laatste bezoek aan de website te weten te komen. Dit om de gebruiker te kunnen verwelkomen in zijn eigen taal en hem mede te delen wanneer hij het laatst de site heeft bezocht. Hiervoor dien ik dus de informatie omtrent de taal en de datum uit de cookie uit te lezen. Dit gaat als volgt : Request.Cookies("NaamWebsite")("Taal") Request.Cookies("NaamWebsite")("Datum")

Opmerking : Het dient wel opgemerkt te worden dat de informatie die zich in de cookies bevindt na verloop van tijd kan veranderen. Deze veranderingen moeten dan ook doorgevoerd worden in de cookies op de clientmachine. Hiervoor dient de veranderde cookie opnieuw naar de client te worden gestuurd. Vb. Datum van laatste bezoek.

- HOOFDSTUK 4 - 34

Page 36: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

4.1.5 WAT ALS DE GEBRUIKER GEEN COOKIES TOELAAT ?

Daar de applicatie voor de bouw en de inrichting van veestallen gebruik maakt van cookies om de taal van de gebruiker en diens laatste bezoek bij te houden, moest er ook rekening gehouden worden met het feit dat sommige gebruikers geen cookies toelaten. Daarvoor wordt er steeds eerst gecontroleerd of de gebruiker cookies toelaat. Als de gebruiker zijn browser geen cookies toelaat wordt de gebruiker naar de eerste pagina omgeleid om daar de keuze van zijn taal op te geven. De gebruiker zal dus bij elk bezoek aan de site in dat geval zijn taal opnieuw moeten kiezen. Indien de gegevens omtrent de taal en datum echter op de server zouden worden bijgehouden had dit probleem er niet geweest. Het bijhouden op de server vereist echter steeds identificatie.

Hoe er wordt gecontroleerd of de gebruiker zijn browser cookies ondersteunt37 ziet u in onderstaande code. Deze controle heeft een dubbele functie. Wanneer een bezoeker nog geen cookie staan heeft op z’n site (of deze heeft verwijderd) stuurt deze code de bezoeker terug naar de pagina voor het kiezen van de taal. Deze code probeert de cookie op te halen via de browser van de gebruiker aan de hand van een Request.Cookies opdracht. Als er geen cookie te vinden is of de browser geen cookies ondersteunt dan zal de variabele cookie die het resultaat van deze actie bevat leeg zijn. Dit controleren is dus voldoende. Als cookie leeg is wordt de gebruiker aan de hand van een Response.Redirect naar diens browser, omgeleid naar de beginpagina waar hij/zij de taal kan kiezen.

Dim cookie As HttpCookie = New HttpCookie("Agri-Vet") cookie = Request.Cookies("Agri-Vet") If (cookie Is Nothing) Then Response.Redirect("index.aspx") End If

Opmerking : Cookies kunnen door verschillende browsers op een andere manier worden opgeslagen. Hierdoor kan het voorvallen dat verschillende browsers op een zelfde machine niet in staat zijn om elkanders cookies te lezen. Zo kan het dus voorvallen dat als je een pagina met cookies bezoekt aan de hand van Internet Explorer deze pagina bij een volgend bezoek via Netscape deze cookie niet kan vinden. Meestal gebruiken de gebruikers dezelfde browser voor al hun internetactiviteiten dus zal dit probleem slechts zelden opduiken.

4.1.6 ZIJN COOKIES WEL VEILIG ?

Wanneer men gebruik maakt van cookies moet men zich natuurlijk ook vragen stellen omtrent het al dan niet veilig zijn van de informatie die via cookies wordt uitgewisseld. 38 Cookies zijn een speciale vorm van user input en moeten daardoor ook met alle voorzichtigheid worden behandeld. De gebruiker kan immers heel eenvoudig de informatie in de cookies raadplegen en aanpassen. Dit doordat de cookie zich op de gebruiker zijn computer zelf bevindt. Als de gebruiker slechte bedoelingen heeft kan hij de informatie dus aanpassen. Wanneer de browser dan de cookie opvraagt krijgt deze verkeerde informatie. Er zijn dus een aantal zaken waar je best rekening mee houdt wanneer je werkt met cookies. Ik som ze hieronder even op.

• Sla nooit geheime gegevens op in een cookie (user name, paswoord, credit card nummer). De informatie in cookies ligt immers voor het grijpen op de gebruiker zijn computer.

• Wees voorzichtig met de informatie die je terugkrijgt via de browser van de bezoeker. Ga er niet zomaar vanuit dat de data in de cookie dezelfde is als wanneer je hem naar de browser stuurde.

- HOOFDSTUK 4 - 35

Page 37: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Een trucje om hier veilig mee om te springen is het gebruik van HTML encoding op de inhoud van de cookie alvorens de waarde ervan weer te geven in een webpagina. Dit is een standaard techniek die gebruikt wordt om informatie afkomstig van de gebruiker onschadelijk te maken alvorens ze te tonen. De code die hiervoor kan gebruikt worden ziet u hieronder.

Server.HtmlEncode(Request.Cookies("NaamWebsite")("Taal")) Server.HtmlEncode(Request.Cookies("NaamWebsite")("Datum"))

• Daar cookies tussen de browser en de server worden verstuurd in tekstvorm kan iedereen die de webtrafiek onderschept de cookie lezen. Om dit te voorkomen kan je een cookie eigenschap instellen die er voor zorgt dat de cookie enkel kan worden verzonden als de connectie gebruik maakt van de “Secure Sockets Layer”. SSL beschermt de cookie niet tegen het lezen of aanpassen terwijl het op de gebruiker zijn computer is, maar wel terwijl de cookie verzonden wordt van de gebruiker naar de server of omgekeerd.

4.2 SESSION OBJECT

4.2.1 WAT IS EEN SESSIE ?

We praten over een sessie vanaf een gebruiker een pagina van een website opvraagt. Alle pagina's die de gebruiker vervolgens opent op deze website behoren tot dezelfde sessie. Een sessie eindigt als de browser gesloten wordt of als de gebruiker voor een bepaalde tijd geen pagina's meer van deze website heeft opgevraagd.

4.2.2 WAT IS EEN SESSION OBJECT ?

Binnen een sessie is het handig om gegevens te bewaren die relevant zijn voor de gebruiker, bijvoorbeeld een gebruikersnaam en password zodat we weten of de gebruiker toegang heeft tot bepaalde gegevens. Het zou vervelend zijn als de gebruiker deze gegevens telkens weer op zou moeten geven. We kunnen deze gegevens opslaan in het Session object. 39 In de applicatie voor de bouw en de inrichting van veestallen wordt de taalkeuze die uit de cookie wordt opgehaald in het session object bijgehouden. Zo hoeft men maar 1 keer de cookie op te halen, bij het begin van het bezoek aan de website.

4.2.3 HOE MAAK JE EEN SESSION OBJECT ?

Om een session object te gebruiken moet dit eerst aangemaakt worden, net als alle andere variabelen. Hieronder ziet u hoe dat gebeurt.40 De session-variabele “Taal” krijgt de waarde van de taal die in de cookie van de gebruiker terug te vinden is.

Session("Taal") = Request.Cookies("StockFarm")("Taal")

Het uitlezen van een session-variabele gaat op een bijna identieke manier als het weergeven van een record uit een database.

Je taal is: <%= Session("Taal") %>

Het goede van de session is nu dat elke bezoeker een eigen waarde krijgt. Ook al zijn er op dat moment 100 bezoekers op je site, elke bezoeker wordt geconfronteerd met zijn/haar eigen naam.

- HOOFDSTUK 4 - 36

Page 38: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Als de bezoeker vervolgens de site verlaat, houdt de server het session object nog even in het geheugen. Standaard neemt de server 20 minuten van geen handelen van de bezoeker voordat de variabele wordt weggegooid. Bedenk wel dat dit ten koste gaat van de snelheid van de site als er veel bezoekers komen. De mogelijkheid bestaat echter om de server opdracht te geven de variabele eerder weg te gooien. Het instellen van de timeout gebeurt in de web.config file. De bespreking van deze file volgt in het volgende onderdeel van deze thesis.

Session.Timeout = 10

In bovenstaand voorbeeld wordt de tijd van een sessie dat deze geleegd moet worden als er niets gebeurt gezet op 10 minuten. Als de bezoeker na 10 minuten van niets doen de pagina weer opvraagt wordt een nieuwe sessie gestart. Veel tellers werken ook met dit principe. Op die manier kun je voorkomen dat 1 bezoeker 10 keer geregistreerd wordt door op vernieuwen te drukken.

4.2.4 HOE WERKT EEN SESSION OBJECT ?

De waarden in het Session object worden opgeslagen in het geheugen van de server. Om bij te houden welke sessie van een bepaalde gebruiker is, wordt er een cookie naar de browser gestuurd met een unieke waarde erin: de SessionID.41 Iedere keer als de browser een aanvraag doet, wordt deze cookie meegestuurd en weet de server welke sessie erbij hoort. Deze cookie wordt ongeldig als de browser gesloten wordt, of er 20 minuten verstreken zijn sinds de laatste aanvraag.

In de hierboven beschreven methode moet de gebruiker zijn browser dus cookies toelaten om te kunnen werken met een session object. In sommige gevallen laat de browser dit niet toe, zoals reeds aangehaald enkele pagina’s terug onder “Wat als de gebruiker geen cookies toelaat”. Om dit probleem te verhelpen kan men in ASP.NET gebruik maken van cookieless session state.42 Hiervoor dient men cookieless="true" toe te voegen aan de declaratie van de session state. Deze declaratie gebeurt in de web.config file. De bespreking van de web.config file volgt direct na dit onderdeel omtrent het session object.

De cookieless session state maakt het mogelijk om voor gebruikers die geen cookies accepteren ook een ASP.NET session object aan te maken. Dit gebeurt aan de hand van “URL rewriting”, een techniek die de URL aanpast door er een ID aan toe te voegen die de sessie identificeert. Hieronder ziet u een voorbeeld.

http://local/Application/SessionState.aspx

wordt via URL rewriting omgezet naar

http://local/(sessionid)/Application/SessionState.aspx

De werking van deze URL rewriting is heel eenvoudig. ASP.NET past alle relatieve links die het vindt in de pagina aan met de ID die de sessie identificeert. Zolang de gebruiker dus het pad van links volgt op de site zal de session state bewaard blijven. Als echter de URL door de gebruiker zelf wordt herschreven zal de session state verloren gaan. Dit gebeurt echter niet zo vaak daar de gebruiker meestal een website doorzoekt door het klikken op links in de pagina.

- HOOFDSTUK 4 - 37

Page 39: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

5. Global.asax en web.config

5.1 GLOBAL.ASAX

5.1.1 WAT IS GLOBAL.ASAX ?

Het bestand global.asax is de ASP.NET equivalent van de global.asa file die bestaat onder ASP. Het is de applicatiefile die zich in de root van de applicatie bevindt.43 Het biedt een plek waar je hoofdzakelijk code kunt zetten die reageert op applicatie- en sessiegebeurtenissen. Deze code geldt dan voor de hele toepassing. Daarnaast kun je er ook nog ander zaken in onder brengen, maar daarover straks meer.

Het gebruik van de global.asax file bij het ontwerpen van een applicatie in ASP.NET is bovendien optioneel. Als je de file niet definieert gaat het ASP.NET page framework er vanuit dat je geen gebruik zal maken van applicatie- of sessiegebeurtenissen.

De global.asax file is daarnaast ook zo geconfigureerd dat elke directe URL aanvraag ernaar automatisch wordt verworpen. Externe gebruikers kunnen de code in deze file dus niet downloaden of zien.

5.1.2 APPLICATION OBJECT

Wat het session object is en hoe het werkt heb ik reeds eerder in deze thesis beschreven. Voor de bespreking van global.asax is het echter ook handig om weten wat het application object juist is en wat het juist doet. Dit omdat we het in wat volgt gaan hebben over hoe je code kan schrijven in global.asax die reageert op gebeurtenissen van het application object.

Het application object maakt het mogelijk gegevens te delen tussen alle pagina's in een applicatie.44 Met het Application object kunnen we bijvoorbeeld :

• een teller maken die telt hoe vaak een pagina bezocht is • bijhouden hoeveel sessies er al geweest zijn • bijhouden hoeveel sessies er momenteel actief zijn • gegevens opslaan over de database koppeling, of andere waarden die we door de

hele site nodig hebben.

Hoe de informatie wordt opgeslagen in het application object en hoe men deze informatie terug kan opvragen is analoog als bij het session object.

Application("Teller") = Application("Teller") + 1

Het aantal bezoekers aan deze pagina is = <%= Application("Teller") %>

Daar het application object door meerdere gebruikers tegelijkertijd kan bekeken of aangepast worden moet er met alle voorzichtigheid worden omgesprongen met de informatie die zich in de variabelen van het application object bevinden.

Stel immers dat de bovenstaande code voor een teller tegelijk door twee verschillende mensen bekeken zou worden. Doordat ASP niet alle scripts meteen helemaal afmaakt, maar soms de uitvoering kan stoppen om even een ander script (deels) uit te voeren, zou het zo kunnen zijn dat de waarde die je ziet niet klopt. De waarde zou namelijk opgehoogd kunnen zijn, daarna opgehoogd kunnen zijn door andere gebruikers en daarna pas in uw browser getoond worden. Zo krijg je dan een foutieve waarde te zien.

- HOOFDSTUK 5 - 38

Page 40: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Bij een teller is dit nu niet zo belangrijk, maar het kan zijn dat het wel om informatie gaat die belangrijk is. In dat geval kun je de Lock methode gebruiken om ervoor te zorgen dat er geen andere gebruikers zijn die tegelijk toegang krijgen tot de waardes in het Application object.45 Omdat dit vertragend werkt moet dit alleen gedaan worden als het nodig is, waarna zo snel mogelijk de Unlock methode wordt gebruikt.

Het gebruik van de Lock en Unlock methode zie je in onderstaand voorbeeld.

Application.Lock Application("Teller") = Application("Teller") + 1 Application.Unlock <% Application.Lock %> Het aantal bezoekers aan deze pagina is = <%= Application("Teller") %> <% Application.Unlock %>

5.1.3 APPLICATIE EN SESSIEGEBEURTENISSEN

Zoals reeds gezegd biedt het global.asax bestand een plek waar je code kunt schrijven om te reageren op gebeurtenissen van de objecten Application en Session. Er zijn een groot aantal gebeurtenissen waarop je allemaal kan reageren via de global.asax file. De belangrijkste som ik hieronder even op.46

• Session_OnStart : Doet zich voor telkens als een nieuwe gebruiker een pagina benadert die bij de toepassing hoort. Deze gebeurtenis kan worden gebruikt om sessievariabelen en objecten op sessieniveau te initialiseren en om een databaseverbinding te beginnen.

• Session_OnEnd : Doet zich voor wanneer een time-out van een sessie optreedt.

Deze gebeurtenis kan worden gebruikt voor het opschonen en het sluiten van een databaseverbinding. Daarnaast kan ze ook gebruikt worden om eventuele belangrijke sessievariabelen op te slaan die gemaakt zijn terwijl de gebruiker op de site was.

• Application_OnStart : Doet zich eenmaal voor, wanneer de eerste gebruiker

een pagina in deze toepassing benadert. Kan worden gebruikt om informatie op te halen of te initialiseren die in alle sessies in de toepassing gebruikt gaat worden.

• Application_OnEnd : Doet zich net als Application_OnStart maar eenmaal

voor, wanneer de gebruiker de toepassing verlaat of als de server wordt afgesloten. Kan worden gebruikt om variabelen of objecten op toepassingsniveau te verwijderen.

• Application_OnBeginRequest : Doet zich voor telkens als een pagina in de

toepassing wordt opgevraagd, voordat aan het verzoek wordt voldaan.

• Application_OnEndRequest : Doet zich voor telkens nadat aan een verzoek is voldaan. Dit is de laatste gebeurtenis die een effect op de reactie van de server kan hebben.

Het is niet nodig om in het global.asax bestand code te schrijven om te reageren op al deze gebeurtenissen. Enkel voor de gebeurtenissen waarop je wenst te reageren dien je code toe te voegen. Enkele van deze gebeurtenissen kunnen bijvoorbeeld gebruikt worden om toepassingsvariabelen bij te houden en aan te passen. Een voorbeeld hiervan krijgt u op de volgende pagina.

- HOOFDSTUK 5 - 39

Page 41: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

5.1.4 VOORBEELD VAN EEN GLOBAL.ASAX FILE

In de applicatie voor de bouw en de inrichting van veestallen heb ik ook enkele van de op de vorige pagina beschreven gebeurtenissen gebruikt. Ik zal een deel van de code van de global.asax file die ik daarvoor gebruikt heb even bespreken als voorbeeld.

<script runat="server">

Sub Application_OnStart(Sender As Object, E As EventArgs) Application("TotalSessions")=0 Application("CurrentSessions")=0 End Sub Sub Session_OnStart(Sender As Object, E As EventArgs) Dim cookie As HttpCookie = New HttpCookie("StockFarm") cookie = Request.Cookies("StockFarm") If Not (cookie Is Nothing) Then Session("Taal")=Request.Cookies("StockFarm")("Taal") Cookie.Expires =#12/31/2010# Cookie.Values("Datum")=Today Response.Cookies.Add(Cookie) Load_Strings() Else Response.Redirect("index.aspx") End If Application.Lock Application("TotalSessions") = CInt(Application("TotalSessions"))+1 Application("CurrentSessions") = CInt(Application("CurrentSessions"))+1 Application.Unlock End Sub Sub Session_OnEnd(Sender As Object, E As EventArgs) Application.Lock Application("CurrentSessions") = CInt(Application("CurrentSessions"))-1 Application.Unlock End Sub </script> Het eerste dat u wellicht zal opvallen aan dit bestand is dat het niet zoals ASP.NET-pagina’s begint met de instructie @page. Er staat helemaal geen instructie bovenaan, omdat het niet nodig is. In het bestand global.asax hoef je ook nooit HTML te zetten, zoals u wellicht misschien ook al had opgemerkt. Het script houdt 2 toepassingsvariabelen bij, TotalSessions & CurrentSessions. TotalSessions houdt het aantal sessies voor deze toepassing bij gedurende de levensduur van de toepassing. CurrentSessions houdt bij hoeveel mensen op dat moment een actieve sessie hebben met deze toepassing. Wanneer de toepassing de eerste keer start worden beide toepassingsvariabelen ingesteld op 0. Dit gebeurt via Application_OnStart. Telkens als een nieuwe sessie begint treedt de Session_OnStart gebeurtenis op. Als reactie hierop worden beide getallen verhoogd met één. Wanneer een sessie eindigt, Session_OnEnd, wordt de variabele CurrentSessions verminderd met één. Zoals reeds vermeld bij de beschrijving van het Application Object maken we ook hier gebruik van Lock en Unlock om de informatie in de toepassingsvariabelen met alle voorzichtigheid te behandelen.

- HOOFDSTUK 5 - 40

Page 42: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

5.1.5 HET GEBRUIK VAN @IMPORT IN GLOBAL.ASAX In het bestand global.asax kun je niet alleen code schrijven die reageert op applicatie- en sessiegebeurtenissen, maar je kunt er ook instructies inzetten. De belangrijkste instructie is waarschijnlijk @import.47 Deze zal ik hier bespreken.

Het framework van ASP.NET bevat een groot aantal classes waaruit je kunt putten voor het maken van je site. Een class library wordt het genoemd. Een class bevat een hoeveelheid code die klaar is voor gebruik. Het enige dat je moet doen is de class op de juiste manier oproepen en gebruiken. Een class kun je dus zien als een bibliotheek met een hoeveelheid gegevens die je daaruit kunt halen om te gebruiken. Om zulks een class te kunnen gebruiken moet je die aanroepen met behulp van een namespace bovenaan de pagina. De eenvoudigste manier om een naamruimte op te geven is via de @import instructie.

De instructie @import is een snelle en eenvoudige manier om, aan het begin van je pagina, te zeggen :“Ik ga dingen uit deze naamruimte gebruiken, dus maak het beschikbaar overal op deze pagina.” Alle objecten uit die pagina worden dan beschikbaar voor de pagina.

Wanneer je de instructie @import in global.asax gebruikt geldt het voorgaande voor de hele toepassing. Als je bijvoorbeeld de naamruimtes System.Data en System.Data.OleDb beschikbaar wilt maken voor elke pagina in de toepassing (zonder een @import bovenaan elke pagina te zetten) zet je onderstaande regels bovenaan in het global.asax bestand. Deze zorgen ervoor dat alle objecten uit deze naamruimtes beschikbaar worden op alle pagina’s van de toepassing.

<%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OleDb" %> 5.1.6 SERVER-SIDE OBJECT TAGS De <object> tag kan gebruikt worden om nieuwe applicatie- en sessievariabelen aan te maken en te gebruiken. De declaratie van deze variabelen kan eveneens in de global.asax file worden ondergebracht. Deze variabelen worden dan geladen wanneer de applicatie wordt geladen en zijn beschikbaar gedurende de ganse applicatie.48 De <object> tag kan 3 verschillende vormen aannemen, afhankelijk van het referentie-type van het object dat gecreëerd wordt. <object id="id" runat="server" scope="scope" class="Class Name"> <object id="id" runat="server" scope="scope" progid="COM ProgID"/> <object id="id" runat="server" scope="scope" classid="COM ClassID"/> In de tags worden een aantal eigenschappen gedefinieerd :

• Door Id te specificeren kan je het object uniek identificeren en kan je het gebruiken op alle pagina’s van de toepassing.

• Runat moet op server worden gezet opdat het object in ASP.NET zou worden

gecreëerd. Alle niet-server objecten worden immers door de compiler geïnterpreteerd alsof ze naar de client moeten worden gestuurd om afgehandeld te worden.

- HOOFDSTUK 5 - 41

Page 43: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

• Scope definieert het bereik van het object. Er zijn 3 verschillende mogelijkheden voor het bereik : pipeline, application en session. Application geeft aan dat het bereik van het object zich uitstrekt over de ganse applicatie. Session beperkt dit bereik tot de sessie van de gebruiker waarin het object werd aangemaakt. Pipeline beperkt het bereik tot de pagina waarin het object werd aangemaakt.

• Class specificeert de .NET framework class waarvan een object dient te worden

aangemaakt. In de applicatie die ik gemaakt heb voor mijn thesis gebruik ik deze vorm van <object>-tag voor de creatie van de taalafhankelijke Stringverzameling en een DataSet om gegevens uit databanken in te bewaren. De objecten die aldus worden gecreëerd zijn toegankelijk op alle pagina’s die behoren tot de applicatie.

<object id="StringDict" runat="server" scope="Session" class="System.Collections.SortedList" /> <object id="DS" runat="server" scope="Session" class="System.Data.DataSet" />

• ProgID en ClassID verwijzen naar de COM component die gecreëerd dient te

worden. Op de creatie en het gebruik van COM componenten ga ik echter niet verder op in daar ik er geen gebruik van gemaakt heb in de applicatie voor de bouw en de inrichting van veestallen.

5.1.7 FOUTAFHANDELING VIA GLOBAL.ASAX In de applicatie voor de bouw en de inrichting van veestallen heb ik ook gebruik gemaakt van de global.asax file om de afhandeling van fouten te doen die niet werden opgevangen door andere foutafhandelende technieken op de website (zoals try-catch). Hiervoor maak ik gebruik van de Application_Error gebeurtenis.49 Deze gebeurtenis treedt op als er binnen de applicatie een fout is opgetreden die niet werd opgevangen. Aan de hand van Server.GetLastError() krijg je de exception class die een gedetailleerde beschrijving van de fout bevat. De code voor het afhandelen van fouten via global.asax ziet u hieronder. Deze code geeft een gedetailleerde beschrijving van de opgetreden fout. Sub Application_Error(Sender As Object, E As EventArgs) Response.Write(" Error! <br>" + Server.GetLastError().Message) Response.End() End Sub In de applicatie die ik voor mijn thesis gemaakt heb, wordt de gebruiker op de hoogte gebracht van de fout in zijn eigen taal. Daarvoor wordt hij doorgestuurd naar een taalafhankelijke foutpagina. Dit gaat zo : Sub Application_Error(Sender As Object, E As EventArgs) If Session("Taal")=1 Then Response.Redirect("Nerror.html") ElseIf Session("Taal")=2 Then Response.Redirect("Eerror.html") ElseIf Session("Taal")=3 Then Response.Redirect("Ferror.html") Else Response.Redirect("Nerror.html") End If End Sub

- HOOFDSTUK 5 - 42

Page 44: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

5.2 WEB.CONFIG 5.2.1 MACHINE.CONFIG versus WEB.CONFIG Met ASP.NET is het configureren van de toepassing net zo eenvoudig als het bewerken van een tekstbestand. Er zijn immers geen ingewikkelde configuratietoepassingen voor de webserver, geen registerinstellingen en geen systeembeheerderbevoegdheden vereist. Als je het .NET-framework hebt geïnstalleerd op een webserver halen alle ASP.NET toepassingen hun configuratie-informatie immers uit een bestand : machine.config. Dit bestand is een lang XML bestand met configuratie-informatie. Als het echter gaat om specifieke configuratie-instellingen van je ASP.NET-toepassing heeft het bestand machine.config niet de doorslaggevende stem. Daarvoor bestaat er immers een ander bestand : web.config.50 Het bestand is net zoals machine.config opgemaakt met behulp van XML. Het bestand web.config moet je in de hoofdmap van je toepassing zetten waarop je de specifieke configuratie-instellingen wil toepassen. De toepassing gebruikt dan alle configuratie-instellingen die zijn opgegeven in machine.config, behalve de instellingen die zijn gewijzigd in de web.config file van de toepassing. Dit wil dus zeggen dat het bestand web.config prioriteit heeft en de instellingen van machine.config overschrijft. Het is bovendien niet nodig om alle configuratie-informatie van machine.config te herhalen in web.config. Je hoeft er enkel de dingen in te zetten die je wenst te veranderen. Als je dus maar één instelling wilt veranderen is het bestand web.config heel kort, namelijk maar één instelling. 5.2.2 HOE IS WEB.CONFIG OPGEBOUWD ? 51 Zoals reeds aangehaald hierboven gebruikt het bestand web.config XML. Het bestand definieert zijn eigen set met tags en regels over hoe ze worden gebruikt. Ik zal hier kort even de belangrijkste tags en regels voor het bestand web.config bespreken. Ten eerste staat alles in een web.config bestand tussen de tags <configuration>. Deze tag is vergelijkbaar met de <html>-tag in een webpagina. <configuration> … </configuration> Tussen deze tags kun je diverse dingen opgeven met betrekking tot de configuratie van je applicatie. Ik zal er hiervan slechts 2 bespreken. Ik zal het immers enkel hebben over diegene die ik gebruikt heb in mijn toepassing. Dat zijn ook de 2 belangrijkste en meest gebruikte. Het gaat hier over <system.web> en <appSettings>. <configuration> <appSettings> … </appSettings> <system.web> … </system.web> </configuration> De meeste instellingen die je nodig hebt kun je benaderen via <system.web>. Ik zal het in de volgende puntjes eerst hebben over deze instellingen.

- HOOFDSTUK 5 - 43

Page 45: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

5.2.3 ALGEMENE INSTELLINGEN IN WEB.CONFIG Er zijn een aantal algemene instellingen die je eventueel kan veranderen. Hiervoor dien je ze op te nemen tussen de <system.web>-tags in de web.config file.52 De algemene instellingen die je kan veranderen zijn :

• executionTimeout • maxRequestLength

executionTimeout bepaalt hoe lang een verzoek om een pagina of een afbeelding wordt verwerkt voordat het systeem het opgeeft en een fout retourneert. De standaard voor deze instellingen is 90 seconden, maar als je pagina’s werk doen dat waarschijnlijk meer tijd in beslag gaat nemen (zoals grote databasequery’s) kun je dit getal verhogen. maxRequestLength beperkt de hoeveelheid kilobytes aan informatie die naar de server kan worden verstuurd door gebruikers. Als je alleen maar invoer van formulieren en dergelijke accepteert zou de standaard van 4096 (=4MB) meer dan voldoende moeten zijn. Als je de gebruiker echter de mogelijkheid geeft afbeeldingen,MP3-bestanden of andere grote bestanden te uploaden, kun je deze limiet vergroten. In het web.config bestand kun je deze algemene instellingen veranderen met een <httpRuntime>-tag. Je geeft deze instellingen dan op als kenmerken van deze tag. <configuration> <system.web> …

<httpRuntime executionTimeout=”90” maxRequestLength=”6144” />

</system.web> </configuration> Opmerking : Merk op dat ik hier de <appSettings>-tags heb weggelaten. De standaardwaarde die opgegeven is in machine.config zal hiervoor dus gebruikt worden. Als je de tag dus niet gebruikt mag je hem weglaten. 5.2.4 PAGINA-INSTELLINGEN IN WEB.CONFIG 53 Naast de algemene instellingen die je kunt veranderen via de web.config file, zijn er ook een aantal pagina-instellingen die je kan aanpassen. Deze instellingen beïnvloeden direct de pagina’s in de webtoepassing. De pagina-instellingen die je kan veranderen zijn :

• enableSessionState • enableViewState

enableSessionState is een instelling voor het bijhouden van ASP.NET sessies en het Session object, waarover ik het eerder al heb gehad in deze thesis. Ook de instellingen Session_OnStart en Session_OnEnd in het bestand global.asax worden hierdoor geactiveerd. Deze voorzieningen kunnen zeer handig zijn, maar als je ze niet nodig hebt kun je ze beter uitschakelen. Dit bespaart immers veel bronnen op de server. Deze voorziening uitschakelen doe je door enableSessionState op false (onwaar) in te stellen. enableViewState is een instelling waarmee je je eigen variabelen kunt opslaan in ViewState. Deze worden dan onthouden tijdens een volgende roundtrip naar de server. Hetzelfde gebeurt bij serverbesturingselementen op een formulier. Deze houden ook hun inhoud bij van een roundtrip naar de server tot de volgende. Je kunt de prestatie van de server verbeteren door deze capaciteit uit te schakelen (op false instellen in web.config). Je kunt dit kenmerk meestal beter met rust laten om problemen te vermijden.

- HOOFDSTUK 5 - 44

Page 46: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

In het web.config bestand kun je deze pagina-instellingen veranderen met een <pages>-tag. Je geeft deze instellingen dan op als kenmerken van deze tag. <configuration> <system.web> <pages enableSessionState=”false” enableViewState=”false” /> … </system.web> </configuration> 5.2.5 SESSIE-INSTELLINGEN IN WEB.CONFIG 53 In het onderdeel omtrent het session object heb ik de sessie-instellingen die belangrijk zijn in het kader van mijn applicatie reeds aangehaald. Ik hebt het daar gehad over :

• cookieless • timeout

cookieless bepaalt of ASP.NET cookies moet gebruiken om sessies te verwerken. De sessies worden dan bijgehouden door een unieke ID in het cookie-bestand van de gebruiker te zetten. Als de gebruiker een browser heeft die geen cookies ondersteunt, of als cookie-ondersteuning is uitgeschakeld, werkt deze methode niet. ASP.NET kan dan een andere methode gebruiken (URL rewriting), maar die vereist iets meer overhead. Standaard staat deze instelling op onwaar (false), wat betekent dat ASP.NET cookies zal gebruiken. Als je denkt dat een groot aantal browsers van de gebruikers van uw site geen cookies ondersteunen kan je deze instelling op waar (true) zetten om de alternatieve “cookieless” methode te gebruiken. timeout geeft aan hoe lang ASP.NET wacht tussen verzoeken van een gebruiker voordat een sessie wordt beëindigd. Een sessie loopt vanaf het moment dat een gebruiker een pagina ophaalt van de site totdat hij weggaat (naar een andere site of offline). timeout bepaalt aldus de tijd die er gewacht wordt na het laatste verzoek van de gebruiker alvorens de sessie wordt afgesloten. Standaard staat timeout ingesteld op 20 minuten. Je kunt dit veranderen door er een andere waarde aan toe te kennen in web.config. In het web.config bestand kun je deze sessie-instellingen veranderen met een <sessionState>-tag. Je geeft deze instellingen dan op als kenmerken van deze tag. <configuration> <system.web> <sessionState cookieless=”true” timeout=”30” /> … </system.web> </configuration> 5.2.6 TOEPASSINGSINSTELLINGEN IN WEB.CONFIG 53 Het bestand web.config biedt je ook een plaats waar je je eigen toepassingsinstellingen kunt opslaan. Deze instellingen dienen tussen de <appSettings>-tags te worden ingevoegd. Zo kun je bijvoorbeeld de connectiestring die je gebruikt om een databank te benaderen hierin opslaan. Elke toepassingsinstelling wordt op dezelfde manier ingevoegd, aan de hand van een <add>-tag. Je kunt zoveel <add>-tags in de <appSettings>-tag zetten als je wilt, elk met een sleutel en een waarde (key-value). Alle pagina’s kunnen dan de informatie uit dezelfde bron halen en als je die ooit moet veranderen, hoef je de wijzigingen maar op één plek door te voeren.

- HOOFDSTUK 5 - 45

Page 47: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Hieronder zie je een voorbeeld van het gebruik van de web.config file voor het opslaan van toepassingsinstellingen. In dit voorbeeld wordt de connectiestring om de databank te benaderen opgeslagen. <configuration> <appSettings> <add key=”ConnectStr” value=”Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("\db\material.mdb") /> </appSettings> </configuration> Je kunt de informatie die in het voorbeeld werd opgeslagen nu snel en eenvoudig alsvolgt benaderen in alle pagina’s van je toepassing : Dim ConnectString As String ConnectString = ConfigurationSettings.AppSettings(“ConnectStr”) 5.2.7 VOORBEELD VAN EEN WEB.CONFIG FILE Onderstaand voorbeeld bevat een overzicht van alle van de in dit onderdeel besproken instellingen die je kunt veranderen in het web.config bestand. <configuration> <appSettings> <add key=”ConnectStr” value=”Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("\db\material.mdb") /> <add key=”fonts” value=”Verdana, Arial, Helvetica, sans-serif” /> </appSettings> <system.web> <httpRuntime executionTimeout=”90”/> <sessionState timeout=”10” /> </system.web> </configuration> Er zijn 2 toepassingsinstellingen die worden ingesteld in dit voorbeeld, een connectionstring en een font-family. Door deze instellingen hier op te slaan kan men makkelijk aanpassingen voor alle pagina’s van de toepassing doorvoeren (zoals bvb van font veranderen). Deze instellingen dienen tussen de <appSettings>-tags te komen staan. Zoals je ziet in de <httpRuntime>-tag hoef je ook niet alle eigenschappen op te nemen in de tag, maar enkel diegene die je wenst te veranderen. In het voorbeeld wordt enkel de executionTimeout aangepast. In het voorbeeld werden geen pagina-instellingen verandert, er is immers geen <pages>-tag terug te vinden in deze web.config file. De applicatie zal dus de instellingen gebruiken die terug te vinden zijn in de machine.config file. Van de sessie-instellingen werd alleen de timeout verandert naar 10 minuten. Daar de sessie-instelling cookieless niet werd verandert zal ASP.NET cookies gebruiken om sessies te verwerken.

- HOOFDSTUK 5 - 46

Page 48: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

6. Server side include directives / user controls

6.1 WAT ZIJN SERVER SIDE INCLUDE DIRECTIVES ?

Server Side Includes (SSI) zijn een handige techniek voor het hergebruik van code. Zo maken ze onder meer het aanpassen van terugkerende elementen op een website eenvoudiger. Bij het ontwerpen van grote websites waarbij delen van de website op verschillende pagina’s terugkeren is het dus aangeraden om hiervan gebruik te maken.54 Je kan SSI ook gebruiken om informatie bij te houden met betrekking tot files, zoals hun grootte, laatste update, enz. . SSI wordt vooral gebruikt door traditionele ASP. In de applicatie voor de bouw en de inrichting van veestallen heb ik niet van SSI gebruik gemaakt, maar wel van ASCX (ASP.NET user controls). Daarover straks meer.

SSI kan bvb gebruikt worden voor de menubalk die bovenaan elke pagina van een website verschijnt. Als er een aanpassing dient te gebeuren aan deze menubalk zouden we deze anders op alle pagina’s waar deze menu voorkomt moeten doorvoeren. Dankzij het gebruik van SSI moeten de aanpassingen enkel worden doorgevoerd in de file die de code voor het menu bevat.

Elke pagina die gebruik wenst te maken van de code die zich in een include file bevindt dient gebruik te maken van een speciale lijn code die dienst doet als plaatshouder voor de code die zich in de include-file bevindt.

<!--#include virtual="/includeFile.asp" -->

Het resultaat van deze lijn code is dat de server de volledige inhoud van de file includeFile.asp zal invoegen in de pagina door de <!--#include … --> te vervangen.

6.2 WAT ZIJN USER CONTROLS ?

In ASP.NET werd er een vervanger voorzien voor de server side include directives van traditionele ASP, namelijk user controls. Net zoals SSI laten ze toe om code die veel gebruikt wordt onder te brengen in aparte files. Ze kennen dus ook dezelfde voordelen als SSI :

• Er dient minder code geschreven te worden. Dit komt doordat je op elke pagina die de code in de user control wenst te gebruiken enkel hoeft te linken naar de externe file.

• Als je beslist om de code te veranderen die zich in de user control bevindt moet je

deze enkel daar aanpassen. Indien geen user controls gebruikt zouden worden zou men dit in elke pagina moeten doen.

User Controls kennen echter een aantal voordelen t.o.v SSI.55 Zo zijn User Controls standalone objecten. Je gebruikt ze zoals een bestaande control (textbox, knop, label). Ze hebben er dus ook alle voordelen van. Alle events, routines, enzo die aan die control gebonden zijn blijven binnen de control. Het is dus een op zich staand item.

Een ander voordeel van user controls ten opzichte van SSI is dat je ze kunt compileren zodat een externe gebruiker geen toegang heeft tot de broncode, en de eindcompilatie een stuk vlotter gaat. In tegenstelling tot SSI worden user controls niet geïnterpreteerd elke keer er om gevraagd wordt. Ze worden immers opgeslagen in een cache na hun eerste aanroep. Dit versnelt de antwoordtijd van webpagina’s die er gebruik van maken. User controls bezitten dus meer flexibiliteit en mogelijkheden dan SSI.

- HOOFDSTUK 6 - 47

Page 49: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

6.3 HOE USER CONTROLS MAKEN ?

User controls kunnen HTML, server-side script en controls bevatten en worden opgeslagen in ascx files. Hoe ze juist opgebouwd worden en hoe je ze kunt gebruiken zal ik hier uitleggen.56 Ik zal de constructie van user controls bespreken aan de hand van een voorbeeld van zulks een user control, namelijk een menu.

<%@ Control Language="VB" %> <table width = "120" border="0" cellspacing="0" cellpadding="0"> <tr> <td> Menu bar </td> </tr> <tr> <td> <a href=”item1.aspx”> - Menu Item 1 </a> <br> <a href=”item2.aspx”> - Menu Item 2 </a> <br> <a href=”item3.aspx”> - Menu Item 3 </a> </td> </tr> </table> Deze code is de code voor het menu en bevindt zich in menu.ascx. Ze is opgebouwd via een tabel. Bovenaan de tabel staat de titel van het menu, daaronder volgen de 3 menu-items. Deze code kent dus geen verschil met de code die we zouden gebruiken indien we het menu in de pagina zelf zouden inbouwen en niet in een user control. Toch zijn er een aantal verschillen tussen de opbouw van de code in een user control en deze in een gewone pagina. Zo zien we dat de user control geen gebruik maakt van de <html>-tags en de <body>-tags. Deze zijn ook niet nodig, daar de user control in een andere pagina zal worden ingevoegd die ze al staan heeft. Een ander verschil met een aspx-file is de eerste lijn van het bestand menu.ascx. Deze is immers niet dezelfde als diegene die we terugvinden in gewone .aspx-files. Bij aspx-files vinden we immers bovenaan elke pagina het asp-directief van de klasse page, <%@ Page Language=”VB” %>. Hier vinden we <%@ Control Language="VB" %>. Het @ control directief vervult echter dezelfde taken als het @ Page directief. Het enige verschil is dat @ control dient te worden gebruikt voor user controls in plaats van het @ Page directief. Nu we al weten hoe we .ascx-files dienen aan te maken moeten we ze enkel nog in .aspx-files kunnen oproepen. Hoe dit gaat ziet u in onderstaand voorbeeld. <%@ Page Language="VB" %> <%@ Register TagPrefix="ASCX" TagName="Menu" src="menu.ascx"%> <html> <head> <title>Voorbeeld : Gebruik van user controls</title> </head> <body> <ASCX:Menu runat="server"></ASCX:Menu> Dit is een voorbeeld van het gebruik van een user control !! </body> </html>

- HOOFDSTUK 6 - 48

Page 50: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Het eerste wat dient te gebeuren bij het gebruik van een user control in een pagina is het aanmaken van een specifieke tag voor de user control. Onderstaande regel code zorgt hiervoor.

<%@ Register TagPrefix="ASCX" TagName="Menu" src="menu.ascx"%>

Via deze code wordt de user control de tag <ASCX : Menu> toegekend. Deze tag bestaat uit een tag prefix en een tag naam. De naam van de tag is uniek. Elke user control die gebruikt wordt binnen een pagina heeft dus een andere TagName. De tagPrefix is niet uniek, maar dient als kenmerk voor de user control. Zo kan je bijvoorbeeld user controls die bij elkaar horen hetzelfde tag prefix toekennen, waardoor ze makkelijk herkenbaar zijn in de code.

Elke keer de server de tag <ASCX : Menu> tegenkomt in de ASP.NET pagina zal hij deze vervangen door de inhoud van de pagina waarnaar gerefereerd wordt met het src attribuut.

De pagina die door de server naar de gebruiker wordt gestuurd is dus de volgende :

<html> <head> <title>Voorbeeld : Gebruik van user controls</title> </head> <body> <table width = "120" border="0" cellspacing="0" cellpadding="0"> <tr> <td> Menu bar </td> </tr> <tr> <td> <a href=”item1.aspx”> - Menu Item 1 </a> <br> <a href=”item2.aspx”> - Menu Item 2 </a> <br> <a href=”item3.aspx”> - Menu Item 3 </a> </td> </tr>

</table> Dit is een voorbeeld van het gebruik van een user control !! </body> </html>

De gebruiker kan dus aan de hand van de code die hij binnenkrijgt niet zien dat er gebruik werd gemaakt van user controls. Deze worden door de server immers allemaal vervangen door de code die terug te vinden is in de ascx-files alvorens ze naar de gebruiker worden gestuurd.

In de applicatie voor de bouw en inrichting van veestallen heb ik ook gebruik gemaakt van een user control. Ik heb immers een ascx-file gemaakt voor het menu dat bovenaan elke pagina dient weergegeven te worden. Hoe ik het menu ontworpen heb leest u in het volgende onderdeel.

- HOOFDSTUK 6 - 49

Page 51: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

7. Menu-ontwerp

7.1 INLEIDING ASP.NET voorziet in een groot aantal besturingselementen die je kan gebruiken bij de bouw van een webapplicatie (labels, knoppen, aanvinkvakjes, …). Er is er echter één die ze vergeten zijn, namelijk het menu besturingselement. In Visual Studio kan men bij het maken van een VB applicatie voor windows echter wel gebruik maken van zulks een menu besturingselement, MainMenu.57 Het is dan heel eenvoudig om een menu voor je applicatie aan te maken. In de ontwerpfase hoeft u alleen een besturingselement MainMenu van de toolbox naar het formulier te slepen en de Windows-formulierdesigner zal automatisch de gewenste menu-items aan dat menu toevoegen. Vervolgens hoef je enkel de tekst voor de menu-items nog toe te voegen in de vakken waar “Type Here” staat. Om code toe te voegen aan de menu-items moet je er enkel even op dubbelklikken en de codedesigner van Visual Studio zal opengaan. Hier kan je dan het click-event afhandelen. Voor het maken van toepasbesturingselement vergeten op eenvoudig geweest om een mehet web naar een menu control deze tegen betaling aanbieden.oplossing.

FIGUUR 7 – VB.NET MAINMENU

singen in ASP.NET heeft Microsoft zulks een menu te nemen. Dit is natuurlijk jammer. Anders had het heel nu toe te voegen aan je webapplicatie. Een zoektocht op voor ASP.NET bracht me enkel op sites van bedrijven die Er zelf één proberen te maken was dan ook de enige

- HOOFDSTUK 7 - 50

Page 52: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

7.2 MENU USER CONTROL Daar er geen menu control beschikbaar was ben ik zelf begonnen met er één te maken. Daarvoor heb ik vooral gebruik gemaakt van een artikel op het web met nuttige informatie omtrent het maken van user controls.58 Bij het ontwerpen van de user control heb ik getracht om de control zo veel mogelijk applicatie-onafhankelijk te maken, zodat hij geschikt was voor hergebruik in verschillende applicaties. Hiervoor heb ik de code voor het menu gescheiden van de beschrijving van het menu en de menu-items die in het menu dienen te verschijnen. Dit was bovendien nodig om de meertaligheid van de webapplicatie ook in het menu te kunnen ondersteunen. 7.2.1 BESCHRIJVING VAN MENU EN MENU-ITEMS IN XML Voor de beschrijving van de menu-items en de hiërarchie van deze items binnen het menu heb ik gebruik gemaakt van XML. XML (eXtensible Markup Language) is het universele formaat om documenten en data gestructureerd op te slaan in een tekstbestand.59 Om de structuur te definiëren wordt markup toegevoegd door middel van tags die de metadata vormen, en de data beschrijven die ze omvatten. Door XML enkel te gebruiken om de data gestructureerd op te slaan, wordt een strikte scheiding tussen inhoud en opmaak behouden. Dit heeft als groot voordeel dat dezelfde data met verschillende opmaak voorgesteld kan worden. Omgekeerd kan de opmaak dan ook gebruikt worden om verschillende XML documenten met een zelfde structuur voor te stellen. En dat is juist de hoofdbedoeling van de menu control die in dit onderdeel besproken wordt. De control moet het menu in verschillende talen kunnen weergeven. Dankzij XML moet hiervoor enkel 1 XML bestand per te ondersteunen taal worden toegevoegd. XML is bovendien niet te verwarren met HTML (HyperText Markup Language). HTML bestaat uit voorgedefinieerde tags en is vooral toegespitst op layout. Een HTML document bevat immers inhoud en opmaak, terwijl een XML document enkel gestructureerde data bevat. Hieronder ziet u een voorbeeld van een xml document voor de beschrijving van een menu dat via de menu control kan worden aangemaakt. <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="menu.xsl"?> <Menu> <MenuItems> <MenuItem id="menuDrop0" href="" innerText="Item1" type="dropdown"> <MenuItems> <MenuItem href="page1.aspx" innerText="SubItem1" type="regular" /> <MenuItem href="page2.aspx" innerText="SubItem2" type="regular" /> </MenuItems> </MenuItem> <MenuItem id="menuDrop1" href="" innerText="Item2" type="dropdown"> <MenuItems> <MenuItem href="page3.aspx" innerText="SubItem3" type="regular" /> </MenuItems> </MenuItem> <MenuItem id="contact" href="mailto:[email protected]" innerText="mail" type="regular"> </MenuItems> </Menu>

- HOOFDSTUK 7 - 51

Page 53: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

De opbouw van het xml-bestand is heel eenvoudig. De eerste twee regels code bevatten informatie ivm het xml-bestand. De eerste regel specificeert de XML versie die gebruikt wordt. De tweede regel specificeert de referentie naar een xslt file, een xml-stylesheet. Deze zal gebruikt worden voor de transformatie van de gegevens in het xml-bestand naar de HTML code voor de menu-items. Daarover straks meer.

Tussen de <Menu>-tags bevindt zich de beschrijving van het menu. Het is hiertussen dat de gebruiker van de user control veranderingen moet aanbrengen om zijn eigen menu te creëren. Om een nieuw menu te creëren moet enkel dit gedeelte worden aangepast. Dit vereenvoudigt sterk het maken van menu’s in ASP.NET.

De <menu>-tags kunnen gezien worden als een lege menubalk waarin je allerlei menu-items moet gaan onderbrengen. De menu-items die in de werkbalk dienen te verschijnen worden gegroepeerd tussen <menuItems>-tags. Het groeperen van de items is nodig daar elk van de menu-items ook zelf nog submenu’s kan bevatten. De items uit die submenu’s zouden anders tussen deze van het hoofdmenu komen te staan. De <menuItems>-tags dienen dus om de hiërarchie van het menu vast te leggen. Tussen de <menuItems>-tags kunnen de verschillende menu-items worden ondergebracht aan de hand van een <menuItem>-tag. Binnen deze tag kun je enkele eigenschappen van het menu-item vastleggen : <MenuItem id="menuDrop0" href="" innerText="Item1" type="dropdown">

• Via id is het mogelijk om elk menu-item uniek te identificeren

• Aan href kan je een url meegeven naar waar het menu-item de bezoeker moet leiden als er op het item geklikt wordt

• innertext bevat de tekst die moet verschijnen in het menu voor dit menu-item.

• Via type definieer je het type van het menu-item, dit kan “regular” of “dropdown” zijn. “regular” moet gebruikt worden voor gewone menu-items die geen submenu’s bevatten. Als het menu-item wel een submenu bevat moet je “dropdown” gebruiken.

• Binnen de <menuItem>-tags kan je ook het onClick event gebruiken. Hiermee

kan je een gebeurtenis laten optreden wanneer er op het menu-item wordt geklikt (bvb stukje Javascript uitvoeren)

• Je kan ook via target aangeven of de pagina die geopend wordt (na het

aanklikken van het menu-item) dient te verschijnen in het huidige venster of in een nieuw venster.

Elk menu-item kan zelf nog een submenu bevatten. Zoals reeds aangehaald bij de bespreking van de eigenschappen van een menu-item moet daarvoor het type “dropdown” zijn. De items van het submenu dienen tussen de <menuItems>-tags van het <menuItem> te komen staan. Het toevoegen van de submenu-items gebeurt net zoals dit gebeurt voor de items van het hoofdmenu. <MenuItem id="menuDrop1" href="" innerText="Item2" type="dropdown"> <MenuItems> <MenuItem href="page3.aspx" innerText="SubItem3" type="regular" /> </MenuItems> </MenuItem>

- HOOFDSTUK 7 - 52

Page 54: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

7.2.2 TRANSFORMATIE VAN MENU.XML VIA XSL De beschrijving van het menu in XML moet vervolgens worden omgezet naar HTML-code die door het menu besturingselement kan worden gebruikt bij de opbouw van het menu. Hiervoor wordt gebruik gemaakt van XSL (eXtensible Stylesheet Language).60 XSL kan immers de bestaande structuur van een XML document transformeren naar een nieuwe structuur (XSLT of XSL Transformation). Het menu.xsl bestand dat ik gebruikt heb voor het menu besturingselement zal ik hier niet volledig bespreken, daar dit geen thesis is over XML en XSLT maar wel over de mogelijkheden van ASP.NET bij de bouw van een webapplicatie. Voor de lezer van deze thesis is het voldoende om weten dat door wijzigingen aan te brengen in dit bestand je de layout van het menu kan veranderen. Zo kan je bijvoorbeeld instellen om een verticaal/horizontaal menu te maken. 7.2.3 MANIPULATIE VAN DE STRUCTUUR VAN HET MENU IN DE BROWSER Voor de afhandeling van de gebeurtenis in de browser wordt gebruik gemaakt van JavaSript. Dit is nodig daar ASP.NET aan de serverzijde werkt en enkel HTML naar de gebruiker stuurt. ASP.NET kan dus niet gebruikt worden voor het doen verschijnen en verdwijnen van menu’s aan de clientzijde. De ASP.NET menu control maakt dus enkel het menu aan via het menu.xml en menu.xsl bestand en produceert hiervoor de HTML. Het JavaScript bestand menu.js dient dus nog te worden opgenomen in de code van de aspx file die de menu control gebruikt. Dit om de gebeurtenissen langs de clientzijde te kunnen afhandelen (zoals verdwijnen en verschijnen van submenu’s). 7.2.4 OPBOUW VAN DE CODE VOOR DE MENU CONTROL 58 De code voor de menu control is verdeeld over 2 files, menu.ascx en menu.ascx.vb. De menu.ascx file bevat het presentatiegedeelte van de menu control. Deze bevat een Codebehind–verwijzing naar de code voor de constructie van het menu. Die code is ondergebracht in de menu.ascx.vb file. Ik zal eerst de menu.ascx file bespreken. <%@ Control Language="vb" Inherits="MyControls.MyMenuVB" src="MenuControlVB.ascx.vb"%> <script language="javascript" src="menu.js"></script> <asp:Label id="MenuPlaceHolder" runat="server"> Hier komt de menu te staan … </asp:Label> Wat de <@ control>-tag doet heb ik al grotendeels uitgelegd bij de bespreking van user controls. In dit geval laat de tag ASP.NET weten dat de control in VB is geschreven en dat zijn pagina overerft van de MyControls.MyMenu klasse (die bevat zit in de codebehind-file van de pagina). Vervolgens roept de code de JavaScript file aan om de code toe te voegen voor de afhandeling van de gebeurtenissen langs de clientzijde. Tot slot wordt er een label toegevoegd als plaatshouder van het menu. Dit label wordt door de codebehind-file na de verwerking van de xml en xsl file ingevuld met de menu-inhoud. Dit is alles wat de menu.ascx file doet. De kracht van de control zit hem in de codebehind file, menu.ascx.vb. Deze file bevat de klasse MyMenuVB die overerft van de klasse System.Web.UI.UserControl. Dat is de basisklasse voor het maken van user controls. Public MustInherit Class MyMenuVB Inherits System.Web.UI.UserControl

- HOOFDSTUK 7 - 53

Page 55: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Om toegang te krijgen tot het label in de ascx file (<asp:Label … >) is er nood aan een “protected” Label variabele “MenuPlaceHolder”. De toegang tot dit label in de ascx file is immers nodig om de HTML-code van het menu in het label te kunnen doen verschijnen. Protected MenuPlaceHolder As Label Vervolgens bevat deze klasse 2 private variabelen om de filenamen van de xml en xsl files, die gebruikt dienen te worden, bij te houden. Deze kunnen worden geschreven en gelezen via get en set methoden. Private xmlFile as String = "" Private xslFile as String = "" Aan de hand van de informatie in deze 2 private variabelen weet de Page_Load functie welke xml-file dient te worden gebruikt. Deze xml-file wordt dan omgezet naar HTML aan de hand van de xsl-file en de informatie omtrent het browsertype. De omzetting gebeurt via de XslTransform klasse van het .NET framework. Aan de hand van de load methode kan je de xsl stylesheet inlezen. Met de trasform functie kan je de XML data dan laten omzetten. Deze functie maakt gebruik van de XSLT stylesheet die via load werd ingelezen en geeft het resultaat van de transformatie terug. Aan deze functie kunnen ook nog extra argumenten worden meegegeven die gebruikt dienen te worden als input voor het transformatieproces (zoals het browsertype). Deze argumenten dienen opgeslagen te worden in een XsltArgumentList. Dim XslProc As XslTransform = new XslTransform() Dim XsltArgs As XsltArgumentList = new XsltArgumentList() Dim sb As StringBuilder = new StringBuilder() Dim sw As StringWriter = new StringWriter(sb) XsltArgs.AddParam("BrowserType", "", sBrowser) XslProc.Load(XslDoc) XslProc.Transform(XmlDoc, XsltArgs, sw) MenuPlaceHolder.Text = sb.ToString() In bovenstaande code werd ook gebruik gemaakt van een StringBuilder object. Dit is de efficiëntste methode in .NET om een string op te bouwen. Met een StringWriter object kan je tekst schrijven naar zulks een StringBuilder object. De transformatiefunctie zal na transformatie van de XML de html in het StringWriter object stoppen. Deze zal de HTML vervolgens naar de StringBuilder sturen. Tot slot wordt de string die door de StringBuilder gevormd wordt aan de Text-eigenschap van het MenuPlaceHolder Label toegekend. De user control doet dus in feite niks anders dan de xml-file omzetten naar html-code via de specificaties in de xsl-file. Hierdoor kan de code ook gebruikt worden voor het maken van andere controls die in xml en xsl kunnen beschreven worden. 7.2.5 GEBRUIK VAN DE MENU CONTROL Om de control te kunnen gebruiken in een aspx pagina moet men deze eerst registreren. Hoe dit gebeurt heb ik al uitgelegd enkele pagina’s terug in deze thesis in het onderdeel “Hoe user controls maken”. Vervolgens kan men het menu invoegen via de menu-tag. <%@ Register TagPrefix="MenuControl" TagName="Menu" Src="menu.ascx" %> <ASPToday:Menu id="MenuControl1" runat="server" XmlFileName="menu.xml" XslFileName="menu.xsl" />

- HOOFDSTUK 7 - 54

Page 56: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

7.3 ANDERE MOGELIJKHEID VOOR MENU-ONTWERP (FIREWORKS) In mijn zoektocht naar mogelijkheden voor het ontwerpen van menu’s in ASP.NET heb ik ook gezocht naar enkele alternatieven voor ASP.NET menu’s. Een van die alternatieven dat me sterk kon bekoren was het gebruik van Fireworks (Macromedia). In Fireworks is het immers zeer eenvoudig om snel een degelijk menu te ontwerpen dat in een overgroot deel van de browsers correct functioneert.61 Hoe dit juist allemaal in z’n werk gaat zal ik nu bespreken. Je opent macromedia Fireworks en kiest een nieuw bestand ( File > New ). In het venster dat dan verschijnt kan je de afmetingen al vastleggen van je menu, alsook de achtergrondkleur. Een klik op OK opent het werkvenster waar je het menu kan beginnen ontwerpen.

Het eerstemenubalkbevindt. Dde hoekphoekpuntmenu-itemvoegen ente voegenscherm in

FIGUUR 8 – FIREWORKS nieuw document

wat je moet doen is de layout van het menu vastleggen. Stel dat we boven de bvb een banner willen laten zien van de website waarop de gebruiker zich it doe je door een figuur te importeren ( File > Import ). Vervolgens kan je in unten van de figuur de afmetingen heel eenvoudig aanpassen door deze en te verslepen. Het volgende wat dient te gebeuren is de menubalk en de

s construeren. Dit doe je bvb door een grijze balk (Rectangle Tool) in te daarop de verschillende menu-items via het text gereedschap (Text Tool) toe . Al deze gereedschappen zijn terug te vinden aan de linkerkant van het

de toolbox.

FIGUUR 9 – FIREWORKS menu layout

- HOOFDSTUK 7 - 55

Page 57: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

De layout van het menu ligt nu volledig vast. Enkel de gebeurtenissen moeten nog worden toegevoegd (de submenu’s die moeten verschijnen als er over een item wordt bewogen). Dit doe je via de Hotspot Tool (eveneens te vinden in de toolbox). Met deze tool geef je het gebied aan waarvoor je een actie wil toevoegen. Als een gebruiker met de muis in dat gebied zich zal begeven zal de actie optreden. Nu je het gebied al hebt opgegeven moet je er ook nog een actie aan vasthangen.

• Voor het creëren van een dropdownmenu moet je daarvoor rechts klikken in het midden van het hotspot gebied en “Add Pop-Up menu” kiezen. De pop-up menu editor zal dan openen. Deze bespreek ik straks.

• Sommige menu-items in de menubalk moeten echter geen dropdownmenu doen

verschijnen, maar enkel naar een andere pagina gaan als er op geklikt wordt. Om gewoon een klikgebeurtenis naar een pagina toe te voegen moet je bij eigenschappen onderaan het scherm de eigenschap link een URL toekennen.

FIGUUR 10 – FIREWORKS Hotspot Tool Met de pop-up menu editor kan je de dropdownmenu’s definiëren. Dit is heel eenvoudig. In de afbeelding hiernaast ziet u deze editor. Wat de functie van de tabbladen is leest u eveneens in de figuur. Het menu is nu helemaal klaar. Je moet nu enkel nog de html en javascript laten genereren. (File > Export) Conclusie : Zoals je merkt is het dus heel eenvoudig om een menu te construeren in fireworks. Nadeel is dat de menubalk taalafhankelijk en statisch is daar deze als een jpg wordt opgeslagen. De items in de dropdown-menu’s kun je wel taalafhankelijk maken. Je moet de html file dan gaan aanpassen en de links naar de database met strings toevoegen.

FIGUUR 11 – FIREWORKS Pop-up Menu Editor

- HOOFDSTUK 7 - 56

Page 58: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

8. Beveiliging in ASP.NET 8.1 INLEIDING In de applicatie voor de bouw en de inrichting van veestallen zijn er een aantal pagina’s die dienen voor het updaten van de applicatie. Deze mogen niet door de gebruikers geraadpleegd worden, enkel door de dataverantwoordelijken. Hierdoor moeten deze pagina’s beveiligd worden opdat gebruikers ze niet zouden kunnen misbruiken. ASP.NET biedt verschillende manieren om pagina's te beveiligen. Standaard worden pagina's beveiligd op basis van gebruikersrechten van bestanden. Het nadeel hiervan is dat als u gebruikers wilt kunnen onderscheiden u voor iedere gebruiker een gebruikersaccount moet aanmaken. Vooral op een website met veel bezoekers is dat onhandig (op een Intranet kan dit juist handig zijn). ASP.NET biedt twee andere mogelijkheden die voor de meeste websites handiger zijn, Forms beveiliging en Passport beveiliging. Deze 2 vormen van beveiliging zullen hier besproken worden. Daarnaast zal ik nog een andere vorm van beveiliging bespreken gebaseerd op het gebruik van het session object en de Page_Load functie. 8.2 FORMS BEVEILIGING

Bij Forms beveiliging62 kijkt ASP.NET of de gebruiker toegang mag hebben tot een bepaalde pagina. Indien de gebruiker niet over de vereiste toegangsrechten beschikt, of de gebruiker nog niet ingelogd is, dan wordt hij doorgezonden naar een login pagina. Op deze pagina kan de gebruiker dan inloggen met zijn gebruikersnaam en paswoord. Als de gebruiker de juiste rechten heeft, dan wordt hij weer terugverwezen naar de pagina die hij/zij oorspronkelijk had opgevraagd.

FIGUUR 12 – ASP.NET Forms Beveiliging

- HOOFDSTUK 8 - 57

Page 59: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Forms beveiliging gebeurt bijna volledig automatisch.63 Het enige dat er moet gedaan worden om deze vorm van veiligheid te gebruiken is de login pagina aanmaken en de rechten voor de verschillende gebruikers instellen. In de achtergrond wordt alles verzorgd door een cookie. U stelt Forms beveiliging in via het authentication element in web.config, zoals hieronder wordt getoond.

<configuration> <system.web> <authentication mode="Forms"> <forms name="LOGIN" loginUrl="login.aspx" path="/" protection="All" timeout="60" /> </authentication> </system.web> </configuration> Tussen de <system.web>-tags kun je dus instellingen met betrekking tot beveiliging van pagina’s onderbrengen aan de hand van de <authentication>-tag. Om forms beveiliging te gebruiken moet je het attribuut mode van deze tag instellen op “forms”. Het forms element bepaalt vervolgens de instellingen van de Forms beveiliging. In deze <forms>-tag kan je hiervoor verschillende attributen instellen :

• name : Naam van de cookie die naar de webbrowser wordt gestuurd. • loginUrl : URL naar de loginpagina. Dit moet een URL zijn binnen de website. • path : Pad binnen de website waarvoor de beveiligingscookie geldt. Dit is alleen

van toepassing als u meerdere applicaties op dezelfde server heeft draaien. • protection : Manier waarop de cookie wordt beveiligd tegen kwaadwilligen.

Mogelijke waarden voor protection zijn :

1. All (standaard) voor de sterkste (en aanbevolen) beveiliging, 2. None voor geen beveiliging (niet aanbevolen, behalve voor personalisatie) 3. Encryption voor versleutelde gegevens 4. Validation voor het controleren van de waardes in de cookie.

All gebruikt zowel Encryption als Validation.

• timeout : Aantal minuten dat de cookie geldig is. Als deze tijd verstreken is zal de gebruiker opnieuw moeten inloggen.

Het <authentication> element specificeert welke beveiligingsmethode ASP.NET moet gebruiken voor het beveiligen van pagina’s. Het zegt nog niets over welke pagina’s beveiligd dienen te worden en welke gebruikers wat mogen. Dit doet u met het <authorization> element in web.config. Alle instellingen die u daarin doet zijn van toepassing op de map waarin het betreffende web.config bestand staat en alle mappen daaronder. Uitzondering hierop zijn de onderliggende mappen die een eigen web.config bevatten met daarin afwijkende autorisatiegegevens. De autorisatiegegevens in web.config zien er bijvoorbeeld als volgt uit:

<system.web> <authorization> <allow users="Steven Verstockt" /> <deny users="*" /> </authorization> </system.web>

- HOOFDSTUK 8 - 58

Page 60: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Het <allow> element geeft aan welke gebruikers toegang hebben tot de map, in dit geval alleen “Steven Verstockt”. Met de <deny>-tag geef je aan welke gebruikers geen toegang hebben. Een sterretje geeft daarbij iedereen aan (behalve die genoemd in de <allow>-tag). Een vraagteken geeft alle niet ingelogde gebruikers aan, zodat u gebruikers kunt verplichten in te loggen. Vanuit de web.config file van de hoofdmap kan je ook bepaalde deelmappen beveiligen.64 Dan is het niet meer nodig om in de deelmappen hiervoor een web.config bestand te gebruiken. Dit doe je door gebruik te maken van de <location>-tag.

<location path="deelmap"> <system.web> <authorization> <deny users="?" /> </authorization> </system.web> </location>

Het enige wat nu nog dient te gebeuren is een pagina voorzien voor het inloggen van de gebruikers en beslissen hoe de logingegevens worden opgeslaan. U heeft daarbij de keuze zelf de logingegevens op te slaan, bijvoorbeeld in een database, en deze te controleren. U kunt vervolgens aangeven dat de gebruiker correct is ingelogd. U kunt ook in het web.config bestand in de hoofdmap van de website gebruikers en wachtwoorden opslaan, en gebruik maken van een standaard login-mechanisme dat ASP.NET biedt.

De HTML voor de loginpagina, login.aspx, ziet u hieronder. De pagina bevat 2 tekstvelden waarin de loginnaam en het wachtwoord moeten worden ingevuld. Vervolgens dient de gebruiker op de knop “Login” te klikken. De achterliggende VB.NET code zal dan controleren of de gebruiker gemachtigd is om toegang te hebben tot het private gedeelte van de webapplicatie. Indien de gebruiker gemachtigd is zal hij worden doorverwezen naar de beveiligde pagina die hij wou raadplegen. Indien niet zal er een boodschap verschijnen op de loginpagina met de melding "Login onjuist".

<html> <body> <form runat="server"> Loginnaam: <asp:TextBox id="txtLogin" runat="server" /> <br> Wachtwoord: <asp:TextBox id="txtPassword" runat="server" TextMode="Password" /> <br> <asp:Button id="btnLogin" runat="server" Text="Login" OnClick="DoLogin" /> <p> <asp:Label id="txtMsg" runat="server" ForeColor="Red" EnableViewState="False" /> </form> </body> </html>

De code voor het afhandelen van de loginprocedure hangt af van de manier waarop u de gebruikersnamen en wachtwoorden wilt opslaan. In ieder geval moet de System.Web.Security naamruimte worden geïmporteerd. De code op de volgende pagina laat zien hoe u in kunt loggen op basis van een eigen opslag.

- HOOFDSTUK 8 - 59

Page 61: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Onderstaande techniek heb ik ook gebruikt om het update-gedeelte te beveiligen van de applicatie voor de bouw en de inrichting van veestallen. De code bevindt zich in de codebehind file login.aspx.vb.

<%@Import Namespace="System.Web.Security"%>

<script runat="server"> Sub DoLogin(src As Object, e As EventArgs) If txtLogin.Text = "Steven" And txtPassword.Text = "Verstockt" Then FormsAuthentication.RedirectFromLoginPage(txtLogin.Text, False) Else txtMsg.Text = "Login onjuist" End If End Sub </script>

De DoLogin methode controleert of de loginnaam “Steven” is en het paswoord “Verstockt”. Als dit zo is wordt er een redirect uitgevoerd naar de beveiligde pagina die de bezoeker wenst te bezoeken. Indien de loginnaam en/of het paswoord verkeerd was wordt het label txtMsg de tekst “Login onjuist” toegekend en krijgt de gebruiker geen toegang.

Zoals reeds gezegd is het ook mogelijk om de gebruikersnamen en wachtwoorden in de web.config in de hoofdmap op te slaan. Hiervoor dien je gebruik te maken van de <credentials>-tag binnen het <forms> element in web.config. Geldige user/paswoord paren kunnen binnen de <credentials> tags in de web.config file worden gezet. Wanneer een gebruiker dan inlogt zullen de inloggegevens vergeleken worden met de lijst van user/paswoord paren in deze <credentials>-sectie. Als de inloggegevens overeenstemmen met een bepaald user/paswoord paar in deze lijst zal de gebruiker toegang krijgen tot de beveiligde pagina’s. <authentication mode="Forms"> <forms name="LOGIN" loginUrl="login.aspx" path="/" protection="All" timeout="60"> <credentials passwordFormat="SHA1"> <user name="Steven" password="07B7F3EE06F278DB966BE960E7CBBD103DF30CA6" /> <user name="Kurt" password="C4A042B60DC04B84572B00E96EB716C90DE8FE13" /> </credentials> </forms> </authentication> Het passwordFormat attribuut van het <credentials> element bepaalt hoe de wachtwoorden worden opgeslagen. Er zijn 3 mogelijkheden65 :

• Clear : De paswoorden worden in dit geval opgeslagen als tekst zonder ze te transformeren. Het paswoord dat de gebruiker ingeeft wordt dan rechtstreeks met deze waarde vergeleken.

• MD5 : De paswoorden in de credentials worden eerst versleuteld met Message

Digest 5 (MD5) alvorens ze worden opgeslagen. Het paswoord dat de gebruiker ingeeft dient dan ook eerst hiermee te worden versleuteld. Pas dan kan de controle gedaan worden of de logingegevens van de gebruiker overeenstemmen met een user/paswoord paar in de lijst. Het paswoord dat de gebruiker moet ingeven bij het inloggen wordt hier dus nergens opgeslagen.

- HOOFDSTUK 8 - 60

Page 62: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

• SHA1 : Net zoals bij MD5 worden de paswoorden eerst versleuteld alvorens ze worden opgeslagen. Deze keer met SHA1 hash digest. Het controleren van het paswoord dat de gebruiker ingeeft gebeurt eveneens op dezelfde manier. Het enige verschil is dat deze methode de beste beveiliging biedt en MD5 de beste performantie.

Als gebruik wordt gemaakt van deze methode van opslag van gebruikersnamen en wachtwoorden moet de login code van de codebehind file login.aspx.vb enigszins worden aangepast. De DoLogin methode voert de controle nu niet zelf uit maar roept de authenticate functie op. Deze zal de logingegevens vergelijken met de lijst van user/paswoord paren die zich tussen de <credentials>-tag bevinden in de web.config file. Als de logingegevens overeenstemmen met een user/paswoord paar in deze lijst zal de authenticate functie “true” teruggeven en zal de gebruiker doorgestuurd worden naar de beveiligde pagina die hij wenst te raadplegen. Indien echter “false” wordt teruggegeven zal de gebruiker opnieuw de “Login onjuist” boodschap zien verschijnen op de loginpagina.

Sub DoLogin(src As Object, e As EventArgs) If FormsAuthentication.Authenticate(txtLogin.Text, txtPassword.Text) Then FormsAuthentication.RedirectFromLoginPage(txtLogin.Text, False) Else txtMsg.Text = "Login onjuist" End If End Sub 8.3 PASSPORT BEVEILIGING Met een .NET Passport beschik je over een veilige manier om je via één aanmeldingsnaam en wachtwoord bij meerdere Internet-sites en -services aan te melden.66 De gebruiker hoeft dus niet een hele reeks van paswoorden te onthouden. Hij kan immers op alle sites die .NET Passport ondersteunen dezelfde gebruikersnaam en paswoord gebruiken. Het .NET Passport bevat niet alleen een usernaam en wachtwoord, maar ook andere informatie omtrent de gebruiker kan er worden in bijgehouden , zoals :

• Email • Voornaam + Achternaam • Taal • Land + Tijdzone • Geslacht • Geboortedatum • …

Dit mechanisme van beveiliging voorziet in een gecentraliseerde authenticatie methode voor het inloggen op de .NET passport member sites. De webapplicatie die .NET passport gebruikt moet zich dus niks aantrekken van het inloggen, dit wordt allemaal afgehandeld door deze gecentraliseerde methode. Voor het versturen van de gegevens wordt gebruik gemaakt van drievoudige DES versleuteling.67 Om .NET Passport te gebruiken in een webapplicatie dient eerst en vooral de Passport SDK (Software Development Kit) te worden geïnstalleerd op de server. Daarnaast moet je ook de applicatie registreren bij Microsoft® Passport. Tijdens de registratie zal de applicatie een unieke site id worden toegekend. Deze moet je invullen in de Passport Administrator.

- HOOFDSTUK 8 - 61

Page 63: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Eens de registratie gebeurt is kan je de beveiliging van bepaalde delen van de applicatie via .Net Passport doen. Hiervoor moet je in de <authentication>-tag van de web.config file het mode attribuut instellen op Passport. Het redirectURL attribuut van de <passport>-tag maakt het mogelijk om users die over geen geldig .NET passport beschikken door te verwijzen naar een login pagina. Dan heeft men weer te maken met form beveiliging. <authentication mode="Passport"> <passport redirectURL="login.aspx " /> </authentication>

Het gedeelte autorisatie bij Passport beveiliging is net hetzelfde als bij forms beveiliging en zal hier dus niet opnieuw worden besproken.

8.4 SESSION BEVEILIG

Een andere techniek omtechniek is zeer eenvouomtrent asp.net beveilPage_Load functie vansteeds als eerste wordcontroleer je of de sesgebruiker de beveiligdeechter niet zo doe je ee De login.aspx pagina vzal de session-variabeusername en paswoordoorsturen.

FIGUUR 13 – ASP.NET Passport Beveiliging

ING

pagina’s te beveiligen in ASP.NET is session beveiliging.68 Deze dig, doch wordt deze techniek slechts zelden besproken in artikels iging. De controle of de gebruiker gemachtigd is gebeurt in de de beveiligde pagina’s. De Page_Load functie is de functie die t uitgevoerd bij het ophalen van een pagina. In deze functie

sion-variable “Authorized” op true staat. Indien dit zo is mag de pagina zien en wordt de pagina naar de browser gestuurd. Als dit n redirect naar de login.aspx pagina.

raagt de gebruiker naar zijn logingegegevens. De codebehind file le “Authorized” op true zetten als de gebruiker een geldige d ingeeft en de gebruiker naar de gewenste beveiligde pagina

- HOOFDSTUK 8 - 62

Page 64: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

9. Foutafhandeling in ASP.NET

9.1 INLEIDING

Volledig foutvrije code schrijven is quasi onmogelijk. Zelfs wanneer je met de grootste voorzichtigheid te werk gaat is de kans op fouten reëel. Daarom is foutopsporing en fout-afhandeling een belangrijke taak die alle ontwikkelaars serieus moeten nemen alvorens ze gebruikers toegang tot hun applicatie verlenen.

Er zijn 3 categorieën fouten die men kan onderscheiden69 :

• Syntaxisfouten : Dit zijn verkeerd gespelde keywords, ontbrekende keywords of andere fouten die te maken hebben met de syntaxis van de taal die u gebruikt. Syntaxisfouten worden meestal door de IDE gemarkeerd en zijn vaak eenvoudig te corrigeren tijdens design time. Een voorbeeld van zulks een syntaxisfout is een if-statement dat niet wordt afgesloten met een “end if” - statement.

• Runtime-fouten : Deze fouten treden op tijdens het compileren en het uitvoeren van de code. Ze worden veroorzaakt door code die correct lijkt in de ogen van de compiler, maar in bepaalde gevallen niet kan worden uitgevoerd. Een voorbeeld hiervan is een deling van 2 integervariabelen. De compiler zal hier niks op aanmerken. Als de integervariabele die als deler optreedt in de deling echter de waarde 0 heeft, zal dit een runtime-fout tot gevolg hebben.

• Logische fouten : Dit zijn fouten die moeilijk op te sporen en te verhelpen zijn. Deze fouten stoppen immers de uitvoering van het programma niet. Ze geven enkel onverwachte of ongewenste resultaten bij bepaalde invoerwaarden.

Al deze fouten moeten op de een of andere manier worden afgehandeld. Anders leiden ze tot grote ontevredenheid bij de gebruikers. In wat volgt zullen eerst enkele technieken besproken worden om fouten te voorkomen. Vervolgens zal ik het hebben over foutafhandeling in de code.

9.2 FOUTEN VOORKOMEN

Alvorens te bespreken hoe u de verschillende soorten fouten kunt opsporen en afhandelen in de code, is het misschien verstandig om eerst eens enkele strategieën te bestuderen waarmee fouten kunnen voorkomen worden. Het voorkomen van fouten is immers veel efficiënter en minder kostbaar om foutvrije applicaties te schrijven. Onderstaande opsomming bevat enkele technieken om fouten te voorkomen.70

• Leesbare code : Door gebruik te maken van standaarden voor benaming en codering bij het schrijven de code wordt deze makkelijker leesbaar en zullen fouten vlugger aan het licht komen. Bovendien moet u er voor zorgen dat commentaar consistent is en de code voldoende becommentariëren. Alles wat de code beter leesbaar en eenvoudiger te begrijpen maakt, vermindert immers de kans op het maken van fouten. Leesbare code is ook handig wanneer anderen aanpassingen moeten doorvoeren in de code. Dit vergemakkelijkt hun werk.

• Effectieve testplannen : Door elk pad in de applicatie te testen met elke mogelijke gegevenswaarde (of een representatief aantal waarden) die de gebruiker kan ingeven of volgen kan je logische fouten in de applicatie voorkomen. Dit gebeurt het beste aan de hand van een testplan dat beschrijft hoe elk gedeelte van de applicatie het best getest kan worden. Bij veranderingen in de applicatie dient men ook steeds dit plan aan te passen.

- HOOFDSTUK 9 - 63

Page 65: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

• Krachtige IDE : Door gebruik te maken van een IDE die syntaxiscontrole doet tijdens het typpen kunt u al behoorlijk wat fouten opvangen tijdens de ontwerpfase. Dit hoeft hiervoor niet Visual Studio te zijn, ook andere IDE’s die dit aanbieden zijn hiervoor geschikt (bijvoorbeeld WebMatrix). Als u immers in een omgeving werkt die geen syntaxiscontrole aanbiedt, zoals Notepad, blijven deze syntaxisfouten immers onopgemerkt tot wanneer u de pagina een eerste keer uitvoert. Het elimineren van de fouten dient dan 1 voor 1 te gebeuren. Dit komt doordat tijdens het uitvoeren maar één fout tegelijkertijd wordt gerapporteerd. Dit is natuurlijk een tijdsrovende en niet erg effectieve methode om code te schrijven.

• Controle : Door zelf en ook anderen de code te laten nakijken en testen kunnen heel wat fouten gevonden worden. Aangezien andere ontwikkelaar steeds een verschillend beeld zullen hebben op de code is het nuttig om hen de code te laten inspecteren. Ontwikkelaars zitten immers te dicht op hun eigen code om met het blote oog elke fout eruit te kunnen halen.

9.3 FOUTAFHANDELINGSTECHNIEKEN

9.3.1 FOUTAFHANDELINGSPAGINAS

De gebruiker verwijzen naar een aparte pagina die aangeeft dat er iets fout is gegaan is een veel voorkomende methode om fouten af te handelen. Die pagina kan eventueel ook gebruikt worden om de fout naar een log te schrijven, zodat de ontwikkelaar later kan zien wat er fout is gegaan en zonodig actie ondernemen. In ASP.NET kunt u zowel voor de hele website als per pagina aangeven wat er gedaan moet worden als er een fout optreedt.71

Indien je gebruik wenst te maken van foutafhandelingspagina's voor de hele website stelt u dit in via web.config. In web.config kan je immers opgeven hoe fouten afgehandeld dienen te worden. Dit kan door het <customErrors>-element toe te voegen tussen de <system.web>-tags.

<configuration> <system.web> <customErrors mode="On" defaultRedirect="errorpage.aspx"> <error statusCode="404" redirect="pagenotfound.htm"/> … </customErrors> </system.web> </configuration>

Zulks een <customErrors>-element bevat een attribuut mode waarmee je de manier waarop de foutopvang dient te gebeuren kan definiëren. Het attribuut mode kan drie verschillende waarden hebben :

1. Off : In dit geval is er geen foutafhandeling. De fout wordt direct in de browser getoond. Men dient hier echter mee op te letten. Dit kan soms onveilig zijn daar sommige foutmeldingen een deel van de code laten zien.

2. On : Als er een fout optreedt wordt er verwezen naar de foutafhandelingspagina voor de specifieke fout. Het is immers mogelijk om voor elke specifieke fout zulks een pagina te voorzien (daarover straks meer). Als er geen specifieke foutpagina voor de opgetreden fout gedefinieerd is wordt de gebruiker doorgezonden naar de pagina in het defaultRedirect attribuut.

- HOOFDSTUK 9 - 64

Page 66: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

3. RemoteOnly : Lokaal wordt de foutmelding weergegeven alsof mode op off staat. De fout wordt dus in de browser getoond. Hierdoor kan de ontwikkelaar zien wat er fout gaat. Voor webbrowsers op een andere computer wordt de fout afgehandeld alsof mode op on staat en wordt er dus een foutafhandelingspagina opgeroepen als er een fout optreedt.

Zoals reeds aangehaald kan je voor elke specifieke fout een afzonderlijke foutafhandelingspagina definiëren. Dit kan aan de hand van het <error>-element. Dit element bevat een attribuut statusCode waar je de waarde van een HTTP status code kan aan toekennen. Met het redirect attribuut specificeer je de foutafhandelinspagina.

In het begin van dit onderdeel werd reeds vermeld dat je ook voor afzonderlijke pagina’s een foutafhandelingspagina kan definiëren die verschilt van deze in web.config. Er dient wel te worden opgemerkt dat enkel wanneer mode on of RemoteOnly is deze specifieke foutafhandelingspagina zal worden opgeroepen. Deze specifieke foutafhandelingspagina kan je definiëren in de declaratie van de pagina.

<%@ Page ErrorPage="error2.aspx" %> Fouten afhandelen door te verwijzen naar een andere pagina ziet er voor de gebruiker redelijk netjes uit. In de achtergrond wordt het uitvoeren van de pagina waarin de fout zat echter zonder pardon afgebroken. Vooral als u bestanden of databases open heeft, kan dit leiden tot ernstig performance verlies van de server, en soms zelfs in instabiliteit van de applicatie. Aangezien dit onwenselijk is, is het veel beter om fouten eerst in de code netjes op te vangen en vervolgens pas te verwijzen naar de foutpagina, of in de pagina melden dat er een fout is opgetreden.

9.3.2 FOUTAFHANDELING IN DE CODE

Er bestaan verschillende technieken om foutafhandeling in de code te doen. We zullen er hier 3 van bespreken : On Error, Try…Catch…Finally & Throwing Exceptions.

De eerste techniek is er één die ook reeds in Visual Basic 6 aanwezig was. In VB6 konden fouten alleen worden afgehandeld door een error-handler te gebruiken via het On Error-statement.72

Sub Voorbeeld() On Error GoTo ErrorHandler ’ code die een error kan veroorzaken … Exit Sub ErrorHandler : ‘ Error Handling code Resume Next End Sub

Als een fout optreedt zal de code in ErrorHandler worden uitgevoerd. Van zodra de foutafhandeling in de ErrorHandler voorbij is kan er worden teruggekeerd naar de regel na deze die de fout heeft veroorzaakt aan de hand van het Resume Next statement.

On Error is een voorbeeld van ongestructureerde foutafhandeling. Deze manier van foutopvang maakt het ontwikkelaars soms moeilijk bij het debuggen en het onderhouden van de code. In Visual Basic.Net is er nu echter ook de mogelijkheid om gestructureerde foutafhandeling te gebruiken via Try..Catch…Finally. Deze vorm van foutafhandeling vergemakkelijkt het debuggen en het onderhouden van de code.

- HOOFDSTUK 9 - 65

Page 67: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

De 2de techniek voor foutafhandeling die hier besproken wordt is Try…Catch…Finally. Deze techniek voor gestructureerde foutafhandeling probeert de code die zich in het try-blok bevindt. Wanneer er binnen dit blok een fout optreedt kunt u deze opvangen in het catch-blok. In dit catch-blok kunt u verschillende soorten fouten op een andere manier opvangen. Welke fout moet opvangen worden geeft u aan door het type fout op te geven.73 Het basis Exception object werkt voor alle fouten, maar geeft slechts beperkte informatie over de fout. Daarom gebruik je beter specifieke exception objecten zoals bijvoorbeeld OleDbException. Hiermee kan je immers meer specifieke foutopvang doen.

Gaat er niets fout in het try-blok, dan wordt na die code de code in het Finally-blok uitgevoerd. Het catch-blok wordt dan overgeslagen. Ook als een fout optreedt wordt als laatste dit Finally-blok uitgevoerd om alles netjes op te ruimen. Als u op deze manier een fout afhandelt in een Catch-blok kun je via een Label zelfs een foutmelding weergeven in de pagina zelf. In het Try…Catch gedeelte kan je natuurlijk ook nog steeds verwijzen naar een andere foutafhandelingspagina.

Try

'code die mogelijk tot een fout kan leiden Catch ex As OleDbException

'handel fout af van type OleDbException Catch ex As Exception

'handel andere fout af Finally

'code die altijd uitgevoerd moet worden, ook als er geen fout optreedt End Try

De 3de en tevens laatste techniek die hier besproken zal worden is de “throwing exceptions” techniek.72 Deze wordt gebruikt wanneer je zelf exception classes ontwerpt voor je applicaties. Deze zelfontwikkelde exception classes zijn classes die afgeleid zijn van System.Exception of System.ApplicationException. Door zelf exception classes te maken kan je meer specifieke foutopvang doen en kan je meer gedetailleerde en gebruiksvriendelijkere informatie aan de gebruiker doorspelen. Deze excepties kan je opwerpen aan de hand van het throw keyword.

if(bepaalde voorwaarde) throw new SpecificException("Input error"); end if

9.4 FOUTAFHANDELING VIA GLOBAL.ASAX

Deze manier van foutafhandeling werd reeds besproken bij de bespreking van global.asax in hoofdstuk 5. De global.asax file bevat een Application_Error event dat telkens wordt uitgevoerd wanneer een onafgehandelde exceptie optreedt in de applicatie.49 Onafgehandelde excepties zijn fouten die niet werden opgevangen aan de hand van de hiervoor besproken technieken. Dit is dan ook de ideale plaats om onafgehandelde fouten weg te schrijven naar een log. Deze log kan dan later gebruikt worden om de onafgehandelde fouten te bestuderen en eventueel aanpassingen aan de applicatie aan te brengen.

Sub Application_Error(Sender As Object, E As EventArgs) Response.Write(" Error! <br>" + Server.GetLastError().Message) Response.End() End Sub

- HOOFDSTUK 9 - 66

Page 68: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

10. FLASH.NET 10.1 INLEIDING In de applicatie voor de bouw en inrichting van veestallen moet de gebruiker een aantal figuren kunnen worden getoond die de luchtcirculatie binnen een veestal simuleren. Deze figuren moeten dynamisch kunnen worden aangepast naar de wensen van de gebruiker. Hiervoor was het dus nodig om op de een of andere manier bewegende beelden in te bouwen in de applicatie. Een programma om dit te kunnen realiseren is Flash. Zoals het eerder besproken Fireworks is Flash een programma dat gemaakt is door Macromedia. Flash kan gebruikt worden voor het maken van geavanceerde, dynamische, interactieve animaties en applicaties. Steeds meer en meer websites worden gemaakt in Flash. Bij het zoeken naar artikelen over Flash is wel gebleken dat er meer artikelen TEGEN het gebruik van Flash zijn dan er voor. Niet geheel onverwacht aangezien Flash zijn krachten heeft, maar ook zijn beperkingen, net zoals het Internet nog steeds zijn beperkingen heeft.74 De belangrijkste beperkingen zijn :

• Er is een plugin voor nodig • Het laden van de flash animatie kan soms lang duren. • Er kan al gauw een overkill ontstaan. Zorg er dus voor dat de animatie zinvol is en

niet zoiets van: 'Kijk eens, ik kan Flash!', want dan ben je verkeerd bezig.

• Flash wordt ook veelvuldig genoemd als oorzaak van usability problemen. De creatieve vrijheid die Flash biedt, resulteert vaak in onduidelijke en niet-standaard user interfaces, die het rendement van de site verminderen.

Met de introductie van Flash MX wil Macromedia deze usability problemen aanpakken, en tot een alternatief voor HTML uitgroeien. Onderdeel van het nieuwe Flash is de mogelijkheid om data (bvb XML) met de server uit te wisselen.75 In onderstaande figuur wordt deze nieuwe mogelijkheid van Flash MX gevisualiseerd.

FIGUUR 14 – FLASH.NET werkwijze

In de applicatie voor de bouw en de inrichting van veestallen werd gebruik gemaakt van deze techniek voor het uitwisselen van data. Als de gebruiker in de flash animatie de instellingen voor de ventilatie heeft ingegeven zal deze informatie worden doorgestuurd naar een ASP.NET bestand op de server. Dit ASP.NET bestand zal deze informatie dan verwerken. Vervolgens zal het resultaat van deze verwerking door de server worden teruggestuurd naar de flash animatie. De animatie zal de op de server gegenereerde gegevens vervolgens gebruiken om de luchtcirculatie in de stal te visualiseren.

- HOOFDSTUK 10 - 67

Page 69: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

10.2 WERKWIJZE FLASH.NET 10.2.1 HOE DATA UITWISSELEN TUSSEN FLASH EN DE SERVER ? Langs de serverzijde is het de ASP.NET-file (data.aspx) die instaat voor het opvangen en het doorsturen van de informatie. Deze file zal de instellingen die door de animatie worden doorgestuurd verwerken en het resultaat van deze verwerking terugsturen. Hoe deze file de informatie juist opvangt,verwerkt en terugstuurt zal ik straks bespreken. Nu ga ik het eerst hebben over hoe Flash de gegevens(data) verzendt naar de server. Voor het verzenden van gegevens naar de server maakt Flash gebruik van ActionScript. ActionScript is de ingebouwde programmeertaal van Macromedia Flash.76 ActionScript biedt een betrekkelijk eenvoudige en overzichtelijke blik op de moderne programmeertechnieken. Het is immers een gebeurtenisgeoriënteerde programmeertaal waarvan de syntax vergelijkbaar is met JavaScript. Hieronder ziet u een schermafdruk van een stukje code in ActionScript. Deze code leest data uit een data.aspx file op de server. De ingelezen data wordt in de animatie ingevoegd.

FIGUUR 15 – FLASH.NET ActionScript

Aan de hand van bovenstaande schermafdruk zal nu besproken worden hoe Flash gegevens van de server opvangt en naar de server stuurt.77 Zoals te zien is in de code maakt Flash gebruik van een LoadVars object. Dit object is speciaal ontworpen voor het transfereren van naam/waarde paren tussen een flash animatie en een server. Het eerste wat je altijd moet doen om gegevens uit te wisselen met de server is een instantie van dit LoadVars() object aanmaken. myVars = new LoadVars(); Eens je via bovenstaande code een instantie van het LoadVars object hebt aangemaakt kan je met dit object beginnen werken. Om gegevens van de server op te halen moeten de gegevens in dit object worden geladen. Dit gaat heel eenvoudig via de load() functie dat dit object bezit. Er dient wel te worden opgemerkt dat de gegevens die worden geladen naam/waarde paren moeten zijn. Zo moet de data.aspx file waaruit de gegevens worden geladen de volgende inhoud hebben : naam1=waarde1&naam2=waarde2&… myVars.load("data.aspx");

- HOOFDSTUK 10 - 68

Page 70: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Het ophalen van gegevens van de server duurt enige tijd. Dit komt doordat de snelheid voor het ophalen van de gegevens afhangt van de snelheid van de verbinding. Daardoor kan het gebeuren dat de volgende instructie niet direct deze gegevens kan raadplegen. Men dient dus op de één of andere manier te wachten tot deze gegevens zijn ingeladen alvorens men ze kan verwerken. Dit kan door gebruik te maken van de gebeurtenis onLoad van het LoadVars object. Deze gebeurtenis treedt op van zodra het laden voorbij is. Aan deze gebeurtenis kan je een callback handler toewijzen. Dat is een blok code dat zal worden uitgevoerd van zodra de gebeurtenis optreedt. Hierdoor ben je zeker dat deze code slechts zal worden uitgevoerd als de data van de server is ingeladen. myVars.onLoad = function() { txtTest=myVars.var1; };

Dit is alles wat er in flash dient te gebeuren om gegevens van de server te kunnen ophalen. De gegevens kan je dan in de animatie inwerken door de waarden van de naam/waarde variabelen uit te lezen aan de hand van hun naam. Bovenstaande code kent op die manier de waarde van de variabele var1 toe aan de textbox txtTest.

Natuurlijk is het ook mogelijk om gegevens naar de server te sturen. Ook dit kan via het LoadVars object. Dit object heeft immers 2 methoden hiervoor, Send en SendAndLoad. De gegevens worden bij beide methoden op dezelfde manier verstuurd, namelijk als naam/waarde variabelen.

• Send neemt de naam/waarde variabelen uit het LoadVars object en stuurt deze naar de gespecificeerde file op de server.

• SendAndLoad zendt eveneens de naam/waarde variabelen uit het LoadVars object naar de gespecificeerde file op de server. Deze methode zal daarna echter ook alle variabelen die de server na verwerking terugstuurt in het LoadVars object opslaan.

Het dient te worden opgemerkt dat gegevens via deze methoden enkel naar serverside scripts (zoals asp.net) kunnen worden gestuurd. Serverside scripts kunnen immers geprogrammeerd worden om met deze gegevens iets te doen. Deze gegevens naar een textfile sturen zou immers geen effect hebben.

De gegevens kunnen in beide methoden op 2 manieren worden verstuurd :

• Get : Hiermee zullen de gegevens achteraan de URL, waarnaar ze verstuurd worden, worden toegevoegd. Dit heeft echter een beperking daar je maar 255 karakters hebt om de gegevens in onder te brengen.

• Post : Hiermee zullen de gegevens in de body van de http server request worden opgeslagen. De beperking van get geldt hier niet.

Onderstaand stukje code vat bovenstaande theorie voor het verzenden van gegevens naar de server nog even samen. Het vraagt de server naar de gegevens van de persoon “Verstockt Steven”. De server zal deze gegevens opzoeken en terugsturen. Flash zal deze gegevens dan in de animatie tonen op de plaats waar ze nodig zijn. myVars = new LoadVars(); myVars.persoon = “Verstockt Steven”; myVars.sendAndLoad("verwerkLeden.aspx", myVars, "POST"); myVars.onLoad = function(success) { txtBox = myVars.gegevens; }

- HOOFDSTUK 10 - 69

Page 71: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

10.2.2 HOE DATA UITWISSELEN TUSSEN DE SERVER EN FLASH ? Zoals reeds aangehaald enkele pagina’s terug is het langs de serverzijde de ASP.NET-file (data.aspx) die instaat voor het opvangen en het doorsturen van de informatie naar de flash animatie. Hoe deze file de informatie juist opvangt,verwerkt en terugstuurt zal ik nu bespreken.78 Daar de flash animatie enkel naam/waarde variabelen kan verwerken met het LoadVars object, moet de output van de ASP.NET-file naam/waarde variabelen zijn. Een voorbeeld van mogelijk output is : naam=Verstockt&voornaam=Steven&leeftijd=21 Een aspx pagina schrijven die als output bovenstaand resultaat heeft is niet zo moeilijk. Merk op dat de aspx pagina gebruik kan maken van alle faciliteiten van ASP.NET en deze gegevens dus bijvoorbeeld uit een databank kan ophalen. Onderstaande code produceert bovenstaand resultaat. Als het LoadVars object in de flash animatie een load uitvoert op de aspx file waar deze code zich in bevindt zal de bovenstaande output naar het LoadVars object worden gestuurd. <%@ Page Language="VB" %> <script language="VB" runat="server"> Sub Page_Load(sender As Object, e As EventArgs) Dim Naam,Voornaam As String Dim Leeftijd As Integer Naam=”Verstockt” Voornaam=”Steven” Deze gegevens kunnen ook uit een databank komen Leeftijd=”21” Response.Write("naam=" + Naam); Response.Write("&voornaam=" + Voornaam); Response.Write("&leeftijd=" + Leeftijd); End Sub </script> Bovenstaand code verstuurt enkel data naar het LoadVars object. Natuurlijk moet een aspx file ook data van dit object kunnen ontvangen. Als het LoadVars object immers een Send of sendAndLoad doet naar de aspx pagina moet de informatie die door het object verzonden wordt kunnen worden verwerkt. Hiervoor kan je gebruik maken van het Request object (gebaseerd op de klasse HttpRequest). ASP.NET genereert het Request object automatisch van zodra een pagina wordt uitgevoerd. De data die via Get of Post door het LoadVars object werd meegezonden bevindt zich dan in dit Request object. Deze data uitlezen kan op verschillende manieren.

• Als je niet op voorhand weet welke naam/waarde variabelen het LoadVars object zal versturen, kan je gebruik maken van Request.ServerVariables.ToString(). Deze geeft een string terug van de vorm naam1=waarde1&naam2=waarde2&… . De verschillende naam/waarde variabelen kan je dan uitlezen met onderstaande techniek.

Dim Vars As String = Request.ServerVariables.ToString() foreach (string var in Vars.Split('&')) { Response.Write(var+"<br/><br/>") }

• Weet je echter wel welke naam/waarde variabelen werden verzonden kan je gemakkelijk de waarde van de gewenste variabele uitlezen met Request[“var”].

Dim Variabele1 As String = Request["var1"]

Response.Write(Variabele1)

- HOOFDSTUK 10 - 70

Page 72: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

10.3 ANDERE VORMEN VAN DATA-UITWISSELING MET FLASH.NET 10.3.1 UITWISSELING VAN XML DATA In de applicatie voor de bouw en de inrichting van veestallen heb ik enkel van de hiervoor besproken techniek van data-uitwisseling gebruik gemaakt (via het LoadVars object). Het uitwisselen van data tussen flash en de server beperkt zich echter niet alleen tot de uitwisseling van naam/waarde variabelen. Er bestaan immers ook nog enkele andere vormen van data-uitwisseling die mogelijk zijn. Een eerste vorm van data-uitwisseling die ook mogelijk is tussen Flash en de server is de uitwisseling van XML.79 Wat XML juist is en hoe je XML code moet schrijven werd reeds kort beschreven in het onderdeel omtrent de menu user control. Ik zal eerst bespreken wat er aan de flashzijde dient te gebeuren om XML data te kunnen ontvangen en te kunnen sturen naar de server. ActionScript in Flash MX heeft enkele ingebouwde objecten en functies om XML te interpreteren. Bij de uitwisseling van XML tussen flash en de server zal men van deze gebruik moeten maken. Het belangrijkste object is het XML object. Hiervan dienen we eerst een instantie aan te maken. myXML = new XML(); Vervolgens laten we het object weten waar het zijn xml-data op de server kan vinden. In onderstaande code zal de xml-data op de server worden gegenereerd door een aspx-file. Daar de snelheid van het laden afhankelijk is van de verbinding moeten we hier ook wachten tot alle xml data is ingeladen alvorens met de verwerking te starten. Het mechanisme dat hiervoor wordt gebruikt is hetzelfde als bij de data-uitwisseling van naam/waarde variabelen. myXML.load("xmldata.aspx"); myXML.onLoad = function(success) { if (success) { ... verwerking van de xml } else { status_txt.text = "Error Loading XML"; } } Er wordt gebruik gemaakt van de parameter success om te controleren of de XML die werd ingeladen in orde is. Indien dat zo is wordt de xml verwerkt (bvb in de flash animatie getoond). Het aanspreken van de verschillende elementen in de XML-data gebeurt aan de hand van het pad in de XML-boom. Deze boom geeft de hiërarchie weer van de data in de xml-file. Het bovenste element van de boom (root) spreek je aan via myXML.firstChild. Het eerste kind van dit element (voornaam) spreek je aan met myXML.firstChild.firstChild. Om achternaam aan te spreken moet je dan myXML.firstChild.firstChild.nextSibling gebruiken. Met nextSibling wordt immers naar de volgende knoop in de boom gezocht die dezelfde ouderknoop heeft. De waarde van de knoop uitlezen kan met behulp van nodeValue. FIGUUR 16 – XML-boom myXML.firstChild.firstChild.nodeValue geeft je de voornaam van persoon1 myXML.firstChild.firstChild.nextSibling.nodeValue geeft je de achternaam

- HOOFDSTUK 10 - 71

Page 73: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Langs de serverzijde moet er ook het één en het ander worden veranderd. De ASP.Net pagina moet nu immers XML genereren als output. Er zijn verschillende manieren waarop dit gedaan kan worden. Ik zal er hier 1 van bespreken. De methode die hier besproken wordt maakt gebruik van het .NET’s XMLDocument object (uit System.Xml). Dit is het object dat in .NET gebruikt wordt voor het afhandelen van volledige XML documenten. Er zijn 2 manieren waarmee je het object van data kan voorzien :

• LoadXml() is een methode waarmee je rechtstreeks tekst in XML-formaat in het XMLDocument object kan stoppen. De opbouw van het xml-document (elementen,attributen aanmaken) wordt door de methode zelf gedaan. Je hoeft dus enkel een XML-string aan te maken.

Dim xmlString As String

xmlString = "<Persoon1><voornaam>Steven</voornaam>" xmlString += "<achternaam>Verstockt</achternaam></Persoon1>" Dim xmlDoc As XmlDocument xmlDoc = new XmlDocument() xmlDoc.LoadXml(xmlString)

• CreateElement(), SetAttribute() en AppendChild() zijn enkele methoden

voor het programmatisch opbouwen van het XML-document. Als je gebruik maakt van deze methoden moet je dus zelf de opbouw van het XML-document verzorgen. Met CreateElement() maak je een nieuw XML-element aan. Met SetAttribute() kun je daar dan een attribuut aan toevoegen. Het toekennen van een waarde aan het element doe je via de InnerText eigenschap. Wanneer het element dan volledig klaar is kan je het toevoegen als kind van een ander element via de AppendChild() methode.

Dim xmlDoc As XmlDocument = new XmlDocument() Dim rootElement As XmlElement = xmlDoc.CreateElement("Persoon1") Dim naamElement As XmlElement = xmlDoc.CreateElement("voornaam") naamElement.InnerText = "Steven" Dim achternaamElement As XmlElement = xmlDoc.CreateElement("achterrnaam") achternaamElement.InnerText = "Verstockt" rootelement.AppendChild(naamElement) rootelement.AppendChild(achternaamElement) xmlDoc.AppendChild(rootElement) We weten nu al hoe we xml-data in het object kunnen onderbrengen. De aspx-file moet deze informatie nu nog kunnen teruggeven als de pagina wordt opgeroepen. Hiervoor dienen er nog een aantal zaken te worden gedaan. Bovenaan de aspx-file moet in het @Page directief het ContentType op “text/xml” worden gezet. Ook de System.Xml naamruimte dient te worden geïmporteerd opdat we van het XmlDocument gebruik zouden kunnen maken. <%@ Page Language="VB" ContentType = "text/xml" %> <%@ Import Namespace="System.Xml" %> Tot slot dient de inhoud van het XmlDocument object nog naar het outputkanaal te worden gestuurd. Hiervoor dient de Save methode te worden gebruikt die de output naar het outputkanaal Response.output zal sturen. De aspx-pagina is nu klaar om xml-data terug te sturen. xmlDoc.Save(Response.Output)

- HOOFDSTUK 10 - 72

Page 74: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

10.3.2 UITWISSELING VAN GELUID, FILM EN AFBEELDINGEN Zoals de titel van dit onderdeel al aangeeft is Flash MX ook in staat om naast naam/waarde variabelen en XML-data nog andere soorten data uit te wisselen. Zo is het immers in Flash MX ook mogelijk om geluid, film (SWF flash movie) en afbeeldingen (JPEG) uit te wisselen met de server.78 De belangrijkste methodes die hiervoor gebruikt kunnen worden zal ik hier kort even bespreken.

• loadMovie() en loadMovieNum() zijn 2 acties in ActionScript waarmee je JPEG afbeeldingen en SWF flash animaties van de server kan ophalen en op een bepaalde plaats in je animatie kan inwerken.

• Met het Sound object kan je audio files ophalen en afspelen.

Langs de serverzijde moet de aspx-file nu dus informatie van deze types als output genereren. Hoe dit in zijn werk gaat zal ik hier echter niet behandelen. Voor meer uitleg omtrent dit onderwerp verwijs ik u echter door naar andere werken in verband met Flash.Net.

10.4 SIMULATIE VAN DE LUCHTCIRCULATIE IN EEN VEESTAL

Zoals reeds enkele malen werd aangehaald heb ik voor de simulatie van de luchtcirculatie in een veestal gebruik gemaakt van flash.net. De flash animatie vraagt de gebruiker om enkele instellingen in te geven :

• de stand van de ventilatieklep • het verschil tussen de binnen en buitentemperatuur • de snelheid van de wind

Deze instellingen worden dan naar een aspx-pagina op de server gestuurd die aan de hand van deze instellingen enkele parameters zal berekenen voor de luchtcirculatie in de stal. Deze parameters worden dan teruggezonden naar de flash animatie. Deze zal vervolgens de luchtstroom in de stal visualiseren.

FIGUUR 17 – FLASH klepventilatie

- HOOFDSTUK 10 - 73

Page 75: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Conclusie

Om deze scriptie te beëindigen zal ik de belangrijkste conclusies die doorheen deze tekst

terug te vinden zijn nog even aanhalen :

-> Een goede user interface : - heeft een goede ontsluiting - is doelgericht - is gebruiksvriendelijk - heeft een duidelijke structuur - bezit een goede stijl van schrijven

-> ASP.NET is geschikt voor het maken van dynamische, professionele en onderhoudbare webapplicaties - AGRI-VET info is hier een bewijs van

-> Internationalisatie maakt webapplicaties wereldwijd bruikbaar - Lokalisatie is zeer eenvoudig en gebeurt buiten de applicatie

-> FLASH.NET maakt data-uitwisseling tussen FLASH en ASP.NET mogelijk - Invoegen van dynamische, interactieve animaties in ASP.NET applicaties - Oplossing voor enkele beperkingen van Flash

- REFERENTIES - 74

Page 76: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Referenties

1. Dekker, H. (2002, 3 september). Nut en gemak voor de bezoeker. Update Webdesign Usability. 2. Nielsen, J., & Morkes, J.(1997). How to Write for the Web. http://www.useit.com/papers/webwriting/writing.html 3. Huizing, K. J., & Taatgen, W. (1999, mei). Klantgerichte websites : Het raamwerk van de website. Utrecht : A.W. Bruna Uitgevers B.V. 4. Jorna, M. (2000). Pakkende websites bouwen : Doel & Doelgroep. Houten: Van Holkema & Warendorf/Unieboek bv 5. Vroom, B. (1999, maart). Het testen van websites. Tekst[blad], 99/1. 6. Rourke, C. (2002, augustus). Interview with Jared Spool. Interfaces Magazine from the British HCI Group. 7. Myer, T. (2002, mei). Web content usability. IBM developerWorks : Web architecture 8. De Vriendt, D. (2000) Een heldere en logische structuur ontwikkelen. http://schoolweb.argo.be/envelop/nl_metho/index_architectuur.htm 9. Vroom, B. (2001, november). Hou rekening met hoe bezoekers websites bekijken. http://www.benvroom.nl/pretestenlesdrempelsweg.htm. 10. Vanstappen, K. (2002, mei). Schrijven voor het beeldscherm. Ziff Davis Smart Business, 72-73. 11. Van Daele, T. (2001, juli). Doe het met stijl. Computer Magazine, 2001/4, 74-75. 12. Vanstappen, K. (2001, november). Somewhere over the Rainbow… . Smart Business, nr 11.

13. FHJ studenten (1999). Schrijven voor het web : omgekeerde piramidestructuur. Atlas Online.

14. Flanders, V. (2002, april). Son of Web Pages That Suck: Learn Good Design by Looking at Bad Design. Londen : Sybex.

15. Van Elswijk, M. (1999, februari). De ontwikkeling van GUI’s kent vele gezichten. Software Release Magazine 1, 37-40. 16. Human Interface Group. User Interface Design : Method. http://www.higroup.com/uidmeth.htm 17. Oppeneer, M. (2000, december). NET platform : Eindelijk eenheid. EOS,112-113. 18. DePetrillo, B. (2002). Microsoft.Net : Een Inleiding. Amsterdam : Pearson Education. (Vertaling van: Think Microsoft.Net)

- REFERENTIES - 75

Page 77: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

19. Thai, T.L., & Lam,H. (2001, juni). .NET Framework Essentials :Chapter 1 Design Goals. Cambridge : O'Reilly. 20. Hoffman, K. , Hasan, J., et al. (2001, september). Professional .NET Framework : Chapter 2 Overview of the .NET Framework. Birmingham : Wrox Press. 21. Peterson, J. (2001). An overview of ASP.NET. http://www.asp101.com/aspdotnet/aspplus/index.asp 22. Homer, A. (2002, november). Professional ASP.NET Web Forms Techniques. Birmingham : Wrox Press. 23. Crouch, M.J. (2002, mei). ASP .NET and VB .NET Web Programming : Chapter 2. Boston : Addison-Wesley. 24. Nicholson, M. (2001). ADO.NET essentials. DNJ online 25. Ramesh, B. (2002). Overview of Microsoft ADO.NET. http://www.stylusinc.net/technology/microsoft/ado.shtml 26. Holzner, S. (2002). Visual Basic.Net Black Book : Chapter 20 : Data Access with ADO.NET. Scottsdale : Coriolis. 27. Page, B. (2000, november). Building The Tower Of Babel: The Web Goes Global. TechWeb News. 28. Green, D. (2001). Internationalization : Introduction. Sun Microsystems 29. Diller, P. (1999). Globalization, Internationalization & Localization. http://philip.pristine.net/glit/ 30. VB Helper Tutorial : Internationalization. http://www.vb-helper.com/tut9.htm 31. Fernandez, F. (2000). Get ready to go international. 15 seconds. 32. Savourel, Y. (2001, juni). XML internationalization and localization. Indianapolis : Sams Publishing 33. Lerner, M. (1999, september). Building worldwide Web sites. IBM developerworks 34. Cornes, O. (2001, oktober). Working with cookies in ASP.Net. Squiffler 35. Makoviney, D. (2000). Reading and writing cookies in ASP.NET. ASP Alliance 36. Leinecker, R. (2002, augustus). Using ASP.NET Request Objects. InformIT 37. Khan, F. (2001, augustus). Browser Capabilities Component in ASP.NET. StarDeveloper.Com 38. Duthie, G.A. (2002). Microsoft ASP.NET step by step : Chapter 6. Redmond : Microsoft Press, p.101-121. 39. Syme, P. (2001). Working With The Session Object. 10 Lessons in C#. 40. Prosise, J. (2002). Programming Microsoft.Net : Session State . Redmond : Microsoft Press, p.438-442.

- REFERENTIES - 76

Page 78: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

41. Platt, D.S. (2001, mei). Introducing Microsoft.Net : Chapter 3 ASP.NET State Management. Redmond : Microsoft Press. 42. Gunderloy, M. (2000). Exploring ASP.NET Session State Alternatives :Cookieless State. Hardcore Asp.Net 43. Quinn, P. (2002, juni). The Global.asax File. ASP Alliance 44. Khan, F. (2001). Built in ASP objects - Active Server Pages Reference. StarDeveloper.Com 45. Walther, S. (2002, juni). Creating ASP.NET Applications :Using Application State. Indianapolis : Sams Publishing. 46. Choksi, D. (2002, april). A Detailed View of the Global.asax File. http://www.c-sharpcorner.com/asp/Articles/DetailedViewOfGlobalAsaxDPL.asp 47. Ryan, D. & Ryan, T. (2002). ASP.NET : ASP.NET Applications & State Management. New York : Hungry Minds, p. 210-234. 48. McManus, J. & Kinsman, C. (2002, maart). C# Developer's Guide to ASP.NET, XML, and ADO.NET : Chapter 5 Configuration and Deployment. Boston : Addison-Wesley. 49. Joshi, B. (2002, juli). Error handling in ASP.NET applications. DotNetJunkies 50. Mitchell, S. (2001, augustus). ASP.NET : Specifying Configuration Settings in Web.config. Indianapolis : Sams Publishing. 51. Farmer, C. (2001, september). Customizing Web Config in ASP.NET. Birmingham : Wrox Press. 52. Chinnathampi, J. (2001, november). Web.config. ASP Alliance 53. Duthie, G.A. (2002). Microsoft ASP.NET step by step : Chapter 7. Redmond : Microsoft Press, p.127-171. 54. Gundavaram, S. (1996). CGI Programming on the World Wide Web : Chapter 5 Server Side Includes. Cambridge : O'Reilly. 55. Liberty, J. & Hurwitz, D. (2002, februari). Programming ASP.NET : Chapter 14 Custom and User Controls. Cambridge : O'Reilly. 56. Peterson, J. (2002). User Controls. http://www.asp101.com/lessons/usercontrols.asp 57. Holzner, S. (2002). Visual Basic.Net Black Book : Chapter 9 : Mainmenu. Scottsdale : Coriolis, p.403-417. 58. Chapman, J. (2003, februari). Create a Simple, Cross-Browser, Dropdown Menu User Control. Birmingham : Wrox Press. 59. Harold, E.R. & Means, W.S. (2002, juni). XML in a Nutshell, 2nd Edition : Part 1 XML Concepts. Cambridge : O'Reilly. 60. Harold, E.R. & Means, W.S. (2002, juni). XML in a Nutshell, 2nd Edition : Chapter 8 XSL Transformations. Cambridge : O'Reilly.

- REFERENTIES - 77

Page 79: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

61. Gibson, G. (2001, juni). Hierarchy Menus in Fireworks. DesignNewz 62. Carolina, C. (2002). Security Features in ASP.NET – Authentication. ASP101 63. Duthie, G.A. (2002). Microsoft ASP.NET step by step : Chapter 8 Security in ASP.NET. Redmond : Microsoft Press, p.127-171. 64. Prosise, J. (2002). Programming Microsoft.Net : Chapter 10 Security. Redmond : Microsoft Press, p.438-442. 65. Microsoft MSDN (2003). Forms Authentication Credentials. MSDN .NET Framework Developers Guide. 66. Robinson, T. (2002, June). Microsoft Passport : Like It or Not ? E-Commerce Times, 25 juni 2002. 67. Bertolucci, J. (2001, oktober). CNET unravels the mysteries surrounding Passport. CNET Reviews. 68. Dicken, C. (2003). Simple security with ASP. Developer.com 69. Bundock, R. (2001). Asp and the error handler. 15 Seconds. 70. Duthie, G.A. (2002). Microsoft ASP.NET step by step : Chapter 16 Tracing and debugging ASP.NET applications. Redmond : Microsoft Press, p.505-506. 71. Bipin, J. (2002, juli). Error handling in ASP.NET applications. DotNetJunkies 72. Tulliper, A. (2002). Web Application Error Handling in ASP.NET. 15 Seconds 73. Donny, M. (2000, december). Using the Try-Catch-Finally statement. DotnetJunkies 74. Jackson, A. (2000, december). Is Flash really 99% Bad. Clickz Today. 75. Bisson, S. (2002, april). Flash Gets Funky. Application Development Advisor, p.35-38. 76. Livingstone, D. (2002, December). Introduction to ActionScript. Indianapolis : Prentice Hall PTR 77. Porter, E. (2002, juli). Integrating Macromedia Flash MX and Microsoft ASP.NET. DotnetJunkies 78. Bizzell, C., Neal, D. , et al. (2002, november). Flash.NET : Dynamic content for designers with flash remoting & ASP.NET : Chapter 2 Talking to the server. Friends of Ed, p.35-70. 79. Tindale, I., MacDonald, P. & Rowley, J. (2001). Flash XML StudioLab. Schoonhoven : Academic Services.

- REFERENTIES - 78

Page 80: ONTWIKKELING VAN EEN WEB GEORIËNTEERDE GEGEVENS- …lib.ugent.be/fulltxt/RUG01/000/778/613/RUG01-000778613_2010_0001_AC.pdfHieronder staat de omschrijving van de afstudeeropdracht,

Bijlagen

1. Thesispresentatie 17 juni 2003

2. Handleiding voor het updaten van AGRI-VET info

3. CD-ROM

- Bevat alle code van de AGRI-VET info webapplicatie

- Bevat directory FLASHNET met enkele FLASH.NET voorbeelden

Exercice 1 : Ophalen van tekstuele data in Flash uit aspx file op server

Exercice 2 : Query van databank in Flash via aspx file op server

Exercice 3 : Uitwisselen van afbeeldingen (JPEG)

ASP.NET genereert afbeelding , Flash presenteert ze in movie

- Bevat directory MENU_UC met code voor menu user control

- BIJLAGEN - 79