62
Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe HOOFDSTUK 1 INLEIDING..................................................................................... 1 1.1 Webdesign ..................................................................................................................... 1 1.1.1 Definiëring van doelstellingen, een ontwerpplan en de doelgroep ........................ 1 1.1.2 Welke sfeer straalt een website uit ......................................................................... 1 1.1.3 Ontwerpen van designelementen en pagina lay-out............................................... 1 1.1.4 Structuur van de website ........................................................................................ 2 1.1.5 Creëren van een webtemplate ................................................................................ 3 1.2 HTML ........................................................................................................................... 3 1.3 Cascading Style Sheets................................................................................................. 3 1.4 Server-side scripting versus client-side scripting ...................................................... 5 1.5 Java Server Pages (server-side scripting) .................................................................. 5 1.6 Javascript (client-side scripting) ................................................................................. 6 1.7 MySQL .......................................................................................................................... 7 HOOFDSTUK 2 DOELSTELLING ........................................................................... 8 HOOFDSTUK 3 GEBRUIKTE STRATEGIËEN EN TECHNOLOGIËEN ................. 9 3.1 Studie oude website Formal Methods Europe........................................................... 9 3.1.1 Menu-systeem ...................................................................................................... 10 3.1.2 Lay-out ................................................................................................................. 10 3.2 Webstatistieken Formal Methods Europe ............................................................... 11 3.3 Opbouw nieuwe website Formal Methods Europe ................................................. 13 3.3.1 Fase 1: ontwikkeling HTML construct ................................................................ 13 3.3.1.1 FME banner...................................................................................................... 15 3.3.1.2 FME logo ......................................................................................................... 15 3.3.1.3 Menu-systeem .................................................................................................. 16 3.3.1.4 Decoratieve scheiding menu-tekst ............ Fout! Bladwijzer niet gedefinieerd. 3.3.1.5 Tekst ................................................................................................................. 16 3.3.1.6 Submenu........................................................................................................... 16 3.3.1.7 Decoratieve scheiding tekst-copyright ............................................................. 17 3.3.1.8 Copyright ......................................................................................................... 17 3.3.2 Fase 2: optimalisatie en uniformisering inhoud via Cascading Style Sheets ....... 17 3.3.3 Fase 3: creatie van mySQL databank ................................................................... 19 3.3.4 Fase 4: creatie jsp pagina’s voor de bevraging van mySQL databank ............... 20 3.3.4.1 Declaratie van lege Connection, Statement en ResultSet variabelen: ............. 21 3.3.4.2 Creëren van een connectie met de mySQL server ........................................... 21 3.3.4.3 Opstellen van specifieke tabelafhankelijke SQL statements ........................... 22 3.3.4.4 Afhalen van specifieke informatie uit de database .......................................... 22 3.3.4.5 Sluiten van de connectie................................................................................... 23 3.3.5 Fase 5: afwerking website met Flash intro........................................................... 23

HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

Inhoudstabel

De ontwikkeling van een nieuwe website Formal Methods Europe

HOOFDSTUK 1 INLEIDING..................................................................................... 1

1.1 Webdesign ..................................................................................................................... 1 1.1.1 Definiëring van doelstellingen, een ontwerpplan en de doelgroep ........................ 1 1.1.2 Welke sfeer straalt een website uit ......................................................................... 1 1.1.3 Ontwerpen van designelementen en pagina lay-out............................................... 1 1.1.4 Structuur van de website ........................................................................................ 2 1.1.5 Creëren van een webtemplate ................................................................................ 3

1.2 HTML ........................................................................................................................... 3

1.3 Cascading Style Sheets ................................................................................................. 3

1.4 Server-side scripting versus client-side scripting ...................................................... 5

1.5 Java Server Pages (server-side scripting) .................................................................. 5

1.6 Javascript (client-side scripting) ................................................................................. 6

1.7 MySQL .......................................................................................................................... 7

HOOFDSTUK 2 DOELSTELLING ...................................... ..................................... 8

HOOFDSTUK 3 GEBRUIKTE STRATEGIËEN EN TECHNOLOGIËEN ............ ..... 9

3.1 Studie oude website Formal Methods Europe ........................................................... 9 3.1.1 Menu-systeem ...................................................................................................... 10 3.1.2 Lay-out ................................................................................................................. 10

3.2 Webstatistieken Formal Methods Europe ............................................................... 11

3.3 Opbouw nieuwe website Formal Methods Europe ................................................. 13 3.3.1 Fase 1: ontwikkeling HTML construct ................................................................ 13

3.3.1.1 FME banner ...................................................................................................... 15 3.3.1.2 FME logo ......................................................................................................... 15 3.3.1.3 Menu-systeem .................................................................................................. 16 3.3.1.4 Decoratieve scheiding menu-tekst ............ Fout! Bladwijzer niet gedefinieerd. 3.3.1.5 Tekst ................................................................................................................. 16 3.3.1.6 Submenu ........................................................................................................... 16 3.3.1.7 Decoratieve scheiding tekst-copyright ............................................................. 17 3.3.1.8 Copyright ......................................................................................................... 17

3.3.2 Fase 2: optimalisatie en uniformisering inhoud via Cascading Style Sheets ....... 17 3.3.3 Fase 3: creatie van mySQL databank ................................................................... 19 3.3.4 Fase 4: creatie jsp pagina’s voor de bevraging van mySQL databank ............... 20

3.3.4.1 Declaratie van lege Connection, Statement en ResultSet variabelen: ............. 21 3.3.4.2 Creëren van een connectie met de mySQL server ........................................... 21 3.3.4.3 Opstellen van specifieke tabelafhankelijke SQL statements ........................... 22 3.3.4.4 Afhalen van specifieke informatie uit de database .......................................... 22 3.3.4.5 Sluiten van de connectie................................................................................... 23

3.3.5 Fase 5: afwerking website met Flash intro ........................................................... 23

Page 2: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

Inhoudstabel

De ontwikkeling van een nieuwe website Formal Methods Europe

3.4 Gedetailleerde bespreking gebruikte scripten ......................................................... 23 3.4.1 Menu systeem ...................................................................................................... 23

3.4.1.1 PropertyX rij .................................................................................................... 24 3.4.1.2 MenuX array .................................................................................................... 25

3.4.2 Submenu ............................................................................................................... 26 3.4.3 Dynamische sitemap ............................................................................................ 27

3.4.3.1 showMap() ....................................................................................................... 27 3.4.3.1.1 createEntry(menu) ...................................................................................... 28 3.4.3.1.2 selectMenu(showString) ............................................................................ 28 3.4.3.1.3 validate(stringURL, v1, v2) ....................................................................... 28

3.4.4 JSP – bevraging mySQL databank ....................................................................... 28 3.4.4.1 Bevraging van de FME-databank..................................................................... 28 3.4.4.2 Query van de FME-databank ........................................................................... 31 3.4.4.3 Update van de FME databank .......................................................................... 34

HOOFDSTUK 4 APPENDICES ............................................................................. 38

Appendix A De functie printSubmenu() ........................................................................ 38

Appendix B De functie showMap() ................................................................................ 39

Appendix C JavaScript menu-systeem .......................................................................... 41 C.1 Mmenu.js .................................................................................................................. 41 C.2 Mmenu_array.js ....................................................................................................... 49

HOOFDSTUK 5 REFERENTIES ............................................................................ 60

Page 3: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

1 Hoofdstuk 1 Inleiding

De ontwikkeling van een nieuwe website Formal Methods Europe

H o o f d s t u k 1 I N L E I D I N G

1.1 Webdesign

1.1.1 Definiëring van doelstellingen, een ontwerpplan en de doelgroep

Vooraleer men er aan denkt een webdesignproject uit te tekenen of al de eerste schuchtere poging tot een design

rechtstreeks probeert te implementeren in code, moet men beschikken over een weldoordacht en sterk basisplan

waarop men een toekomstig ontwerp kan baseren.

Daarbij is het van belang dat men het ontwerp goed omkadert en laat afhangen van de doelstellingen die vooraf

bepaald worden. Welk doel wil ik bereiken met de website, moet de website veel bezoekers trekken,… ?

Het is tevens van groot belang dat men zich een idee kan vormen van de potentiële doelgroep van de website.

Zijn de bezoekers klanten, vrienden, collega’s,… Weten zij waarover de website zal gaan, of zijn het bezoekers

die toevallig terecht komen op de site, of komt men met een specifiek bedoeling op de site terecht?

Als je deze doelstellingen én begrijpt én als je een beeld kan vormen van de bezoeker, dan is de basis gelegd

voor verdere ontwerpbeslissingen: welke sfeer moet de site uitstralen, hoe zal de structuur opgebouwd zijn, het

grafisch ontwerp, de inhoud, interactiviteit.

1.1.2 Welke sfeer straalt een website uit

Het bepalen van een overkoepelende sfeer van een website is onlosmakelijk verbonden aan de doelstelling

(informatief, ontspanning, verkoop,…), het onderwerp van de site en de doelgroep. De sfeer die men wenst te

creëren is dan een soort gids die alles zal bepalen: de inhoud, de structuur, het grafisch ontwerp,…

Sfeer wordt visueel (grafisch) gecreëerd door het gebruik van een zogezegd “kleurenschema”. Door het gebruik

van specifieke kleurencombinaties kan men een welbepaalde sfeer maken: zeer flitsende, opvallende en heldere

kleuren voor een ontspanningswebsite, meer donkere en conservatieve kleuren voor een zakelijke website,…

Eénmaal de sfeer is bepaald kan men consistente ontwerpelementen zoals logo’s, ‘titlebanners’, knoppen,…gaan

ontwerpen.

1.1.3 Ontwerpen van designelementen en pagina lay-out

Om er voor te zorgen dat een website aangenaam leesbaar is en goed overkomt, moet men ervoor zorgen dat het

design en de opmaak doorheen de website zeer consistent is. Een consistente website vormt een goed afgesloten

geheel waarbinnen de bezoeker zich op zijn/haar gemak voelt. De pagina lay-out is dus van zeer groot belang.

Men kan er bijvoorbeeld voor zorgen dat pagina’s slechts enkele schermen lang zijn met veel witruimte, dat het

ontwerp voor schermresoluties van 800 x 600 en 1024 x 768 wordt gemaakt (de meeste mensen gebruiken deze

resoluties – 640 x 480 heeft bijna afgedaan). Een grote flexibiliteit in het ontwerp zal er ook voor zorgen dat de

website door de meeste internet browsers goed getoond wordt.

Op het gebied van achtergrondkleur voor de webpagina’s is de keuze eindeloos. Belangrijk is wel dat de

leesbaarheid van de tekst niet verstoord wordt. Een goed contrast tussen tekst en achtergrondkleur is dus van

belang. Een witte achtergrond met donkere letters verhoogt dus de leesbaarheid.

Page 4: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

2 Hoofdstuk 1 Inleiding

De ontwikkeling van een nieuwe website Formal Methods Europe

Het logo voor een website moet als het ware het vaste, terugkerende grafische element van de site worden en

moet de de organisatie, het bedrijf of de boodschap die achter de site steekt symboliseren. Het logo kan zelfs als

onderdeel van de titelbanner geïntegreerd zijn.

Tijdens het ontwerp ,en dan vooral tijdens de opbouw van de structuur van de site, is het belangrijk dat grote

onderdelen gescheiden worden van elkaar door zogenaamde ‘dividers’. Deze grafische elementen (bv. de <hr> -

tag in HTML of een grafisch ontworpen divider) dragen bij tot de overzichtelijkheid van een site. Zo kan

bijvoorbeeld de titelbanner en logo gescheiden worden van de eigenlijke inhoud,…

Grafische elementen vertragen daarentegen de inlaadtijd van een pagina en kunnen voor mensen met een trage

internetverbinding tot frustraties leiden.

De twee belangrijkste beeldformaten die gebruikt worden in websites voor het ontwerp van grafische elementen

zijn het JPEG en GIF image formaat.

• JPEG – Jointless Photographic Experts Group (.jpg) - wordt het best gebruikt voor foto’s. Hoewel ze

doorgaans “lossy” gecomprimeerd zijn blijft de kwaliteit hoog. Bovendien is dit 24-bit formaat ,wat

ruwweg overeenstemt met 16 miljoen kleuren, kleiner dan vergelijkbare 8-bit GIF-afbeeldingen. Ze

kunnen weliswaar voor vertraging zorgen tijdens het inladen van webpagina’s omdat de browser deze

afbeeldingen eerst moet decomprimeren.

• GIF – Graphic Interchange Format (.gif) – is goed voor clipart bestanden of illustraties. Ze gebruiken 8-

bit (256 kleuren) of minder en gebruiken verliesloze compressie.

De ideale grootte van alle grafische elementen op één webpagina is onder de 30K à 60K. Deze grens zorgt

ervoor dat weinig tot geen vertragingen ontstaan tijdens het binnenhalen van dergelijke pagina. Indien niet aan

deze voorwaarde kan voldaan worden is het belangrijk dat de grafische elementen optimaal ontworpen en

geïntegreerd zijn in de HTML-code. Gebruik bijvoorbeeld altijd “height=”, “width=” en “alt=” tags om de

download-snelheid te verhogen en de site-opmaak consistent te houden. Zorg ervoor dat gebruikte grafische

elementen een meerwaarde betekenen voor de site (bv logo’s, dividers,…), maak van zeer grote beelden een

‘thumbnail’ met een link naar de originele foto op een aparte pagina, gebruik zogenaamde ‘image maps’,…

1.1.4 Structuur van de website

Alle websites bestaan uit pagina’s die onderling gelinkt zijn door zogenaamde hyperlinks. De vraag welke

structuur de website moet krijgen, hangt af van de eerder bepaalde doelstelling:

• Wil men een zeer inhoudrijke website?

• Wil men een lineaire website (boekvorm)?

• Wil men een willekeurige collectie van webpagina’s, gekoppeld via menu’s, links?

• …

De keuze voor een bepaalde structuur hangt af van de opbouw van pagina’s en hoe men ze wil koppelen aan

elkaar.

Page 5: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

3 Hoofdstuk 1 Inleiding

De ontwikkeling van een nieuwe website Formal Methods Europe

Navigatie binnen een site zal dan ook de opbouw van een site bepalen. Een bezoeker mag niet verdwalen binnen

een website en moet zich altijd kunnen oriënteren. Sitemaps zijn hierrin heel belangrijk. En indien iemand toch

zou kunnen verdwalen, zorg voor een soort ‘ontsnappingroute’ (bv. link het logo naar de indexpagina).

1.1.5 Creëren van een webtemplate

Een webtemplate of sjabloon kan gezien worden als een soort van basisraamwerk voor een webpagina. Dit

vereenvoudigt het aanmaken van nieuwe pagina’s, het onderhoudn,… Het gebruik van templates draagt bij tot

een blijvende consistentie van de gehele website. Een template is meestal opgebouwd uit de algemene

paginastructuur, samen met de terugkerende grafische elementen van de site. De plaatsen waar de inhoud komt

blijven leeg en worden volgens de behoeften van de webmaster ingevuld.

1.2 HTML

HTML (HyperText Markup Language) is dé taal waarmee de structuur van documenten gespecifieerd wordt. De

taal bestaat uit een samengestelde set van elementen die een documentstructuur en –voorkomen bepalen. Deze

HTML documenten worden door het hypertext transfer protocol ,kortweg HTTP, tot bij de gebruiker gebracht.

Deze gebruikt dan een browser om de HTML documenten te bekijken.

HTML is een toepassing van SGML (Standard Generalized Markup Language) dat de Internationale Standaard

(ISO 8879) is voor tekstopmaak. Het principe steunt op het meer structurele karakter van tekstopmaak dan op het

voorkomen ervan. HTML kan met gelijkwelke text-editor geschreven worden (van ‘plain text’ editors tot

grafische WYSISYG-editors). HTML maakt gebruik van tags (bv. <html>, <h1>, </body>,… ) om de volledige

structuur van de webpagina te beschrijven. De conventie wil dat in de meeste gevallen elke begintag (<tag> ) een

corresponderende eindtag (</tag> ) moet hebben. Sommige tags beschrijven de opmaak van tekst, paragrafen,

hyperlinks. Andere beschrijven dan weer tabelstructuren, beelden, … Elke begintag kent een aantal attributen

waarmee de opmaak nog verder kan verfijnd worden.

Gebruikers moeten op de hoogte zijn van het feit dat HTML een evoluerende taal is, en dat verschillende internet

browsers de HTML pagina’s op een “lichtjes” verschillende wijze kunnen weergeven.

Een verdere uiteenzetting van HTML wordt niet gegeven. Deze topic wordt enkel aangehaald omdat HTML

gebruikt werd tijdens het ontwerp van de nieuwe website. Voor een meer diepgaande uitleg over HTML wordt

verwezen naar bestaande literatuur .[1][2][3][4]

1.3 Cascading Style Sheets

Cascading Style Sheets (CSS) kunnen gezien worden als een soort van HTML opmaak die de webdesigner in

staat stelt een grotere controle uit te oefenen op de typografie en plaatsing van allerlei elementen op de pagina.

Het laat je toe een betere controle te hebben over de gebruikte lettertypen, hun gekende attributen (lettergrootte,

spatiëring van letters, tekstdecoratie,…). Het grote voordeel van CSS is dat slechts een kleine aanpassing in de

style sheet zich voortplant doorheen de gehele opmaak van de site. Indien natuurlijk de style sheet op een

consistente manier gebruikt wordt. Dit voordeel wordt nog duidelijker als de style sheet een apart bestand is,

waarnaar verwezen wordt binnen de head van de HTML broncode (een externe link naar de style sheet).

Page 6: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

4 Hoofdstuk 1 Inleiding

De ontwikkeling van een nieuwe website Formal Methods Europe

Een belangrijke vraag in verband met CSS is de browser compatibiliteit. CSS wordt ondersteund door Internet

Explorer 4+ en Netscape Navigator 4+. In de praktijk daarentegen kunnen er wel vervelende verschillen

optreden tussen verschillende browsers wanneer beslist wordt om met Cascading Style Sheets te werken. Er is

dan bijvoorbeeld wel de mogelijkheid om met behulp van Javascript een verschillende style sheet aan te bieden

afhankelijk van de gebruikte browser.

Het basissjabloon voor CSS ziet er als volgt uit. Ofwel wordt er een stijl gecreëerd voor een specifieke HTML

tag, ofwel wordt er een klasse (classname) gemaakt die toepasbaar is op (bijna) alle HTML-elementen.

tag {eigenschap : waarde ; eigenschap2 : waarde2 ; …}

.classname {eigenschap : waarde ; eigenschap2 : waarde2 ; …}

tag: het HTML element dat zal aangepast worden

classname: de naam van de klasse.

eigenschap: de specifieke eigenschap van het HTML element dat zal worden aangepast

waarde: de waarde van de eigenschap

.classname {eigenschap : waarde ; eigenschap2 : waarde2 ; …}

Er zijn drie manieren waarop CSS wordt gebruikt: ‘inline’, ‘embedded’ en ‘external/linked’ style sheets.

• ‘Inline’

Als je een stijl wilt toepassen op een klein stukje tekst dan kun je ‘inline’ stijlen gebruiken.

Bijvoorbeeld: voor kop 3 wil je een vetgezette tekst:

<h3 style="font-weight: bold">

• ‘Embedded’

Dergelijke style sheets worden binnen de <head></head> tags geplaatst, op elke pagina waar je de stijl

wilt toepassen.

Bijvoorbeeld:

<head>

<style type="text/css">

<!--

tag: {eigenschap: waarde; eigenschap2: waarde2}

-->

</style>

</head>

• ‘External / linked’

Men kan natuurlijk ook de style sheet in een aparte file steken ,vooral grotere style sheets, en gaan

linken aan de HTML pagina waarop de stijl moet uitgevoerd worden. Het linken gebeurt dan als volgt:

Page 7: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

5 Hoofdstuk 1 Inleiding

De ontwikkeling van een nieuwe website Formal Methods Europe

<head>

<link rel="StyleSheet" href="/path/sheet.css" type= "text/css">

</head>

Een verdere uiteenzetting van CSS wordt niet gegeven. Deze topic wordt enkel aangehaald omdat CSS gebruikt

werd tijdens het ontwerp van de nieuwe website. Voor een meer diepgaande uitleg over CSS wordt verwezen

naar bestaande literatuur[6][7]. Tijdens de uitwerking van de gebruikte strategiëen tijdens de ontwikkeling van

de nieuwe website wordt specifiek de gebruikte CSS besproken en geïllustreerd.

1.4 Server-side scripting versus client-side script ing

Wanneer een dynamische HTML pagina geconstrueerd wordt door een script-taal, dan wordt de broncode ofwel

uitgevoerd door de webbrowser van de gebruiker (client-side) of door de server. Er zijn zowel voor- als nadelen

verbonden aan deze twee types scriptingmogelijkheden. Een niet doordachte “mix” van de twee kan dramatische

gevolgen hebben voor de webpagina.

Er zijn veel voordelen verbonden aan server-side scripting. Omdat alle code server-side wordt uitgevoerd blijft

de scriptcode verborgen voor de gebruiker. Bovendien ondersteunt server sided scripting ook toegang tot

bestanden op de lokale machine, dit is de server zelf. Server-side scripting is ook browseronafhankelijk, de

scripts worden immers op de server verwerkt. De instellingen van de gebruiker hebben dus geen invloed op de

uitvoering van het script. Omdat de server enkel HTML documenten terugstuurt naar de gebruiker hoeft men

weinig tot geen rekening houden met de browser van de gebruiker.

Een groot nadeel van server-sided scripting is dat de server waardevolle systeem-middelen moet gebruiken om

elke pagina te ontleden en verzenden. Als de website echter veel bezoekers heeft kan dat de server belasten.

Bovendien ontstaat er ook een aanzienlijke datastroom. Elke pagina moet door de server verwerkt en verstuurd

worden. Deze datastroom kan sterke vertragingen veroorzaken.

Client-sided scripting kan zeer handig zijn. Het grote voordeel is dat elke webbrowser zijn eigen systeem-

middelen gebruikt om de code uit te voeren, de belasting rust dus niet meer bij de server.

De nadelen zijn dat de gebruiker niet kan verhinderd worden om je (waardevolle?) broncode te zien en dat je niet

in staat bent toegang te krijgen tot lokale bestanden, directories of databanken. Het systeem van de bezoeker kan

ook extra belast worden door de verwerking van de gegevens. Als er geen al te complexe berekeningen gebeuren

is dit nadeel echter te verwaarlozen. Het grootste nadeel is comptabiliteit. Het is noodzakelijk het resultaat van

het script te controleren op de verschillende browsertypes en -versies.

Tijdens het ontwerp van een website kun je gebruik maken van zowel de sterktes als de zwakheden van beide

scripting systemen om zo een optimaal resultaat te krijgen.

In de twee volgende paragrafen worden de server-sided en client-sided scripting talen besproken die zullen

gebruikt worden tijdens het ontwerp van de nieuwe website.

1.5 Java Server Pages (server-side scripting)

Java Server Pages of JSP is een open standaard voor het gebruik van Java binnen HTML documenten.. Wanneer

een JSP document, te herkennen aan de extentie jsp, wordt opgevraagd zal de server dit document eerst

Page 8: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

6 Hoofdstuk 1 Inleiding

De ontwikkeling van een nieuwe website Formal Methods Europe

compileren tot een servlet. Het servlet wordt vervolgens in de cache van de server opgeslagen. Hierdoor moet het

JSP document niet steeds opnieuw gecompileerd worden als er een nieuwe aanvraag binnenkomt.

De transformatie van een JSP document naar een generiek Java servlet is de grote troef van JSP. Hierdoor krijgt

elk JSP document alle mogelijkheden die Java biedt. Een standaard JSP document kan sessieobjecten, cookies,

databanken, … verwerken. De functionaliteit kan nog verder worden uitgebreid door Java packages in te laden.

De belangrijkste packages worden standaard meegeleverd bij Java, bijvoorbeeld java.math of java.SQL.

Bovendien is het mogelijk om zelf objecten, functies en packages te ontwikkelen.

De implementatie van Java in JSP documenten gebeurt hoofdzakelijk via scriptlets. Dit zijn kleine blokjes Java

code tussen speciale tags. Als het JSP document veel code bevat is het aangewezen om over te stappen naar

JavaBeans of een servlet. Hiervoor is echter een grondige kennis over Java nodig. Maar met deze aanpak kan de

code overzichtelijker en beter onderhoudbaar blijven.

Tag Gebruik

<% ... %> Invoegen van Java code in het JSP document

<%! ... %>

Invoegen van functies en initialiseren van

variabelen.

Het bereik van de funtie is beperkt tot de huidige pagina.

<%= ... %> De verkorte notatie om een variabele af te

drukken.

Tabel 1: Java in een JSP document

Een verdere uiteenzetting van JSP wordt niet gegeven. Deze topic wordt enkel aangehaald omdat JSP gebruikt

werd tijdens het ontwerp van de nieuwe website. Voor een diepgaande uitleg over JSP wordt verwezen naar

bestaande literatuur (boek / electronisch). Tijdens de uitwerking van de gebruikte strategiëen wordt de specifieke

JSP-broncode besproken en geïllustreerd.

1.6 Javascript (cl ient-side script ing)

Een scripttaal maakt het mogelijk om een statische website om te vormen naar een dynamisch geheel. Zuivere

HTML documenten zijn per definitie statisch, HTML is immers een markup language. Er is dus weinig of geen

interactie mogelijk tussen het document, een ander document, reeds gekende informatie of de gebruiker. Een

HTML document aangevuld met een script kan deze interactie echter gemakkelijk aan.

Hoewel een scripttaal op een programmeertaal lijkt is het geen volwaardige programmeertaal. Een scripttaal is

meestal een vereenvoudigde versie van een reeds bestaande programmeertaal. Het meest opvallende voorbeeld

hiervan is de initialisatie van variabelen. Bij een programmeertaal moet er steeds een datatype opgegeven

worden, bijvoorbeeld int of float. Een scripttaal werkt echter met ‘loosely based variables’. Men is niet verplicht

een datatype aan te geven of zelfs te initialiseren. Een ander vereenvoudiging is de beperking van

mogelijkheden. Uit veiligheidsoverwegingen zijn bepaalde ongewenste of gevaarlijke acties niet mogelijk.

Hierdoor is het niet mogelijk dat een zuiver script schade veroorzaakt aan het systeem van de bezoeker.

Javascript is een platform-onafhankelijke, ”event-driven”, programmeertaal die ontwikkeld is door Netscape

Communications Corp. en Sun Microsystems. Javascript is verwant aan Suns’ object geöriënteerde

programmeer-taal Java. Hoewel ze goed samenwerken zijn er technisch, functioneel en qua gedrag sterke

Page 9: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

7 Hoofdstuk 1 Inleiding

De ontwikkeling van een nieuwe website Formal Methods Europe

verschillen. Javascript is nuttig om interactiviteit toe te voegen aan websites. De scripts kunnen ingebed worden

in de HTML-bestanden, simpelweg door de scriptcode te omsluiten door een <script></script> tag.

Javascript is een “interpreted language”. Dit betekent dat de scripts uitgevoerd worden zonder voorafgaande

compilatie (i.t.t. JSP), d.w.z. zonder omzetting van de scripttekst in syteemafhankelijke machinecode. De

browser van de gebruiker interpreteert (analyseert ) het script en voert het meteen uit.

Javascript wordt ondersteund door de volgende browsers.

• Netscape Navigator (te beginnen met versie 2.0)

• Microsoft Internet Explorer (te beginnen met versie 3.0)

• Elke andere browser die een JavaScript interpreter heeft geïmplementeerd (bv. Opera)

In de praktijk is Javascript een terechte universele extensie geworden van HTML dat de gebruiker, door middel

van “event handling” en client-side uitvoering van code, van interactiviteit voorziet.

Een verdere uiteenzetting van JavaScript (syntax / gebruik) wordt niet gegeven. Deze topic werd hier enkel

aangehaald omdat JavaScript gebruikt werd tijdens het ontwerp van de nieuwe website. Voor een diepgaande

uitleg over JavaScript wordt verwezen naar bestaande literatuur.[8][9] Tijdens de uitwerking van de gebruikte

strategiëen wordt de specifieke JavaScript-broncode besproken en geïllustreerd.

1.7 MySQL

MySQL is het meest populaire “open source” SQL databankbeheersysteem dat er is. “Open source” software

betekent niet enkel dat het voor iedereen mogelijk is het te gebruiken en te wijzigen. Het is bovendien gratis te

downloaden en installeren.

Een databank is een gestructureerde verzameling van informatie. Dit kan gaan van een simpele boodschappen-

lijst over een CD verzameling tot een grote ingewikkelde bedrijfsdatabank. Een databankbeheersysteem (zoals

mySQL server) maakt het mogelijk data toe te voegen, te verwerken en te bekijken. Deze beheersystemen spelen

een zeer belangrijke centrale rol als “stand-alone utility” of als onderdeel van andere toepassingen.

MySQL is een relationeel databankbeheersysteem en bevat de data in aparte tabellen. Dit draagt bij tot snelheid

en flexibiliteit. De tabellen kunnen gelinked zijn door vooraf gedefiniëerde relaties. Dit maakt het mogelijk om

op verzoek data te combineren vanuit verschillendende tabellen.

MySQL is een krachtige client/server implementatie die bestaat uit een server daemon mysqld en veel

verschillende client programma's en libraries.

SQL staat voor “Structured Query Language”, de algemeen aanvaarde taal om gegevens in databanken te

bewerken en op te vragen.

Een verdere uiteenzetting van (my)SQL wordt niet gegeven. Deze topic werd hier enkel aangehaald omdat

(my)SQL gebruikt werd tijdens het ontwerp van de nieuwe website. Voor een diepgaande uitleg over (my)SQL

wordt verwezen naar bestaande literatuur.[12][13] Tijdens de uitwerking van de gebruikte strategiëen worden

specifieke (my)SQL statements besproken en geïllustreerd.

Page 10: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

8 Hoofdstuk 2 Doelstelling

De ontwikkeling van een nieuwe website Formal Methods Europe

H o o f d s t u k 2 D O E L S T E L L I N G

Formal Methods Europe (FME) is een organisatie met als missie de promotie en het ondersteunen van industrieel

gebruik van formele methoden voor de ontwikkeling van computersystemen. De huidige website van deze

organisatie voldoet echter niet meer aan de hedendaagse normen inzake website-ontwerp.

Binnen dit eindwerk is het de bedoeling de bestaande website van FME (http://www.fmeurope.org) te

vervangen door een nieuwe, te ontwikkelen website. Hierbij zal aandacht besteed worden aan zowel de vorm en

de inhoud als de technische aspecten van een dergelijke website. De volgende onderdelen moeten gerealiseerd

worden:

• algemene informatie over FME

• informatie i.v.m. symposia

• bekendmaken van bijeenkomsten

• bekendmaken van vacatures

• administratieve module

Page 11: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

9 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

H o o f d s t u k 3 GE B R U I K T E S T R A T E G I Ë E N E N T E C H N O L O G I Ë E N

3.1 Studie oude website Formal Methods Europe

De oude, te vervangen website van Formal Methods Europe (www.fmeurope.org) bevindt zich op een UNIX

webserver aan de Technische Universiteit Delft in Nederland. Deze server wordt beheerd door West Consulting

B.V. (www.west.nl).

De oude website is opgebouwd uit frames en ziet er schematisch als volgt uit:

FME logo

fmelogo.htm

Tekst

fme.htm

Nieuws

news.htm

Menu-systeem

fmemenu.htm

scrollbars

Tabel 2 Opbouw oude website

De corresponderende frameset HTML-code is als volgt opgebouwd:

<frameset framespacing="0" border="false" framebord er="0" cols="193,*,17%">

<frameset rows="110,*">

<frame SRC=" fmelogo.htm " NAME="fmelogo" MARGINHEIGHT="5" MARGINWIDTH="1"

SCROLLING="no" style="background-color: rgb(25 5,255,255)">

<frame SRC=" fmemenu.html " NAME="Index" MARGINHEIGHT="5" MARGINWIDTH="1"

scrolling="auto">

</frameset>

<frame SRC=" fme.htm " NAME="fmemain" scrolling="auto" marginwidth="6" m arginheight="16">

<frame name="news" src=" news.htm " scrolling="auto" marginwidth="6" marginheight="16 ">

<noframes>

<body>

</body>

</noframes>

</frameset>

Enkel het frame fme.htm en news.htm ondersteunen scrollbars en kunnen zich dus aanpassen aan verschillende

schermresoluties.

Page 12: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

10 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

Verder zal kort de lay-out van de oude website besproken worden.

Een screenshot van de indexpagina (zie figuur 1) van de oude website is te zien in onderstaande figuur (het

menu-item “Formal methods” is uitgeschoven). De verschillende onderdelen zoals in bovenstaand schema

getoond worden zijn hier duidelijk te zien.

Figuur 1: screenshot indexpagina oude website FME

3.1.1 Menu-systeem

De Javascriptcode van het menusysteem wordt niet besproken. Het menusysteem is dynamisch maar niet

gemakkelijk aanpasbaar, het nieuwe menusysteem moet dat wel zijn.

3.1.2 Lay-out

Naast de frame-gebaseerde opbouw van de oude site valt een sobere opmaakstijl op. Er wordt gebruik gemaakt

van een Cascading Style Sheet (default.css), het basislettertype (Verdana) zorgt ervoor dat alles goed leesbaar is.

Er is weliswaar inconsistentie in de opbouw en het gebruik van tabellen. Sommige belangrijke items zoals

“Organisations” en “FME Symposia” worden niet in tabelvorm gezet wat leidt tot een onoverzichtelijk geheel.

Verder zijn twee subitems van het “Formal methods”-hoofdmenu item zeer lange webpagina’s waar de bezoeker

zeer vlug in kan verdwalen. Dit zijn maar enkele belangrijke opmerkingen waarmee rekening is gehouden tijdens

Page 13: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

11 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

het ontwerp van de lay-out van de nieuwe site. Samen met belangrijke webstatistische gegevens die hierop

volgend besproken worden, is het nieuwe ontwerp ontwikkeld.

3.2 Webstatistieken Formal Methods Europe

Hoeveel mensen bezoeken de website? Welke pagina's bekijken ze het meest? Waar komen ze vandaan? Welk

type browser gebruiken ze?

Nedstat (www.nedstat.com) geeft op deze - en op heel veel andere vragen - duidelijke en betrouwbare

antwoorden. De website Formal Methods Europe maakt gebruik van het freeware product Nedstat Basic 3.0 als

bezoekers-teller. Daarnaast worden verscheidene meetgegevens bijgehouden over de site: pageviews per uur, per

dag, per week en per maand, herkomst van de bezoekers (land, stad, provider, bedrijf), overzicht van de laatste

tien bezoekers, voorspelling van het aantal bezoekers voor vandaag, …

Het is op basis van deze meetgegevens dat wij ons een beeld hebben proberen te vormen van de doorsnee

bezoeker. Aan de hand van dit beeld hebben we dan de volledig nieuwe webinterface ontworpen.

In de rest van deze paragraaf zullen we de relevante statistische gegevens bespreken die van doorslaggevend

belang zijn geweest in het verdere verloop van onze scriptie.

De dagelijkse meetgegevens voor de website Formal Methods Europe (www.fmeurope.org) zijn terug te vinden

op de volgende URL: http://v1.nedstatbasic.net/s?tab=1&link=1&id=988229.

Er zijn 5 grote onderdelen:

• Hier en nu:

Recentste gegevens over bezoekersaantal, laatste 10 bezoekers, pageviews per dag, land van herkomst.

• Wanneer:

Gegevens over aantal pageviews per week / maand / jaar, per weekdag, per uur.

• Waarvandaan:

Gegevens over continent / land van herkomst, steden, Internet Service Providers.

• Hoe:

Gegevens over gebruikte zoekmachine, zoekwoorden, via welke site, via welke link.

• Waarmee:

Gegevens over gebruikte browsers, besturingssysteem, geïnstalleerde plug-ins, schermresoluties.

De belangrijkste meetgegevens voor ons waren deze uit de onderdelen Hoe en Waarmee. Daarnaast was het wel

interessant om te weten dat de site een gemiddeld bezoekersaantal heeft van 30-45 bezoekers per dag, dat de site

het meest bezocht wordt rond 15.00u en het minst om 6.00u. en dat de meeste pageviews vanuit het Verenigd

Koninkrijk komen.

Om onze keuzes tijdens het ontwerp te staven hebben we gebruik gemaakt van een steekproef uit de

meetgegevens. We hebben gebruik gemaakt van de meetgegevens van 25 april 2002. De gegevens die wij

gebruikten zijn toch reeds gemiddelden die van dag tot dag practisch niet meer veranderen.

Een eerste belangrijke vraag tijdens het ontwerp van de nieuwe webinterface was welke browsers het meest

gebruikt werden door de bezoekers.

Page 14: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

12 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

Uit de gegevens (zie figuur 2) blijkt dat de Micorsoft Internet Explorer Browser 5.x / 6.x samen door 77.1% van

de bezoekers gebruikt worden. Netscape Navigator 3.x / 4.x / 6.x zijn samen goed voor bijna 20%, terwijl de

Opera 6.x browser door 3% van de bezoekers gebruikt wordt.

De ontwikkeling van de nieuwe site werd hoofdzakelijk gericht op de Internet Explorer en Netscape gebruikers.

Browseroptimalisatie werd dan hoofdzakelijk gericht op Internet Explorer 5.x / 6.x. en Netscape 4.x / +.

Een tweede belangrijk punt was de gebruikte schermresoluties. Uit de meetgegevens (zie figuur 3) blijkt dat

ruim 50% van de bezoekers een schermresolutie heeft van 1024 pixels x 768 pixels. Een goed kwart van de

bezoekers werkt op 800 x 600. Ongeveer 17% heeft een resolutie groter of gelijk aan 1280 x 1024. We hebben

de site zo geconstrueerd dat alles optimaal zichtbaar was (m.a.w. zonder horizontale schuifbalk) voor resoluties

van 800 x 600 en hoger.

Browsers

Internet Explorer 5.x 40.0 %

Internet Explorer 6.x 37.1 %

Netscape 6.x 8.6 %

Netscape 4.x 8.6 %

Opera 6.x 2.9 %

Netscape 3.x 2.9 %

Totaal 100.0 %

Figuur 2: procentueel gebruik per browser-type

Schermresoluties

1024 x 768 51.4 %

800 x 600 25.7 %

>= 1280 x 1024 17.1 %

640 x 480 2.9 %

Onbekend 2.9 %

Totaal 100.0 %

Page 15: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

13 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

Figuur 3: procentueel gebruik schermresolutie

3.3 Opbouw nieuwe website Formal Methods Europe

Op basis van bovenstaande studie en meetgegevens hebben we een volledig nieuwe webinterface ontworpen. De

opbouw en inkleding ervan bestond uit een vijftal grote fasen:

• Fase 1: ontwikkeling HTML constructie

• Fase 2: optimalisatie en uniformisering opmaak via Cascading Style Sheets

• Fase 3: creatie van mySQL databank

• Fase 4: creatie jsp pagina’s voor de bevraging van mySQL databank

• Fase 5: afwerking website met Flash intro

3.3.1 Fase 1: ontwikkeling HTML constructie

Het nieuwe raamwerk van de webinterface is volledig opgebouwd aan de hand van de markuptaal HTML. Alle

code is geschreven met behulp van het software product Macromedia Dreamweaver 4.0. Onderstaand schema

toont de hoofdelementen en de plaatsing ervan. Op basis van deze constructie werd trouwens een template ont-

wikkeld zodanig dat de webmasters in de toekomst gemakkelijk nieuwe pagina’s kunnen invoegen. Hieronder

zal elk element in detail besproken worden.

FME banner + FME logo

menu-systeem

‘divider’

?

Tekst

Submenu

‘divider’

copyright

Tabel 3 Opbouw nieuwe website

De volledige webinterface is ontworpen aan de hand van tabellen en geneste tabellen. De keuze van een

tabellaire opbouw over een frame-opbouw kan als volgt verklaard worden. Eén manier een pagina in te delen is

het gebruik van één tabel die verdeeld is in één of meerdere kolommen (en/of rijen). Daar bonvenop kun je de

tabellaire structuur ook gebruiken binnen een pagina om specifieke informatie te organiseren. Dit kan gewone

Page 16: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

14 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

data zijn maar het is ook nuttig om bijvoorbeeld tekeningen en tekst te aligneren. Op het gebied van grafische

opsmuk van een site is het gebruik van tabellen onklopbaar: je kan opgesplitste tekeningen terug aan elkaar

“lijmen” – zonder een pixel te verliezen tussen de gesplitste delen. Dit is niet mogelijk met en tussen frames.

Het gebruik van frames daarentegen is aan te raden voor eenvoudige documentatieve sites. Alhoewel, de browser

van Netscape voegt één pixel toe aan de buitenkant van elk frame en het frame verandert (lichtjes) zijn eigen

breedte wanneer het het browser scherm “geresized” wordt tot volledige schermgrootte. Hetgeen met frames kan

gemaakt worden is bijna altijd te maken met tabellen.

Het gebruik van frames heeft verschillende nadelen. Eén van de meest belangrijke is dat zij de lay-out van een

site kan wijzigen; de pagina die je aan het bekijken bent wordt niet correct weergegeven in de (horizontale)

schuifbalk van de browser. Verder worden frames niet ondersteund door sommige oudere, en nog steeds

gebruikte browsers. Daarom moet men steeds een “no-frames” versie van de website behouden . Waarom dubbel

werk doen! Een laatste opmerking is dat zelfs met de moderne browsers, frames er afschuwelijk uitzien als het

browserscherm niet is ingesteld op de correcte grootte.

Een ander argument dat leidde tot de keuze van tabellaire opbouw was het gedrag van zoekrobots. Zoekrobots of

“search engines” indexeren een volledige site. Dus ook de enkelvoudige pagina’s die eigenlijk deel uitmaken van

een frames lay-out. Het is dan mogelijk dat mensen een willekeurige pagina terugvinden in het zoekresultaat in

plaats van de homepagina met de frameset.

Het HTML raamwerk van onze webinterface bestaat uit drie grote onderdelen. Het eerste onderdeel bevat de

banner, het logo en het menusysteem en zit vervat in een eerste tabelstructuur. Het tweede onderdeel bevat dan

de eigenlijke tekst en het submenu-systeem. Samen met het derde onderdeel (de copyright balk onderaan) zitten

deze twee onderdelen in een tweede tabelstructuur die nauw aansluit met de eerste.

Een screenshot van een pagina (zie figuur 4) van de nieuwe website is te zien in onderstaande figuur.

Page 17: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

15 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

Figuur 4: screenshot pagina nieuwe website FME (formal.htm)

Hier volgt nu de bespreking van de verschillende onderdelen van de HTML constructie van de nieuwe

webinterface:

3.3.1.1 FME banner

De hoofdbanner van de nieuwe website is ontworpen met het softwarepakket Adobe Photoshop 6.0. De

afmetingen van de figuur zijn: 500 x 75 pixels. De figuur bestaat uit drie lagen. De eerste laag is de

achterliggende gradiëntlaag (van links naar rechts) met een “fading” gradiënt van de kleur donkerblauw (HEX

#003366) naar wit (HEX #FFFFFF). De laag daarboven bestaat uit willekeurig gekozen figuren en formules die

te maken hebben met het onderwerp ”formele methoden”. Deze formules hebben geen betekenis in hun

geplaatste context en zijn met opzet minder goed leesbaar gemaakt. Zij moeten enkel het karakter van de site

aanduiden. De bezoeker zal direct een verband kunnen leggen tussen wat gezien wordt in de banner en over wat

de site zal gaan, tenminste als de bezoeker vertrouwd is met het onderozeksdomein. De bovenste laag bestaat uit

de tekst “Formal Methods Europe”, gemaakt in het lettertype “Verdana”, 35 pt groot, met als effecten

“dropshadow” (zwart) en “stroke” (zwarte omlijning letters). Het woord “Europe” is met opzet rood gemaakt om

de nadruk te kunnen leggen op het Europees gericht karakter van de organisatie.

3.3.1.2 FME logo

Page 18: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

16 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

Een nieuw FME logo is eveneens ontworpen in Adobe Photoshop 6.0. De figuur is 150 x 75 pixels groot. Er is

superpositie van twee lagen: de eerste laag bevat de Europese sterren die wat gekanteld zijn om perspectief te

geven en om ervoor te zorgen dat de tweede laag, bestaande uit de afkorting van de organisatie, als het ware

doorheen de Europese sterren zit.

3.3.1.3 Menu-systeem

Het dynamisch menu is een freeware Javascript gebaseerd systeem en bestaat uit twee bronbestanden (js files).

Het ene beschrijft de werking en opbouw van het menu-systeem (mmenu.js), het andere de inhoud en lay-out

(newmenu_array.js). Een gedetailleerde uitleg over het menu volgt later. De HTML broncode van de nieuwe

webpagina’s bevat enkel de relatieve link/referentie naar de plaats waar de Javascript files zich bevinden op de

webserver. De verwijzing staat binnen de head-tag van de HTML code en ziet er als volgt uit:

<SCRIPT type=text/javascript language=JavaScript sr c=" newmenu_array.js "></SCRIPT>

<SCRIPT type=text/javascript language=JavaScript sr c=" mmenu.js "></SCRIPT>

3.3.1.4 Divider: decoratieve scheiding menu-tekst

De scheidende figuur tussen het menu en de eigenlijke tekst is ontworpen met het softwarepakket Adobe

Photoshop 6.0. De figuur is 400 x 30 pixels groot en bevat een tweelagige structuur. De onderste laag is een

gradiëntlaag (van links naar rechts) met een “fading” gradiënt van de kleur lichtblauw (HEX # 7F8EB0) naar wit

(HEX #FFFFFF). De bovenste laag is een effectlaag op de onderste en stelt het “interlace” (kleur wit) effect

voor. Hierdoor krijgt men een soort van horizontaal in elkaar gevlochten effect. De bedoeling van deze figuur

(‘divider’) is een aangename overgang verzorgen tussen de 3 grote onderdelen van het HTML raamwerk.

3.3.1.5 Tekst

Dit onderdeel bevat de eigenlijke informatie/inhoud van de website (tekst, tabellaire info) en toont alle

informatie in verband met een specifiek item.

3.3.1.6 Submenu

Het submenusysteem toont de titel van het onderdeel waar de bezoeker op terecht is gekomen en toont de

eventuele links uit het Javascript hoofdmenu-systeem die aan dit onderdeel zijn gekoppeld. Dit is de enige

redundatie die we hebben ingebouwd tijdens de ontwikkeling van de webinterface. Het zorgt voor een snelle en

gebruiksvriendelijke overgang tussen verschillende onderdelen van een specifiek hoofditem. Dit omdat het vrije

menu standaard enkel de hoofditems toont en niet de onderdelen ervan. Deze zijn enkel zichtbaar door interactie

van de bezoeker met het menu-systeem (zie figuur 4). Het submenu is ook dynamisch opgebouwd aan de hand

van Javascript. Dit zorgt ervoor dat telkens het hoofdmenu aangevuld wordt, het submenu mee verandert. Een

gedetailleerde bespreking van dit script volgt later.

De HTML broncode van de nieuwe webpagina’s bevat enkel de relatieve link/referentie naar de plaats waar de

Javascript file zich bevinden op de webserver. De verwijzing staat binnen de head van de HTML code en ziet er

als volgt uit:

Page 19: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

17 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

<SCRIPT type=text/javascript language=JavaScript sr c=" printSubMenu.js "></SCRIPT>

3.3.1.7 Divider: decoratieve scheiding tekst-copyright

Dit is dezelfde figuur als de “decoratieve scheiding menu-tekst” en heeft dezelfde bedoeling.

3.3.1.8 Copyright

Deze copyright balk onderaan de HTML constructie sluit deze als het ware af. Het belang van deze balk is dat

het tevens de authenticiteit en originaliteit van de website bepaalt.

3.3.2 Fase 2: optimalisatie en uniformisering opmaak via Cascading Style Sheets

Na het ontwikkelen van een overkoepelende HTML constructie werd de invulling van de inhoud van de pagina’s

behandeld. Daarbij moet onderscheid gemaakt worden tussen de statische pagina’s, die geen informatie bevatten

die regelmatige gewijzigd wordt, en de dynamische pagina’s, die dat wel hebben. De statische pagina’s (.htm)

bestaan uit pure HTML code, terwijl de dynamische (.jsp) uit een combinatie van HTML en JSP bestaan. Deze

laatste pagina’s werken dan ook samen met een mySQL databank om specifieke informatie te verwerken.

Deze twee types pagina’s werden op het gebied van lay-out geoptimaliseerd door gebruik te maken van een

Cascading Style Sheet (CSS).

Er werden verschillende stijlen gecreëerd die in een style sheet werden geplaatst (fme.css). In de head van de

HTML broncode vind je dan ook de referentie terug naar die externe stylesheet:

<link rel=StyleSheet href="fme.css" type="text/css" media=screen>

Een externe style sheet kan gelinkt worden aan een HTML document door middel van een <link> element. De

<link> tag wordt dus in de head van het document geplaatst. Het optionele type -attribuut wordt gebruikt om een

mediumtype (text/css voor een Cascading Style Sheet) te specifiëren zodanig dat browsers bepaalde style sheet

types die zij niet ondersteunen, kunnen negeren. Een ander optioneel attribuut is het media -attribuut, dat het

medium specifiëert waarop de style sheets moeten toegepast worden. Een mogelijk waarde is “screen” en staat

voor de presentatie op niet-gepagineerde computerschermen. Er werd trouwens gekozen voor dit media-type

omdat Netscape Navigator 4.x elke gelinkte of geïntegreerde style sheet met een ander mediatype dan “screen”

gewoonweg negeert. Het rel -attribuut wordt gebruikt om de relatie tussen het gelinkte bestand ,de style sheet, en

het HTML document te definiëren. De waarde StyleSheet specifieert een persistente stijl en wordt altijd

toegepast wanneer de style sheet geactiveerd is.

De door ons gebruikte stijlen zijn als klassen geconstrueerd, zodat ze toepasbaar zijn op verschillende HTML

opmaaktags en niet alleen gekoppeld zijn aan specifieke tags.

De style sheet is gemaakt met de style sheet editor TopStyle Lite 2.0, waarin de stijlen gecreëerd konden worden

aan de hand van een menu waarin alle stijlattributen geselecteerd konden worden samen met hun waarden.

Hieronder vind je de style sheet met alle stijlklassen die gebruikt zijn doorheen de nieuwe website.

a:link{color:#006699; text-decoration:none} a:active{color:#006699; text-decoration:none} a:visited{color:#006699; text-decoration:none}

Instelling hyperlinkkleuren

Page 20: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

18 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

body { scrollbar-base-color: #CAD3E7; scrollbar-arrow-color: #000000; background-color: White;

}

.title { font-family: Verdana, Geneva, Arial, Helvetica, san s-serif;

font-weight: normal; font-size: 10pt; color: #003366; letter-spacing: 0.05em; } .titleright {

font-family: Verdana, Geneva, Arial, Helvetica, san s-serif; font-weight: bold; font-size: 10pt; color: #003366; letter-spacing: 0.05em }

.plain { font-family: Verdana, Geneva, Arial, Helvetica, san s-serif;

font-weight: normal; font-size: 8pt; text-align: justify; } .plainsingle {

font-family: Verdana, Geneva, Arial, Helvetica, san s-serif; font-weight: normal; font-size: 8pt; text-align:left; }

.tablehead { font-family: Verdana, Geneva, Arial, Helvetica, san s-serif; font-weight: bold; font-size: 8pt; text-align: center; color: #FFFFFF; background-color: #003366;

} .tablesingle {

font-family: Verdana, Geneva, Arial, Helvetica, san s-serif; font-weight: normal; font-size: 8pt; text-align: left;

}

.subtext { font-family: Verdana, Geneva, Arial, Helvetica, san s-serif; font-weight: normal; font-size: 8pt; color: #808080; text-align: center;

} .sublink {

font-family: Verdana, Geneva, Arial, Helvetica, san s-serif; font-weight: normal; font-size: 8pt; text-align: center;

}

. evenRow { font-family: Verdana, Geneva, Arial, Helvetica, sa ns-serif; font-weight: normal; font-size: 8pt; text-align: left; background-color: #FFFFFF; } . oddRow{ font-family: Verdana, Geneva, Arial, Helvetica, sa ns-serif; font-weight: normal; font-size: 8pt; text-align: left; background-color: #F6F6F6;

Zet achtergrondkleur wit + Verandert kleur vertikale scroll (enkel IE browser)

Twee titelstijlen

Twee platte tekst stijlen: - volledig uitgelijnd

(lange tekst) - links uitgelijnd

(enkele regels)

Twee tabelstijlen: - tabelhoofd - tabelelementen

Twee sub stijlen: - tekst onder figuur,… - link onder figuur,…

Twee tabelrij stijlen: - even rij - oneven rij

Page 21: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

19 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

}

. button { background-color: #F6F6F6; font-family : Verdana, Geneva, Arial, Helvetica, s ans-serif; font-weight: bold; font-size: 10pt; }

.copyright { font-family: Verdana, Geneva, Arial, Helvetica, san s-serif; font-weight: normal; font-size: 8pt; color: #FFFFFF;

}

Tabel 4 Gebruikt CSS bestand

3.3.3 Fase 3: opzetten van mySQL databank

Nadat de HTML constructie samen met de opmaak via CSS voltooid was, zijn we begonnen met de creatie van

een mySQL databank. De keuze voor mySQL is vooral gebaseerd op het feit dat de uiteindelijke website zal

draaien op een UNIX webserver, en dat daarbij de keuze voor een algemeen en performant platform-

onafhankelijk database(management)systeem voor de hand lag.

Door de beperkte ervaring met mySQL, hebben we initieel de databank ontworpen met Microsoft Access 2000.

Eerst werd bepaald welke relevante informatie in de databank zou terechtkomen. We hebben ons gebaseerd op

de (quasi) tabellaire informatie van de originele website. Onderdelen zoals FME meetings, symposia, nieuws,

gebeurtenissen (events), organisaties (commerciële bedrijven, non-profit organisaties en universiteiten) en als

laatste vacante posities werden op consistente wijze in de databank gestopt (zie tabeldefinitie hieronder).

Via een freeware Microsoft Access add-in tool, MyAccess2000, was het mogelijk de MS Access 2000 databank

om te zetten naar een mySQL databank.

Uiteindelijk zijn er 7 mySQL databasetabellen gegenereerd in de mySQL database “fme”.

Database naam: fme

Database tabellen: (algemene definiëring velden – naam, datatype[lengte], toegelaten null-waarden)

access

Naam id username password level

Type int[11] char[255] char[255] int[11]

Null no no no yes

meeting

Naam Id begindate enddate meeting meetingurl material materialurl photosurl place

Type int[11] date date char[255] char[255] char[255] char[255] char[255] char[255]

Null No yes yes yes yes yes yes yes yes

symposia

Naam id date symposium sympurl place proceedings procurl photosurl

Type int[11] date char[255] char[255] char[255] char[255] char[255] char[255]

Null no yes yes yes yes yes yes yes

Copyright stijl

Query knop stijl

Page 22: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

20 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

news

Naam id date news url

Type int[11] date char[255] char[255]

Null no yes yes yes

eve nts

Naam id begindate enddate event url comment place region

Type int[11] date date char[255] char[255] char[255] char[255] char[255]

Null no yes yes yes yes yes yes yes

organisations

Naam id name url comment place region type

Type int[11] char[255] char[255] char[255] char[255] cha r[255] char[255]

Null no yes yes yes yes yes yes

positions

Naam id type place info url deadline dateplaced region

Type int[11] char[255] char[255] char[255] char[255] date date char[255]

Null no yes yes yes yes yes yes yes

Tabel 5 Opbouw van de databank

Het id-veld staat ingesteld als auto-increment, wat wil zeggen dat telkens een nieuw record aan een tabel wordt

toegevoegd de waarde van het id-veld automatisch met 1 wordt verhoogd.

De tabellen die het meest zullen moeten upgedate worden, zijn de events-, news- en positionstabellen.

De lengte van het char-datatype is berperkt tot 255 karakters, wat meer dan genoeg is. Een overvloed aan

informatie in een enkele cel is immers af te raden. Sommige velden zouden het met een minder aantal karakters

kunnen doen, maar om wat uniformiteit in de databank te steken, hebben we er voor gekozen elk char-datatype

te voorzien van 255 karakters.

Het is nu op basis van deze mySQL databank dat via de server-side scripting taal JSP (Java Server Pages) de

databank op zijn inhoud zal worden bevraagd. Op dynamische wijze zal HTML tabelcode gecreëerd worden met

als inhoud de informatie uit de bevraagde databanktabellen.

3.3.4 Fase 4: creatie jsp pagina’s voor de bevraging van mySQL databank

De keuze voor JSP (Java Server Pages) als server-side scripting taal is ook te verklaren door het feit dat de

uiteindelijke website zal draaien op een UNIX webserver en dat het streven naar platformonafhankelijkheid een

“must” is.

Wij hebben enkel gebruik gemaakt van specifieke databank-bevragingscode. De JSP code die gebruikt werd, kan

functioneel onderverdeeld worden in een vijftal fases:

(Onderstaande getoonde code is een sterk veralgemeende code om het principe van databankconnectie en –

bevraging te verduidelijken – verdere verduidelijking van de effectief gebruikte code volgt later bij de

gedetaileerde bespreking van de gebruikte scripts).

<%@ page contentType="text/html"%>

Page 23: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

21 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

<%@ page import="java.sql.*"%>

<%

// Declaration of Connection, Statement and ResultS et variables

// which are going to be used during database con nection and

// data retrieval.

String connectionURL = "jdbc:mysql://localhost:33 06/[databasenaam]";

Connection connection = null;

Statement statement = null;

ResultSet rs = null;

Class.forName("org.gjt.mm.mysql.Driver");

connection = DriverManager.getConnection(connection URL,user,password);

statement = connection.createStatement();

rs = statement.executeQuery(querystring);

while (rs.next()) {

out.println(rs.getString(“veldnaam1”));

out.println(rs.getString(“veldnaam2”));

}

rs.close();

statement.close();

connection.close();

%>

3.3.4.1 Declaratie van lege Connection, Statement en ResultSet variabelen:

<%@ page contentType="text/html" %>

<%@ page import="java.sql.*" %>

→ de inhoud van de JSP pagina is pure tekst in HTML vorm

→ de java.sql.* package wordt geïmporteerd. Alle klassen en interfaces van de JDBC API zijn

gedefinieerd in de java.sql package

String connectionURL = "jdbc:mysql://localhos t:3306/[databanknaam]";

→ connectiestring wordt aangemaakt:

via de localhost (loopback interface: 127.0.0.1) op poort 3306 wordt via de JDBC-driver een connectie

met de plaatselijke mySQL server gecreëerd om de databank met naam databanknaam te kunnen

bevragen.

Connection connection = null;

Statement statement = null;

ResultSet rs = null;

→ Connection object gedeclareerd: dit object stelt de netwerkconnectie met de mySQL database voor.

→ Statement object gedeclareerd: hier wordt een SQL statement object gedefinieerd.

→ ResultSet object gedeclareerd: het resultaat van de SQL statement zal in dit object bewaard worden.

3.3.4.2 Creëren van een connectie met de mySQL server

Page 24: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

22 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

Class.forName("org.gjt.mm.mysql.Driver");

connection = DriverManager.getConnection(connection URL,user,password);

→ Class.forName("org.git.mm.mysql.Driver") vertelt de DriverManager van het Connection object om

de MM.MySQL JDBC driver in te laden. De getConnection()-methode van de klasse DriverManager

wordt gebruikt om databank van connectiviteit te voorzien. Definiëring van de locatie van de databank

via de connectiestring en ingave van de gepaste, toegekende mySQL gebuikersnaam en paswoord

vervolledigen de verbinding.

3.3.4.3 Opstellen van specifieke tabelafhankelijke SQL statements

statement = conne ction.createStatement();

rs = statement.executeQuery(querystring);

→ We maken het Statement object klaar voor gebruik door middel van de createStatement()-methode

van het Connection object. Daarna voorzien we het met een SQL query waarmee we records wensen op

te halen uit een specifieke tabel van de mySQL database. De query wordt in string-vorm geschreven

(vorm: “SELECT * FROM ‘tabelnaam’”). Deze query haalt alle records met al hun velden uit de tabel

met naam ‘tabelnaam’. De stat.executeQuery()-methode geeft een ResultSet object terug waarin de

records steken die met de query zijn opgevraagd.

3.3.4.4 Afhalen van specifieke informatie uit de database

while (rs.next()) {

out.println(rs.getString(“veldnaam1”));

out.println(rs.getString(“veldnaam1”));

}

→ Met een while-loop lopen we doorheen de records die in de ResultSet steken. De ResultSet.next()-

metohde doet twee dingen: ten eerste geeft het een boolean terug (waar/vals) wat aanduidt of er nog

meer records zijn en ten tweede verschuift het de ‘cursor’ één rij verder zodanig dat als we een tweede

keer doorheen de while-lus lopen, we op een nieuwe rij zitten.

Binnen de while-loop gebruiken we de methode ResultSet.getString(“veldnaam”) om per record elk

veld van de tabel ‘tabelnaam’ op te halen in stringvorm.

Page 25: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

23 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

3.3.4.5 Sluiten van de connectie

rs.close();

statement.close();

connection.close();

→ We sluiten alle objecten die we eerder hebben gecreëerd tijdens het opstellen van de connectie. Dit

zijn de ResultSet, Statement en Connection objecten.

In het volgende hoofdstuk zal de meer gedetailleerde jsp-code / mySQL bevragingscode besproken worden, waar

onder andere rekening wordt gehouden met meerdere links per veld, samenvoeging van corresponderende

URL’s,…

3.3.5 Fase 5: afwerking website met Flash intro

Na het ontwerp en implementatie van alle grote onderdelen (HTML raamwerk, CSS, mySQL databank, JSP)

werd de nieuwe website van een geanimeerde intro voorzien. Deze intro is ontwikkeld met het software product

Macromedia Flash 5.

3.4 Gedetail leerde bespreking gebruikte scripts

3.4.1 Menu systeem

We hebben ervoor gekozen de navigatiemiddelen te implementeren met een client-sided scripttaal. De belasting

op het systeem van de bezoeker is minimaal, er worden immers geen zware bewerkingen uitgevoerd. Bovendien

worden de navigatiemiddelen, in dit geval een menu, intensief gebruikt. Een server-sided oplossing zou dus

resulteren in een aanzienlijke datastroom van licht gewijzigde documenten.

Tot slot moesten we nog een scripttaal kiezen. De twee belangrijkste scripttalen zijn VBScript en JavaScript. De

eerste taal, VBScript, is een microsoft product die afgeleid is van programmertaal Visual Basic. De tweede taal,

Javascript, werd ontwikkeld door Netscape. Hoewel de naam suggereert dat er een link is naar Java is dat niet het

geval. Uiteindelijk hebben we gekozen om met Javascript te werken. De belangrijkste redenen hiervoor zijn:

• Eenvoudige en heldere syntax.

• Zeer uitgebreide standaard objecten

• Recursie wordt ondersteund

• Grondige en eenvoudige documentatie beschikbaar

• Mogelijkheid om objecten zelf te definiëren

Het belangrijkste navigatiemiddel in de nieuwe website is het menu systeem. Het zelf ontwikkelen van een menu

systeem voor een bepaald platform is op zich nog goed haalbaar. Het opbouwen van een quasi platform

onafhankelijk systeem daarentegen is technisch gezien een hele opgave. Iets wat trouwens moeilijk haalbaar is

binnen een termijn van zes weken. Daarom hebben we er voor gekozen om een dergelijk systeem van het net te

halen. Uiteindelijk hebben we gekozen voor een script van Andy Woolley, terug te vinden op

Page 26: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

24 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

http://www.dynamicdrive.com. De broncode van het volledige menu systeem is terug te vinden in de appendices

B en C.

Het belangrijkste criterium hierbij was de browsercompatibiliteit en een eenvoudig onderhoud. De technische

elegantie beschouwen we eerder als bijkomstig.

De voordelen van het script zijn:

• een zeer goede compabiliteit. Zowat alle moderne browsers worden ondersteund, gaande van Internet

Explorer tot Konqueror.

• een zeer eenvoudig onderhoud. De opmaak en inhoud zijn bijna volledig gescheiden. De inhoud is terug

te vinden in het bestand en newmenu_array.js, de opmaak in het bestand mmenu.js.

• de mogelijkheid om spin-offs te maken van het script. Een voorbeeld hiervan is de dynamische sitemap

(zie later).

Het gekozen script heeft echter een groot nadeel:

• er wordt niet object georiënteerd geprogrammeerd. Het gevolg hiervan is een wirwar van if-statements

om een onderscheid te maken tussen de verschillende browsers. In deze optiek hebben we ervoor

gekozen enkel de inhoud te bespreken en niet het menu systeem zelf.

Zoals eerder gezegd is de inhoud terug te vinden in het bestand newmenu_array.js. In dit bestand vinden we twee

belangrijke types variabelen terug, de PropertyX rij en de MenuX rij.

3.4.1.1 PropertyX rij

De propertyX rij bevat, zoals de naam al doet vermoeden, de elementaire opmaak van het menu systeem. De X

in de naamgeving duidt op het volgnummer. Het aantal property rijen is in feite onbeperkt; praktisch gezien zijn

ze echter beperkt tot het aantal menu items. Met andere woorden: elk onderdeel van het menu kan een eigen

opmaak hebben.

De opmaak van een property rij is steeds als volgt:

X Eigenschap Inhoud

0 Standaardkleur van het opschrift Hexadecimale kl eurwaarde, #RRGGBB

1 Standaardkleur van de achtergrond Hexadecimale kl eurwaarde, #RRGGBB

2 Kleur van het opschrift bij onMouseOver Hexadecim ale kleurwaarde, #RRGGBB

3 Kleur van de achtergrond bij onMouseOver Hexadeci male kleurwaarde, #RRGGBB

4 Kleur van de rand van een menu item Hexadecimale kleurwaarde, #RRGGBB

5 Grootte van het opschrift Puntgrootte

6 Stijl van het opschrift Italic-Normal- Oblique

Page 27: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

25 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

7 Gewicht van het opschrift Lighter-Bolder-Normal-B old

8 Lettertype van het opschrift Arial-Times New Roma n-…

9 De opvulling (padding) van het menu item Pixel wa arde

10 Afbeelding of er submenu's zijn URL van een afbe elding

11 Randbreedte bij een 3D rand Pixel waarde

12 Voorgrondkleur van de 3D rand Hexadecimale kleur waarde, #RRGGBB

13 Achtergrondkleur van de 3D rand Hexadecimale kle urwaarde, #RRGGBB

Een niet gebruikt veld moet leeg blijven

Tabel 6 Opbouw van een propertyX rij

3.4.1.2 MenuX array

De menuX rij bevat, zoals de naam eveneens doet vermoeden, de inhoud en elementaire opmaak van een menu

item. De eerste 15 waarden, van 0 tot en met 14, bevatten de elementaire opmaak van het menu zelf. De hogere

waarden bevatten de eigenlijke inhoud.

De betekenis van de eerste 15 waarden zijn:

X Eigenschap Inhoud

0 Absolute Y-waarde voor het eerste menu item Pixel waarde

1 Absolute X-waarde voor het eerste menu-item Pixel waarde

2 Breedte van een menu item Pixelwaarde

3 Randbreedte van een menu item Pixelwaarde

4 Uitlijning van het menu zelf Left-Center-Right

5 Opmaak, verwijzing naar propertyX rij propertyX

6 Blijvende zichtbaarheid van het menu 0 of 1

7 Uitlijning van het opschrift Left-Center-Right

8 Filter op het opschrift bij onClick String

9 Schuift het menu mee bij scrolling 0 of 1

10 Richting van het menu (horizontaal of verticaal) 0 of 1

11 Blijft het menu opengeklapt 0 of 1

12 Uitlijning voor de figuur die aangeeft of er

submenu's zijn Left-Center-Right

13 Afbeelding of er submenu's zijn URL van een afbe elding

14 Voorbehouden voor toekomstig gebruik Geen

Een niet gebruikt veld moet leeg blijven

Tabel 7 Opbouw van een menuX rij

Page 28: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

26 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

De verdere inhoud van een menuX rij is afhankelijk van de opbouw van het menu. Hierbij zijn er vier

mogelijkheden:

• mogelijkheid 1: het menu item bevat geen submenu en is aanklikbaar

• mogelijkheid 2: het menu item bevat geen submenu en is niet aanklikbaar

• mogelijkheid 3: het menu item bevat een submenu en is aanklikbaar

• mogelijkheid 4: het menu item bevat een submenu en is niet aanklikbaar

De tweede mogelijkheid is weinig relevant, er gebeurt immers niets als je een dergelijk menu item aanklikt.

Voor elk menu item zijn er vijf elementen voorzien in de menuX rij. De opvulling van deze vijf elementen

verschilt van geval tot geval, zoals hieronder wordt geïllustreerd.

Meestal zijn de waarden in deze elementen meteen duidelijk, met uitzondering van de waarde show-menuX.

Deze waarde wordt gebruikt als een bepaald menu moet getoond worden als submenu. De maker van het menu

systeem heeft ervoor gekozen hier een string waarde in te voeren en niet een variabele menuX.

Tabel 8 Gebruik van een menuX rij

3.4.2 Submenu

Het navigeren gebeurt hoofdzakelijk met het menu of de sitemap. We hebben echter ook nog een bijkomend

(schijnbaar redundant) navigatiemiddel ingebouwd, het submenu (broncode zie appendix A). Op elke pagina

wordt het submenu van het hoofditem opnieuw weergegeven.

De functie printSubMenu() kan op twee verschillende manieren worden opgeroepen. Ofwel wordt er enkel een

string meegegeven, ofwel een string en een getal. De string bevat het opschrift van het item uit het hoofdmenu

Positie Inhoud Positie Inhoud

15+j*5 Opschrift van het menu-item 15+j*5 Opschrift van het menu-item

15+j*5+1 URL van de pagina 15+j*5+1

15+j*5+2 15+j*5+2

15+j*5+3 15+j*5+3

15+j*5+4 15+j*5+4

Mogelijkheid 1

Mogelijkheid 2

Positie Inhoud Positie Inhoud

15+j*5 Opschrift van het menu-item 15+j*5 Opschrift van het menu-item

15+j*5+1 show-menuX 15+j*5+1 show-menuX

15+j*5+2 URL van de pagina 15+j*5+2

15+j*5+3 15+j*5+3

15+j*5+4 15+j*5+4

Mogelijkheid 3

Mogelijkheid 4

Page 29: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

27 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

die we zoeken. Binnen de variabele menu1 zoeken we naar een identiek opschrift. Om het script minder

foutgevoelig te maken passen we de methode toLowerCase( ) toe. Deze methode zorgt ervoor dat er geen

hoofdletters voorkomen in de string. Het verdere verloop van het script is analoog aan de functie showMap().

Het meegegeven getal zorgt ervoor dat er bij elke hyperlink een intern anker Europe en World komt.

Deze functie toont, zoals reeds gezegd, grote gelijkenissen met de functie showMap(). Er is eigenlijk maar één

wezenlijk verschil. De functie printSubMenu() controleert of een link naar de huidige URL wijst. Is dit het geval

dan wordt er geen hyperlink gevormd en wordt een extra figuur geplaatst.

Binnen Javascript kan men de URL via verschillende methodes bereiken. De belangrijkste zijn hierbij

document.url en window.location. Deze laatste is echter ontoegankelijk of "tainted".Dit is een interne beveiliging

binnen Javascrip, de referentie op www.netscape.com zegt hierover:

“Tainting prevents other scripts from passing information that should be secure and

private, such as directory structures or user session history. JavaScript cannot pass tainted

values on to any server without the end user's permission.”

3.4.3 Dynamische sitemap

Een sitemap vormt een essentieel onderdeel van elke website. Ze zorgt er immers voor dat de website op een

transparante wijze wordt afgebeeld. Een sitemap laat een gebruiker dus toe om zich snel te bewegen binnen de

website.

Doorgaans is een sitemap geen dynamische maar statische HTML pagina. Dit heeft een groot nadeel: de sitemap

is ongevoelig voor eventuele wijzigingen binnen de website. Bij elke update van de website moet er

gecontroleerd worden of de sitemap nog steeds actueel is. Vaak leidt dit tot onvolledige sitemaps met

ontbrekende of foutieve links.

Een betere oplossing is een dynamische HTML pagina. De sitemap past zich dan automatisch aan; eventuele

wijzigen beïnvloeden meteen de sitemap. Een dergelijke pagina beperkt niet enkel het onderhoud maar zorgt er

ook voor dat er geen foutieve links worden getoond.

Een dynamische pagina kan op twee manieren worden aangemaakt, server-sided of client-sided. We hebben

ervoor gekozen om client-sided te werken. In het menu systeem is alle nodige informatie reeds aanwezig om de

sitemap dynamisch op te bouwen. Eigenlijk maken we dus een alternatieve afbeelding van het menu systeem.

De broncode van de dynamische sitemap is terug te vinden in het bestand ‘showMap.js’

(broncode: zie appendix B).

3.4.3.1 showMap()

Dit is de belangrijkste functie binnen de dynamische sitemap. Het hoofdmenu, die steeds zichtbaar is, is

opgeslagen in de variabele menu1. Deze variabele wordt doorlopen met een for-lus. Hierbij worden de

hoofditems afgedrukt binnen een lijst, d.m.v. de tags <dl> en <dd>. Als er geen submenu is dan is de variabele

subItem gelijk aan "none", anders wordt de show-menuX waarde uit de variabele menu1 opgehaald.

Op het einde van elke iteratie wordt er nagegaan of subItem verschilt van "none". Is dit het geval dan wordt de

functie createEntry(menu) opgeroepen.

Page 30: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

28 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

3.4.3.1.1 createEntry(menu)

Deze functie drukt de inhoud af van de variabele menu. Hierbij nemen we aan dat er binnen een submenu geen

nieuwe submenu's zijn. Dit zorgt ervoor dat de functie eenvoudig blijft en we geen recursie moeten toepassen.

3.4.3.1.2 selectMenu(showString)

Deze functie zet de meegegeven string showString om naar een variabele. Bij de bespreking van het menu

systeem werd er reeds vermeld dat een submenu wordt aangegeven door een string. Deze string is van de vorm

‘show-menuX’, waarbij de X wordt vervangen door een getal.

De omzetting van string naar variabele gebeurt als volgt. Eerst wordt het deel ‘show-‘ verwijderd met de functie

substr( ). De string is dan ‘menuX’, de naam van de variabele waar naar verwezen wordt. Om deze string om te

zetten naar een variabele gebruiken we de functie eval( ).

showString = showString.substr(showString.length- 5,showString.length-1);

return eval(showString);

3.4.3.1.3 validate(stringURL, v1, v2)

Deze functie controleert of de meegegeven URL al dan niet geldig is. De geldigheidsvoorwaarden zijn de

parameters v1 en v2.

3.4.4 JSP – bevraging mySQL databank

In dit onderdeel zullen de belangrijkste onderdelen van de gebruikte JSP code besproken worden. Soms zal er

wat redundante informatie voorkomen, maar dit zal het geheel dan beter kunnen verduidelijken. Wij hebben JSP

gebruikt als server-side scripting taal om een mySQL databank te bevragen. Het dynamisch karakter van de

nieuwe website komt tot uiting via twee implementaties.

Ten eerste werden JSP-pagina’s gecreëerd die alle velden van een databanktabel opvragen en integreren in een

HTML tabelstructuur (syposia.jsp, meetings.jsp, news.jsp, events.jsp, commercial.jsp, nonprofit.jsp,

universities.jsp, positions.jsp). Tevens wordt een implementatie voor databank-updating besproken.

Ten tweede werd een query-implementatie voorzien op alle bovenvernoemde databanktabellen en tevens geïnte-

greerd in de nieuwe website. De query laat toe te zoeken in de database op alle belangrijke onderdelen (datum,

plaats, streek, …) .

3.4.4.1 Bevraging van de FME-databank

Om toegang te krijgen tot een databank binnen een JSP pagina is het noodzakelijk de correcte packages op te

roepen, dit gebeurt via java.sql. Dit standaard package bevat de nodige application programming interface of

API. Deze API stuurt het ophalen en verwerken van gegevens uit een externe databron. Meer informatie over

deze API kun je online terugvinden op de Sun website (http://java.sun.com) of via JavaDoc.

Een package wordt als volgt opgeroepen binnen een JSP pagina:

<%@ page import="java.sql.*"%>

Eenmaal de package is ingeladen kan men de nodige variabelen/objecten aanmaken. Deze zijn:

Page 31: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

29 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

Naam Object type Doel

connectionURL String Deze string bevat de URL van d e databank.

connection Connection Dit object wordt gebruikt om een

verbinding tot stand te brengen met een

databank.

Dankzij deze verbindin g is het mogelijk

alle SQL opdrachten uit te voeren op de

databank.

stat Statement Dit object wordt gebruikt om een statische

SQL opdracht uit te voeren.

rs ResultSet Dit object bewaart het resultaat van SQL

opdracht op een databank.

Tabel 9 Objecten nodig voor een connectie

De variabelen worden als volgt aangemaakt en gebruikt:

String connectionURL = "jdbc:mysql://localhost:33 06/ fme ";

Connection connection = null;

Statement stat = null;

ResultSet rs = null;

ResultSet rsDate = null; (Enkel indien datums gebruikt worden!)

connection = DriverManager.getConnection(connecti onURL, username, password);

stat = connection.createStatement();

In de voorlaatste regel wordt de verbinding definitief gemaakt met de methode getConnection() van het object

Connection. Deze methode is "overloaded", we gebruiken de versie met drie strings. Dit zijn respectievelijk de

URL van de databank, de gebruikersnaam en het paswoord. In de laatste regel wordt de variabele stat

klaargemaakt om een SQL opdracht te verwerken.

Meer informatie over deze objecten, hun eigenschappen en methodes zijn eveneens terug te vinden op de Sun

website of via JavaDoc.

Het tonen van een databank in HTML-vorm verloopt altijd volgens hetzelfde stramien. Daarom hebben we

ervoor gekozen om enkel de ‘meetings.jsp’ pagina te bespreken, de overige pagina's zijn immers zeer

gelijkaardig. De definiëring van de de databanktabel ‘meeting’ kan hoger terug gevonden worden. Zojuist werd

het initialiseren van de databank connectie besproken, dus gaan we er vanuit dat dit reeds gebeurd is.

De eerste stap is het invullen van de resultsets; dit gebeurt als volgt:

rs = stat.executeQuery("SELECT * FROM meeting");

stat = connection.createStatement();

String query = " SELECT date_format(begindate,'%D % M %Y') as bd,

date_format(enddate,’%D %M %Y') as ed FROM meeting ";

rsDate = stat.executeQuery(query);

Page 32: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

30 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

In de eerste regel wordt de complete inhoud van de tabel ‘meeting’ in de variabele rs geplaatst. De tweede regel

zorgt ervoor dat het object stat opnieuw klaar is om een SQL opdracht te verwerken (namelijk voor het object

rsDate). De derde regel is enigszins complexer. De kolommen ‘begindate’ en ‘enddate’ van de databanktabel

‘meeting’ bevatten datums; de ruwe inhoud is van de vorm YYYY-MM-DD. Om het eindresultaat beter leesbaar

te maken wordt de opmaak gewijzigd binnen de SQL opdracht via een SQL specifiek datumformaat. Het is de

opgemaakte versie die aan de bezoeker zal getoond worden.

Voorbeeld:

Als de ruwe vorm 2002-05-07 is dan wordt de opgemaakte versie 7th may 2002.

Het is mogelijk om hetzelfde resultaat te verkrijgen met een enkele resultset. De java.sql package bevat de

methode getDate( ). Deze methode haalt een datum uit de tabel en vormt ze om naar een Date object binnen de

package java.util. Op zijn beurt heeft dit object dan weer de methode toLocaleString( ) om het formaat aan te

passen. Deze aanpak hebben we echter pas laat ontdekt en konden we dus niet meer tijdig implementeren. De

door ons gebruikte oplossing maakt echter meer gebruik van systeemmiddelen. Door de kleinschaligheid van de

databank is dit redundant gebruik van resultsets schijnbaar zo goed als verwaarloosbaar.

De tweede stap is het doorlopen van de resultsets. Dit gebeurt aan de hand van een while lus en de methode

ResultSet.next(). Deze controleert of er een volgende rij is binnen de resultset. Is dit zo dan krijg je een true terug

en verschuift de cusrsor naar de volgende rij.

while(rs.next() && rsDate.next()){

}

In de while lus wordt de resultset rij per rij afgelopen. Binnen elke iteratie kan dan de waarde van elk veld

worden opgevraagd. Dit gebeurt met de methode getString("kolomnaam") van het object ResultSet.

Bij de verwerking van elke rij worden er enkele zelfgemaakte functies gebruikt. Deze functies zijn

rowBackcolor( ), printDate( ) (indien datums voorkomen) en composedRow( ).

De functie rowBackcolor(counter) zorgt ervoor dat elke oneven rij een andere opmaak krijgt dan de even rijen.

Dit doen we om de leesbaarheid van de afgedrukte tabel ten aanzien van de bezoeker te vergroten. Deze functie

zorgt er voor dat elke oneven rij opgemaakt wordt volgens de CSS klasse oddRow (zie hoger).

De functie rowBackColor(counter) volgt hieronder:

static String rowBackcolor(int i){

if (i%2!=0)

return "<tr class='oddRow' height='40'>";

else

return "<tr class='evenRow' height='40'>";

}

De functie printDate(rs.getString("begindate"),rs.getString("enddate")) drukt de datum af van een FME-

meeting. Als er geen einddatum is dan wordt de volledige begindatum afgedrukt. Als er wel een einddatum is

Page 33: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

31 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

dan wordt het jaar van de begindatum niet afgedrukt gevolgd door de volledige einddatum en gescheiden met

een ‘-‘ teken. Hieronder volgt de printDate-functie:

static String printDate(String begin,String end){

if (end==null)

return begin;

else

return begin.substring(0,begin.length()-5) + " - "+ end;

}

De functie composedRow(rs.getString("meeting"),rs.getString("meetingurl"),"<br>") maakt het mogelijk om

meerdere entries per veld te koppelen aan hun corresponderende url’s. De velden meeting en meetingurl kunnen

bestaan uit meerdere waarden. Deze waarden worden in de databank gescheiden door een ‘ ;’ teken. De functie

en in het bijzonder de while-lus binnen deze functie scheidt de afzonderlijke waarden per veld en laat ze

corresponderen met de gescheiden url’s. Lege velden worden opgevuld met een ‘non-breaking space’. De code

van de functie volgt hieronder:

static String composedRow(String subject, String url, String seperator){

String returnString = "";

int whereURL; int whereSubject;

while (url.indexOf(';')!=-1){

whereURL = url.indexOf(';');

whereSubject = subject.indexOf(';');

returnString = returnString+"<a href='"+url.substri ng(0,whereURL)+"'>"

+subject.substring(0,whereSubject)+"</a>"+seperator ;

subject = subject.substring(whereSubject+1,subj ect.length()-1);

url = url.substring(whereURL+1,url.length()-1);

}

String space = "&nbsp;";

if (url.length()>0 && subject.length() > 0){

return returnString+"<a href='"+url+"'>"+subjec t+"</a>";

} else if (url.length()<=0 && subject.length()>0 ){

return subject;

} else

return space;

}

De derde en laatste stap is het sluiten en verwijderen van de aangemaakte objecten. Dit doen we om de

systeemmiddelen te sparen en eventuele conflicten te vermijden. De code is als volgt:

rs.close();

rsDate.close();

stat.close();

connection.close();

3.4.4.2 Query van de FME-databank

Page 34: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

32 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

Bij het zichtbaar maken van de databank wordt steeds alle data weergegeven, met uitzondering van de sleutel id.

Natuurlijk kan in de JSP-code de ‘select statement’ verfijnd worden zodat enkel de recente informatie getoond

wordt. Sommige tabellen hebben echter een zeer omvangrijke inhoud. Om de toegankelijkheid van de site te

verhogen en het interactieve karakter ervan ten aanzien van de bezoeker te benadrukken, hebben we een reeks

aparte JSP pagina’s aangemaakt. Door middel van deze pagina’s kan de gebruiker dan zelf op een dynamische

wijze de databank bevragen. Net zoals bij het onderdeel “bevraging van de FME databank” bespreken we één

JSP pagina, namelijk de ‘Q-meeting.jsp’

De interface waarmee de gebruiker de databank bevraagt is een formulier. Dit formulier bestaat enkel uit HTML

tags. In de onderstaande tabel worden de verschillende HTML-tags kort toegelicht.

<form></form>

Alle elementen uit het formulier moeten tussen deze tags staan. Aangezien het

formulier verwerkt wordt op dezelfde pagina zijn de attributen method en

action facultatief.

<select name="begindateOrder">

<option> < </option>

<option> = </option>

<option selected> > </option>

</select>

De tag <select> plaatst een keuzelijst in het formu lier. Het attribuut name

maakt het mogelijk om later de informatie te kunnen scheiden.

Binnen de <select> tag worden de mogelijke waarden ingevuld. Dit gebeurt met

de tag <option>. Het attribuut selected geeft de fo cus aan een bepaalde

mogelijkheid.

<input type="text" name="begindate" size="24">

De tag <input> is de algemene tag voor een veld. Me t het attribuut type

bepaal je het soort veld, in dit geval een tekstvel d. Het attribuut name

dient om de informatie later te scheiden. Het attri buut size bepaalt hoe

groot het veld is, dit is echter niet de maximumlen gte.

<input type="radio" value="begindateA" name="order" >

Deze tag plaatst een radio button in het formulier. Het attribuut name heeft

hier echter een bijzondere betekenis. Als er meerde re radio buttons zijn met

dezelfde naam dan kan er enkel één aangevinkt staan . Het attribuut value

bevat de waarde die later zal verwerkt worden.

<input type="submit" value="Query">

Dit is een bijzondere tag. Het attribuut type zorgt ervoor dat dit de knop

wordt waarmee het formulier wordt verzonden. Het at tribuut value bevat het

opschrift voor de knop.

<input type="reset">

Dit is een bijzondere tag. Het attribuut type zorgt ervoor dat dit de knop

wordt waarmee de inhoud van het formulier wordt gew ist.

<input type="hidden" name="hiddenOne" value="someVa lue">

Dit is eveneens een bijzondere tag. Het attribuut type maakt dit veld

onzichtbaar. Het attribuut value geeft een waarde aan dit veld.

Tabel 10: De tags in een formulier

Page 35: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

33 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

In onderstaande figuur (zie figuur 5) zie je een screenshot van de Q-meeting.jsp pagina., waar duidelijk de

bovenstaande besproken formulierelementen terug te vinden zijn.

Figuur 5: Query-pagina om de FME-meetings databanktabel te bevragen

Het is belangrijk dat enkel het query-formulier getoond wordt bij de eerste bevraging. Eén of ander

ongedefinieerd query-resultaat zou de gebruiker hinderen of zelfs verwarren. Daarom wordt in het formulier een

verborgen veld geplaatst, dit gebeurt met de attribuutwaarde hidden (zie ook tabel 2).

In de JSP pagina wordt eerst de waarde voor dit veld opgevraagd. De waarde voor dit veld is dan op dat moment

null. De gebruiker heeft immers nog geen informatie doorgestuurd naar de pagina. Daarom wordt de code die het

formulier verwerkt binnen een if structur geplaatst. In Java wordt dit dan:

if(request.getParameter("hiddenOne")!=null)

{

}

Eenmaal de gebruiker het formulier heeft ingevuld kan hij de databank bevragen door op de Query knop te

drukken. Op dat ogenblik wordt de inhoud van het formulier doorgestuurd naar het JSP document zelf.

Bijvoorbeeld:

Page 36: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

34 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

De gebruiker heeft bij location ‘France’ ingetikt en wil stijgend sorteren op hetzelfde veld. Op dit ogenblik is de

URL www.fmeurope.org/Q-Meetings.jsp. Eenmaal de gebruiker op Query klikt verandert de URL, er wordt

een ? geplaatst gevolgd door alle velden en hun waarden. Alle velden zijn echter leeg met uitzonder van place en

sort. Het veld place bevat ‘France’ en sort bevat ‘placeA’.

Op dit ogenblik zijn de waarden voor alle velden onrechtstreeks gekend. Om deze gegevens in variabelen te

plaatsen moet men ze eerst opvragen. Dit gebeurt met de volgende opdracht:

request.getParameter("place");

Deze opdracht zoekt het veld place in de URL en geeft de waarde terug. Voor de andere velden is er een analoge

opdracht. Om de databank correct te bevragen moeten deze gegevens nog omgezet worden naar een SQL

opdracht.

Bijvoorbeeld:

De gebruiker wil alle meetings in Frankrijk zien. De SQL opdracht hiervoor is:

SELECT * FROM meetings WHERE place LIKE '%France%';

De tekst in hoofdletters behoren tot de vaste SQL syntax. Het procentteken is de joker of wildcard in de SQL

grammatica.

In de JSP code worden de voorwaarden bijgehouden in de string createClause. De voorwaarden worden

verwerkt binnen een aantal zelfgemaakte functies en breiden de variabele createClause steeds verder uit tot een

uiteindelijke “select statement”.

3.4.4.3 Update van de FME databank

De oude versie van de website werkte nog niet met databanken of JSP. Het aanpassen van de pagina's gebeurde

dus manueel. De persoon die instaat voor het onderhoud van een onderdeel, bijvoorbeeld de FME symposia,

paste het HTML document aan. Vervolgens werd het document via het FTP protocol op de server geplaatst.

De huidige versie maakt het onderhoud aanzienlijk eenvoudiger. JSP maakt het mogelijk om via formulieren de

databank aan te vullen. Hiervoor hebben we enkele extra JSP documenten aangemaakt. De belangrijkste zijn

insert.jsp en insertDB.jsp.

Als een gebruiker de databank wenst aan te passen moet die zich eerst bekend maken. De gebruiker geeft zijn

gebruikersnaam en paswoord op (zie figuur 6). De verschillende gebruikers en hun paswoorden worden

bijgehouden in de databank (tabel ‘access’). Eveneens staan deze gebruikers geregistreerd als mySQL database

users voor de FME-databank (elk met specifieke permissies opgegeven door de systeemadministrator).

Page 37: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

35 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

Figuur 6: database login pagina

In het document insert.jsp worden de gebruikersnaam en paswoord gevraagd aan de gebruiker. Deze worden dan

doorgestuurd naar insertDB.jsp. In dit document wordt deze informatie verwerkt. De gebruikersnaam en het

paswoord worden bewaard in sessie objecten. Dit zijn variabelen die tijdelijk worden bijgehouden op de server.

Hierdoor moet de gebruiker zich niet steeds opnieuw aanmelden. De sessie objecten worden in deze volgorde

aangemaakt:

Figuur 7: Aanmaken van de sessie objecten

In de tabel ‘access’ wordt er gecontroleerd of de gebruiker en het paswoord wel bestaan. Als dit het geval is dan

wordt de inhoud van het sessie object allowed "yes". Als de gebruikersnaam en het paswoord niet voorkomen in

de tabel dan blijft allowed gelijk aan "no". Deze variabele zorgt voor de nodige afscherming. Voor een

onbekende genereert insertDB.jsp een leeg HTML document.

insert.jsp

firstRun

""

insertDB.jsp

firstRun username password

accessLevel allowed

Als firstRun == "" dan

= "alreadyUsed" = Uit insert.jsp = Uit insert.jsp = Uit databank = "no"

Page 38: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

36 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

Bij een gekende gebruiker genereert insertDB.jsp een document die aangepast is aan de toegangsrechten van de

gebruiker. Het resultaat toont enkel de tabellen waar de gebruiker toegang tot heeft. Hiervoor gebruiken we een

eenvoudige wiskundige regel. Een som van machten van twee kan steeds opnieuw ontbonden worden in deze

machten van twee. Deze som wordt bewaard in het veld level in de tabel ‘access’. Samengevat geeft dit:

i 2 i Tabelnaam

0 1 Events

1 2 Meetings

2 4 News

3 8 Organisations

4 16 Positions

5 32 Symposia

6 64 Access

Tabel 11 Bepalen van de toegangsrechten

In het document insertDB.jsp wordt deze som in een while lus opnieuw ontbonden. Waar de macht voorkomt

wordt een link geplaatst. Deze link zorgt ervoor dat het formulier voor een bepaalde tabel getoond wordt. De link

stuurt twee parameters terug naar het document zelf, de parameters selector en subject. De parameter subject

bevat de naam van de tabel. Indien we enkel deze parameter zouden gebruiken kan een gebruiker zijn

toegangsrechten gemakkelijk verhogen.

Bijvoorbeeld:

Stel dat de gebruiker enkel toegang heeft tot de tabel ‘news’. De gebruiker ziet dan de volgende URL als hij de

klikt op de link naar het news formulier: insertDB.jsp?subject=news.

Om zijn toegangsrechten te verhogen moet hij dan enkel zelf een een URL intikken met de gepaste parameter.

Bijvoorbeeld insert.jsp?subject=access. Dit zorgt ervoor dat de gebruiker ook de tabel access kan aanvullen, wat

niet de bedoeling is.

Om de formulieren nu beter af te schermen hebben we de parameter selector ingevoerd. Enkel als deze

parameter klopt wordt het formulier weergegeven. Het is dus belangrijk dat deze parameter moeilijk is te

voorspellen, in dit geval zijn het namen uit de werken van Tolkien.

In onderstaande figuur (figuur 8) zie je een voorbeeld van een invulformulier om de ‘events’ tabel van de FME

databank aan te passen. In dit voorbeeld is via de insert.jsp pagina ingelogd met onze username en paswoord.

Tijdens het testen van de hele opstelling hadden wij lees- en schrijfpermissie op alle tabellen van de FME-

databank. In onderstaand voorbeeld hebben we het ‘events’-formulier geopend.

∑= ilevel 2

Page 39: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

37 Hoofdstuk 3 Gebruikte strategieën en technologieën

De ontwikkeling van een nieuwe website Formal Methods Europe

Figuur 8: update formulier FME-databank (bv. Events)

Na invullen van de relevante gegevens (+submit) wordt de data verstuurd naar de mySQL databank. Men krijgt

daarna een pagina waarop de zojuist ingegeven record nog eens wordt getoond met de bevestiging van ingave in

de databank. Er is de mogelijkheid om de ingegeven record te verwijderen indien fouten terug te vinden zijn.

Page 40: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

38 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

H o o f d s t u k 4 A P P E N D I C E S

Appendix A De functie printSubmenu()

function printSubMenu(menuName,type) { i = 10; menuName = menuName.toLowerCase(); while (i < menu1.length) { i = i+5; if (menu1[i] != undefined) { if (menuName.search(menu1[i].toLowerCase()) != - 1) { position = i+1; i = i+menu1.length; } } } subMenu = new Array(); tmpStr = menu1[position]; tmpStr = tmpStr.substr(5,tmpStr.length) subMenu = eval(tmpStr); locationString = document.URL document.write("<div class='titleright''><img src= './images/arrow.gif'>&nbsp;") if (menu1[position+1] == undefined) { document.write(menu1[position-1]+"</div>"); } else { document.write("<a href='"+menu1[position+1]+"'>" +menu1[position-1]+"</a></div>"); } document.write("<br>"); document.write("<table>"); for(i=15;i<subMenu.length;i=i+5) { document.write("<tr>"); document.write("<td class='plainsingle'><img src= './images/arrow.gif'>") if (locationString.search(subMenu[i+1]) != -1) { document.write("<img src='./images/arrow.gif'></ td><td class='plainsingle'>"

+subMenu[i]+"</td>"); } else { document.write("</td><td class='plainsingle'><a href='"+subMenu[i+1]+"'>"

+subMenu[i]+"</a></td>"); } if (type!=undefined) {

document.write("</tr><tr><td></td><td class='plains ingle'>&nbsp;&nbsp;&nbsp;<a href='"+subMenu[i+1]+"#europe'>Europe</a><br>&nbsp; &nbsp;&nbsp;<a href='"+subMenu[i+1]+"#world'>World</a></td>");

} document.write("</tr>"); } document.write("</table>"); }

Page 41: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

39 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

Appendix B De functie showMap()

/*------------------------------------------------- ----------------------------- | Met de functie createEntry() worden de submenu's uit het hoofdmenu ge- | | controleerd. Er wordt verondersteld dat een subme nu op zich atomair is. | --------------------------------------------------- ----------------------------*/ function createEntry(menu)

{ for (i=15;i<menu.length;i=i+5) {

document.write("<dd>&nbsp;&nbsp;&nbsp;&nbsp;<img sr c='./images/arrow.gif'> &nbsp;&nbsp;");

if (validate(menu[i+1], ".htm", ".jsp")) {

document.write("<a href='" + menu[i+1] + "' class=' plainsingle'>" + menu[i] + "</a>");

} else {

document.write(menu[i]); }

} } /*------------------------------------------------- ----------------------------- | De functie validate() wordt er gezocht op substri ngs binnen een string. | | De functie geeft een TRUE/FALSE waarde terug. -ui tbreidbaar- | --------------------------------------------------- ----------------------------*/ function validate(stringURL, v1, v2)

{ if (stringURL.search(v1)!=-1) {

return true; }

else {

if (stringURL.search(v2)!=-1) return true; else return false; } } /*------------------------------------------------- ----------------------------- | Deze functie haalt uit de ouder-menu-array ,zie m enu-systeem, welke | | ondergeschikte menu-array moet worden ingeladen. | | Nu enigzins dynamischer dankzij eval()... | -------------------------------------------------- ----------------------------*/

function selectMenu(showString) {

showString=showString.substr(showString.length-5, showString.length-1); return eval(showString); } /*------------------------------------------------- ------------------------------ | De eigenlijke sitemap wordt opgebouwd. Het groots te probleem was | | het gebrek -?- aan uniformiteit. Een knop uit het hoofdmenu is: | | * Niet uitschuifbaar & aanklikbaar. | | * Wel uitschuifbaar & niet aanklikbaar -UNDEFINE D- | | * Wel uitschuifbaar & aanklikbaar | | Vooral de undefined is onaangenaam... | --------------------------------------------------- ----------------------------*/

function showMap() {

s=0; document.write("<table width='600'><tr><td width= '50%' valign='top'>"); for (j=15;j<menu1.length;j=j+5) { document.write("<dl><dd><img src='./images/cube .gif'>&nbsp;&nbsp;<font size='2'>"); if (validate(menu1[j+1], ".htm", ".jsp"))

Page 42: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

40 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

{ document.write("<a href='" + menu1[j+1] + "'>" + me nu1[j] + "</a>");

subItem="none"; } else {

subItem=menu1[j+1]; if (menu1[j+2]!=undefined) {

document.write("<a href='" + menu1[j+2] + "'>"+ men u1[j] + "</a>"); }

else {

document.write(menu1[j]); }

} document.write("</font>"); if (subItem!="none") {

createEntry(selectMenu(subItem))} document.write("</dl>"); if(j==25) {

document.write("</td><td width='50%' valign='top'>" ); }

} document.write("</td></tr></table>"); }

Page 43: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

41 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

Appendix C Javascript menu-systeem

C.1 Mmenu.js

/*DHTML Menu version 3.0 (beta) * written by Andy Woolley * Copyright 2001 Andy Woolley. All Rights Reserved. * This script featured on Dynamic Drive (http://www .dynamicdrive.com) */ timer=0; d=document; smc=-1; ns4=(d.layers)?true:false; ns6=(navigator.userAgent.indexOf("Gecko")!=-1)?true :false; mac=(navigator.appVersion.indexOf("Mac")!=-1)?true: false; if(ns6)mac=false; opera=(navigator.userAgent.indexOf("Opera")!=-1)?tr ue:false; ns61=(parseInt(navigator.productSub)>=20010726)?tru e:false; ie4=(!d.getElementById&&d.all)?true:false; konq=(navigator.userAgent.indexOf("Konqueror")!=-1) ?true:false; mp=(ns6)?"pointer":"hand";atop=5;oatop=0;aleft=0;oa left=1; var a,am,oa,im,om,flta;hlarr=new Array();hlcnt=0;hl l=0;timo=0;el=0;nshl=0;var omv=0;df=1;im=0;ofrac=0;omnu=0;ac=15;m=1; var imar=new Array();mr=","; while(eval("window.menu"+m)){mr+="menu"+m+",";tmenu =eval("menu"+m);m++}; mr=mr+" ";mr=mr.split("\,");menus=mr.length-1;bgt=" ";if(!opera)bgt="Color"; function gmobj(mtxt){if(d.getElementById){m=d.getEl ementById(mtxt)}else if(d.all){m=d.all[mtxt]}else if(d.layers){m=d.layer s.eval(mtxt)}return m} function gmstyle(mtxt){m=gmobj(mtxt);if(!ns4){m=m.s tyle;}return m;} function spos(gm,t_,l_,h_,w_){if(ns4){gms=gm;if(w_)gms.clip. width=w_;if(h_)gms.clip.height=h_;}else if(opera){gms=gm.style;if(w_)gms.pixelWidth=w_;if(h _)gms.pixelHeight=h_}else{gms=gm.style;if(w_)gms.width=w_;if(h_)gms.height=h_;}if(t_)gms.top=t _;if(l_)gms.left=l_} function gpos(gm){if(ns4){t_=gm.top;l_=gm.left;h_=g m.clip.height;w_=gm.clip.width;}else if(opera){t_=gm.style.pixelTop;l_=gm.style.pixelLef t;h_=gm.style.pixelHeight;w_=gm.style.pixelWidth;}else if(ns6){t_=gm.offsetTop;l_=gm.offsetLeft;h_=gm.offs etHeight;w_=gm.offsetWidth}else{t_=gm.offsetTop;l_=gm.offsetLeft;h_=gm.offsetHeight;w_=gm.offs etWidth;}if(konq){w_=parseInt(gm.style.width);h_=parseInt(gm.style.height);}var gpa=new Array();gpa[0]=t_;gpa[1]=l_;gpa[2]=h_;gpa[3]=w_;ret urn(gpa)} function close_el(){for(xa=hlarr.length-1;xa>=0;xa- -){ti=hlarr[xa].split("-");tmenu=eval("menu"+ti[0]);if(ns4){shl(ti[0]-1,ti[1],'hide');}else{arg=gmobj("el"+ti[1]);arg.sty le.backgroundColor="#"+tmenu[5][1];if(opera)arg.style.background="#"+tmenu[5][1];arg.style.col or="#"+tmenu[5][0];}if("menu"+ti[0]==hll){if(ns4)shl(ti[0]-1,hel,'show');return}}hlcnt=0;hlarr =new Array()} function closeallmenus(){om=0;if(ns4){omv.visibility="hide"} for(a=1;a<menus;a++){menu=eval("menu"+a);mi=gmstyle("menu"+a);if (menu[6]!=1){mi.visibility='h idden'}else{am=""}}hll="";close_el();} function rep_img(){if(timo){timo.src=o_img;}} function popdn() { arg=popdn.arguments; if(arg[0]) { menu=eval(window.arg[2]); mnum=arg[2].substr(4,4); if(arg[3].substr(0,5)!="show-") { if(!ns4) { if(arg[1]==smc&&menu[5][14]) { menu[5][0]=menu[5][14]; menu[5][1]=menu[5][15]; } arg[0].style.backgroundColor="#"+menu[5][1]; if(opera)arg[0].style.background="#"+menu[5][1] ; arg[0].style.color="#"+menu[5][0] } if(arg[1]==smc&&menu[5][14]) {

Page 44: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

42 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

menu[5][0]=ofc; menu[5][1]=obc; } } else { if(ns4)omv=0; hlarr[hlcnt]=mnum+"-"+arg[1]; hlcnt++; } } if(!menu[11])timer=setTimeout("closeallmenus()",ti megap) } function dc(){d.cookie=sel;tr=ltarg.split("=");if(tr[1])pare nt.frames[tr[1]].location.href=nshl;else location.href=nshl;} function openurl(url){window.open(url)} function sis() { for(a=1;a<imar.length;a++) { tim=imar[a].split("_"); if(tim[4]){tim[3]=tim[3]+"_"+tim[4]} menu=eval(window.tim[3]); if(ns4) { mtl=d.layers.eval(tim[3]).document.layers.eval(" el"+tim[2]); ht=(mtl.clip.height/2); wd=mtl.clip.width-mtl.clip.left-8;eln=""; for(x=0;x<2;x++) { mtl=d.layers.eval(tim[3]).document.layers.eval(eln +"el"+tim[2]).document.layers.eval(imar[a]); mtl.left=wd; if(menu[12]=="left")mtl.left=10 mtl.top=ht-(mtl.clip.height/2)-1; eln="m" } } else { imo=gmobj(imar[a]); im=gmobj("el"+tim[2]); imo.style.left=im.offsetWidth-8; if(menu[12]=="left")imo.style.left=8 cr=0; if(ns6&&!ns61) { mn=gmobj(tim[3]) cr=mn.offsetTop } if(mac)cr=4; imo.style.top=im.offsetTop+(im.offsetHeight/2)-( imo.offsetHeight/2)-cr } if(opera) { imo.style.top=im.offsetTop+(im.style.pixelHeight /2)-4; if(menu[12]=="left"){}else{imo.style.left=im.sty le.pixelWidth-8} } } } function fixb(mnu) { menu=eval(mnu); mn=gmobj(mnu); if(ns4){if(menu[10])mn.clip.width=mn.clip.width+me nu[3];return} el+=((menu.length-ac)/5); ml=gmobj("el"+(el-1)); mp=gpos(mn); if(ns6){mp[3]=mp[3]-menu[3]*4;mp[2]=mp[2]-menu[3]* 2}

Page 45: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

43 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

else if(mac){mn.style.height=ml.offsetTop+ml.offsetHeigh t+(menu[3]*2);mn.style.height=mn.style.height-menu[5][9];if(!menu[2]){mp[2]=1}} else if(opera){mp[3]=mp[3]+(menu[3]*4)} if(!d.all||opera)spos(mn,null,null,mp[2],mp[3]); if(menu[10]) { oh=0;tw=0;mtl=0; if(opera) { tw=menu[3] tp=tw } else { tp=null; } ic=(menu.length-ac)/5; for (y=el-ic;y<el;y++) { ty=gmobj("el"+y); thy=gmobj("hel"+y); typ=gpos(ty); spos(thy,tp,tw,null,null); if(!menu[2]) { if(mac) { thy.style.width=1; ty.style.width=thy.offsetWidth+menu[5][9]; tw=tw+thy.offsetWidth+menu[3] } else if(opera) { tw=tw+thy.style.pixelWidth+menu[3] ty.style.pixelTop=0 } else { tw=tw+typ[3]+menu[3] } } else { if(opera) { tw=tw+menu[2]+(menu[5][9]*2)-menu[3] } else { tw=tw+menu[2]-menu[3] } } if(typ[3]>oh)oh=typ[2] } if(d.all){oh=oh+(menu[3]*2);tw=tw+menu[3];} if(ns6||opera){tw=tw-menu[3]} spos(mn,null,null,oh,tw) } } function sm(v1){if(flta){ap=gmobj(v1);if(ap.filters [0]) ap.filters[0].Apply()}else{if(menu[8]){ts=menu[8].s ubstr(0,4);if (ts.toUpperCase()=="FADE"){ //ap=gmobj(v1); //mi.filter = "Alpha(Opacity=20)"; //mi.MozOpacity = 0.3; }}}mi.visibility='visible';if(flta){if(ap.filters[0 ])ap.filters[0].Play()}} function popup(mn){omv.visibility='hide';clearTimeout(timer) ;closeallmenus();mtxt='menu'+mn;mi=gmstyle(mtxt);flta=0;if((d.all&&d.getElementById)&&!mac){ap =gmobj(mtxt);getflta(ap);}sm(mtxt);am=mn} function shl(lyr,el,s){clearTimeout(timer);mt=d.layers[lyr]. document.layers.eval("el"+el);omv.visibility="hide";menu=eval(lyr);if(menu[13]!="form")mt.visi bility=s;omv=mt;} function popi(v1,lyr,el) {

Page 46: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

44 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

sel="smenu="+el+"#" if(!om)om=lyr clearTimeout(timer); if (ns4){timo=eval("document.im"+el)}else{timo=gmo bj("im"+el)} o_img=""; if (timo) { o_img=timo.src; ima=o_img.split("."); enD=ima.length; ima[enD-2]=ima[enD-2]+"_over"; nsrc=""; for(eD=0;eD<enD;eD++){nsrc=nsrc+ima[eD]+"."} nsrc=nsrc.substring(0,nsrc.length-1); ta=om.split(","); NI1=new Image; NI1.src = nsrc; if(NI1.width>0) timo.src=nsrc; } if(v1.substring(0,5)=="show-") { v1=v1.substring(5,20); menu=eval(v1); omnu=v1; container=eval(lyr); mi=gmobj(v1); if(!menu[0]||!menu[1]) { gp=gpos(gmobj(lyr)) h3=""; if(container[10])h3="h"; if(ns4){tel=gpos(d.layers.eval(lyr).document.layer s.eval("el"+el))}else{tel=gpos(gmobj(h3+"el"+el))} np=gpos(mi); if(container[10]) { if(!ns61&&ns6){gp[1]=-1;gp[0]--} if(ns4||mac)gp[1]--; if(mac)gp[0]--; if(np[2]+gp[0]>wh){gp[0]=gp[0]-np[2]-tel[2]} spos(mi,gp[0]+gp[2]-1,tel[1]+gp[1],null,null) } else { if(!ns61&&ns6)tel[0]=tel[0]-gp[0]; nt=tel[0]+gp[0]+suboffset_top; nl=gp[1]+tel[3]-suboffset_left; if(gp[3]+nl>(ww-25)){nl=gp[1]-np[3]+suboffset_l eft;} spos(mi,nt,nl,null,null); } } sm(v1); om+=","+v1; if(!ns4)mi.style.visibility="visible"; } ta=om.split(",") strt=0; for(a=0;a<ta.length;a++) { if (ta[a]==v1)strt=0; if (strt) { if(ta[a]) { hll=lyr; hel=el; close_el(el); mi=gmstyle(ta[a]); mi.visibility='hidden'; } ta[a]="" }

Page 47: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

45 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

if(ta[a]==lyr)strt=1; } mmenu=eval(lyr) if(mmenu[6]&&lyr!=ta[0]) { closeallmenus(); ta=[lyr]; } om="" disp=0 for(a=0;a<ta.length;a++) { if(ta[a]==lyr)frs=a if(ta[a]==v1)fre=a if (disp||(a>frs&&a<fre)) { if (ta[a]&&ta[a]!=v1) { mi=gmstyle(ta[a]); mi.visibility='hidden'; } } else { if (ta[a])om+=ta[a]+","; } if (v1==ta[a])disp=1 } } function stch(ms){window.status=ms; return true} function hl() { arg=hl.arguments; if(smc==el&&arg[2][14]){ofc=arg[2][0];obc=arg[2][1 ];arg[2][0]=arg[2][14];arg[2][1]=arg[2][15]} hlnk=arg[1];if(arg[7]+""=="undefined"){arg[7]=hlnk } am=" "+a;am=am.length-1;subimg="";arg[0]+="" if (ns6){dwd=arg[2][9]*2}else{dwd=0} if (ns4){if (el==0){st="<style type=\"text/css\">A .m{text-decoration:none;}</style>";d.write(st);oatop=atop;} else{mtl=d.layers.eval(omnu).document.layers.eval("el"+(el-1));if (oatop==atop){atop+=mtl.clip .height}else{atop=menu[3];}oatop=atop}if (menu[10]){atop=menu[3];if (oaleft==aleft){aleft+=mtl.clip.width+menu[3]}else{ aleft=menu[3];oaleft=aleft}oaleft=aleft}else{aleft=menu[3];}} pd="popdn(this," + el + ", '" + arg[5] + "', '"+ar g[1]+"');" if(arg[0].indexOf("<img")>=0){ipos=arg[0].indexOf( "<img");arg[0]=arg[0].substr(0,ipos+4)+" id=im"+el+" name=im"+el+" "+ arg[0].substr(ipos+5,9 00)} if (hlnk.substring(0,5)=="show-"){if(arg[7]==hlnk) if(arg[6])arg[7]=arg[6];else arg[7]="";hlnk="#";if (arg[6]+" "!="undefined ")hln k=arg[6];} if (arg[1].substring(0,5)=="show-" && (!menu[10]||menu[5][16])){im++;ims="im"+im+"_"+a+"_ "+el+"_"+arg[5];ti=arg[2][10];if(menu[5][16])ti=menu[5][16];if(ns4){subimg="<layer id="+ims+" style=\"position:absolute;\"><img border=0 src="+ti+"></layer>";}else{subimg="<img id="+ims+" border=0 style=\"position:absolute;\" src="+ti+">"}imar[im]=ims;} ltarg=" "; lpos=hlnk.toLowerCase(hlnk).indexOf(" target="); if(lpos>0){lta=hlnk.split(" ");ltarg=lta[1];hlnk=l ta[0]} if(ns4){ rsp="" tdwd=" width="+menu[2] if(!menu[7]||menu[7]=="left")tdwd="" if (menu[7]=="right") rsp="<td height=-1></td>" ls="<table cellpadding="+(arg[2][9]/2)+" cellspac ing=0><tr><td height=-1 align="+menu[7]+tdwd+"><a href=\""+hlnk+"\" "+ltarg +" onclick=\"d.cookie=sel;\" style='color:#" le=";text-decoration:none;font-size:"+arg[2][5]+" px;font-weight:"+arg[2][7]+";font-family:"+arg[2][8]+"' onmouseover=\";return stch('"+arg[7]+"');\">"+arg[0]+"</a>"+subimg+"</td> "+rsp+"</tr></table></layer>" lv=" left="+aleft+" width="+(menu[2]-(menu[3]*2)) +" top="+atop mt="<layer id=mel"+el+lv+" bgColor="+arg[2][1]+" onmouseover=\"shl('"+arg[5]+"',"+el+",'show');popi( '"+arg[1]+"','"+arg[5]+"',"+el+"); window.status='"+arg[7]+"';\">"+ls+arg[2][0]+le mt+="<layer id=el"+el+lv+" bgColor="+arg[2][3]+" onmouseover=\"shl('"+arg[5]+"',"+el+",'show');popi( '"+arg[1]+"','"+arg[5]+"',"+el+"); ltarg='"+ltarg+"'; nshl='"+hlnk+"'; this.captureEve nts(Event.CLICK); this.onClick=dc;\" onmouseout=\"window.status='';"+pd+"\" visibility=h idden >"+ls+arg[2][2]+le

Page 48: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

46 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

}else{ mt=""; if (menu[10]){bgc=hlp[4];if(hlp[11])bgc=hlp[12];m t+="<div id=hel"+el+" style=\"background-color:#"+bgc+";width:"+(menu[2]-menu[3])+";position:absolute;top:0;left:"+dlft+";\" >";dlft=dlft+menu[2]-(menu[3]*2)+menu[3]} if(!menu[7])menu[7]="left" rsp=0;if (menu[7]=="right") rsp=7; if(menu[13]!="form") {mt+="<a href=\""+hlnk+"\" "+ltarg+" style='text-decoration:none;'>"} dw=(menu[2]-(2*menu[3]+dwd)) if(dw+" "=="NaN "){dw=""}else{dw="width:"+dw} if(!menu[2]&&ie4)dw="width:1"; if(!menu[2]&&opera){dw="position:absolute;";menu[ 7]="left"} mt+="<div align="+menu[7]+" id=el"+el+" style=\"" +dw+";padding-left:"+arg[2][9]+";padding-right:"+(arg[2][9]+rsp)+ ";padding-top:"+arg[2][9]+";padding-bottom:"+arg[2][9]+";font-weight:"+arg[2][7]+";font -style:"+arg[2][6]+";font-family:"+arg[2][8]+";font-size:"+arg[2][5]+"px;colo r:#"+arg[2][0]+";background-color:#"+arg[2][1]+";\"" mt+=" onMouseOver=\"this.style.cursor='"+mp+"';this.style .background"+bgt+"='#"+arg[2][3]+"';this.style.color='#"+arg[2][2]+"';popi('"+arg[1]+"','"+arg [5]+"',"+el+");return stch('"+arg[7]+"');\"" mt+=" onclick=d.cookie=sel onMouseOut=\"rep_img() ; "+pd+";return stch('');\">" mt+=arg[0]+subimg+"</div>";mt+="</a>";if (menu[10 ]){mt+="</div>"} } d.write(mt) if(smc==el&&arg[2][14]){arg[2][0]=ofc;arg[2][1]=ob c;}el++ } function dmenu(mnu){ menu=eval(mnu);atop=menu[3];hlp=menu[5];if(!menu[3 ])menu[3]=0; if(hlp[14]&&el==0){tc=d.cookie;tp=tc.indexOf("smen u=");smc=tc.substr(tp+6,10);smc=smc.substr(0,smc.indexOf("#"));if(!smc)smc=-1} if(el)ns6c=3;else ns6c=2;ns6w=0;if(menu[7]=="right "&&ns6)ns6w=7; if (menu[2]<1)menu[2]="undefined" if(ns4) { thw=menu[2] if(menu[10]){ic=(menu.length-ac)/5;thw=(menu[2]*i c)-(menu[3]*ic)+menu[3]} bgc=hlp[4] if (hlp[11]){bgc=hlp[13]} mt="<layer z-index=99 visibility=hidden bgcolor=# "+bgc+" id="+mnu+" top="+menu[0]+" left="+menu[1]+" width="+thw+">" if (hlp[11]){mt+="<layer bgcolor=#"+hlp[12]+" top =0 left=0 height=2 width=100%></layer>"}mt+="<layer id="+mnu+"3d bgcol or=#"+hlp[12]+" top=0 left=0 height=1 width=2></layer>"} else { iedf="";if(!opera&&!mac&&d.all&&menu[8]) { iedf=" filter:";flt=menu[8].split("\;");for(fx=0 ;fx<flt.length;fx++){iedf+=" progid:DXImageTransform.Microsoft."+flt[fx]}} if (hlp[11]){brd = "border:solid "+menu[3]+"px; b order-left-color:#"+hlp[12]+";border-top-color:#"+hlp[12]+";border-bottom-color:#"+hlp[1 3]+";border-right-color:#"+hlp[13]+";"}else{brd = "border:solid "+men u[3]+"px; border-left-color:#"+hlp[4]+";border-top-color:#"+hlp[4]+";bord er-bottom-color:#"+hlp[4]+";border-right-color:#"+hlp[4]+";"} mt="<div id="+mnu+" style=\""+iedf+";z-index:99;visibility:hidden;"+brd+"position:absolute ;background-Color:#"+hlp[4]+";width:"+(menu[2]+ns6w)+";left:"+m enu[1]+";top:"+menu[0]+";\">" } d.write(mt) x=0; dlft=0 aleft=0; for(b=ac;b<menu.length;b++) { b=b+4 if(menu[b-3]==""){menu[b-3]="#"} menu[b-3] = menu[b-3].replace(/\"/gi, "&quot;") hl(menu[b-4], menu[b-3], hlp, 100, 100, mnu, menu [b-2], menu[b-1]) txt=""; if(ns4) { if (!menu[10]) {

Page 49: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

47 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

if (menu[b]&&b<menu.length-1) { mt=d.layers[mnu].document.layers.eval("el"+(el -1)) x=atop+mt.clip.height if (!hlp[11]) x++ txt="<layer top="+(x-2)+" left="+menu[3]+" hei ght=1 bgcolor=#"+bgc+" width="+mt.clip.width+"></layer>" if (hlp[11]) {txt+="<layer top="+(x-1)+" left= "+menu[3]+" height=1 bgcolor=#"+hlp[12]+" width="+mt.clip.width+"></laye r>"} } } } else { bw=menu[b]; bc=hlp[4] bl=""; if(opera)bl="left:0;" if(opera&&bw==0){bw=2;bc=hlp[1]} if(b+1==menu.length)bw=0; if(bw>0) { if (!menu[10]) { if (hlp[11]&&bw==1) { txt="<div onmouseout=\"\" onmouseover=\"clear Timeout(timer)\" style=\"position:relative\">" txt+="<div style=\"border-top:1px solid #"+hl p[13]+"; background-color:#"+hlp[12]+"; width:100%;position:absolute;cl ip:rect(0 100% 2 0);height:1;"+bl+"\">" txt+="</div></div>" } else { txt="<div style=\"position:relative;\">" txt+="<div onmouseout=\"popdn()\" onmouseover =\"clearTimeout(timer)\" style=\"background-color:#"+bc+";width:"+(menu[2]-( menu[3]*2))+";position:absolute;" txt+="clip:rect(0 100% "+bw+" 0);height:"+bw+ ";"+bl+"\">" txt+="</div>" txt+="</div>" } } } } d.write(txt); omnu=mnu; mt="" } oatop=-1; if (ns4){mt="</layer>"}else{mt+="</div></div>"} d.write(mt) if (ns4) { ml = d.layers.eval(mnu) ml.clip.height += menu[3] ml3d = d.layers.eval(mnu).document.layers.eval(mn u+"3d") if (hlp[11])ml3d.clip.height=ml.clip.height } } function checs(e) { if(d.all){sy=d.body.scrollTop}else{sy=pageYOffset} if(opera){sy=pageYOffset} for(a=1;a<menus;a++) { menu=eval("menu"+a); if(menu[9]>0) { if (df!=0||osy!=sy) { mi=gmstyle("menu"+a); mit=parseInt(mi.top); if(isNaN(menu[0]))menu[0]=0; df=parseInt(menu[0])+sy-mit; nt=df/followspeed; of1=nt.toString(); ofr=of1.split("\.");

Page 50: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

48 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

if(ofr[1]+" "=="undefined ")ofr[1]=0; ofrac=ofrac+parseInt(ofr[1]); if(ofrac>10) { ofrac=ofrac-10; if(df>=0){nt++}else{nt--} } mi.top=mit+nt } osy=sy } } pu=setTimeout('checs()',followrate) } function setpos() { if(d.all){ww=d.body.clientWidth;wh=d.body.clientHe ight;}else{ww=window.innerWidth;wh=window.innerHeight;} if(opera){ww=window.innerWidth;wh=window.innerHeig ht;} for (a=1;a<menus;a++) { menu=eval("menu"+a); if(!menu[4])menu[4]=""; if (menu[4].indexOf("center")!=-1||menu[4].indexO f("right")!=-1) { mn=gmobj("menu"+a); mnw=ns6?parseInt(mn.style.width):d.all?mn.style. pixelWidth:mn.clip.width; if(opera)mnw=mn.style.pixelWidth; nlp=((ww-mnw)/2); if(menu[4].indexOf("right")!=-1)nlp=ww-mnw; if(ns4){mn.left=nlp}else{mn.style.left=nlp} } if (menu[4].indexOf("bottom")!=-1||menu[4].indexO f("middle")!=-1) { mn=gmobj("menu"+a); mnh=ns6?parseInt(mn.offsetHeight):d.all?mn.style .pixelHeight:mn.clip.height; nlp=wh-mnh-16; if(ns4)mnoh=mnh;else mnoh=mn.offsetHeight if(opera)mnoh=mn.style.pixelHeight; if(menu[4].indexOf("middle")!=-1)nlp=((wh-mnh)/2 )-mnoh/2 menu[0]=nlp; if(ns4){mn.top=nlp}else{mn.style.top=nlp} } } } function Minit() { el=0;osy=-1;df=-1; if ((d.all&&d.getElementById)&&!mac) document.writ e("<script>function getflta(ap){try{if(ap.filters){flta=1}}catch(e){}}< /script>"); for(x=1;x<menus;x++){menu=eval("menu"+x);if(menu[6 ]==1)popup(x)} for(a=1;a<menus;a++){fixb("menu"+a)} pu=setTimeout('checs()',followrate) sis();setpos(); if(ns4){window.onresize=function(){if(window.inner Width==ww&&window.innerHeight==wh)return;window.history.go(0);}}else{window.onresize=setpos} sy=1;checs(); function coc() { menu=eval(omnu) if(menu[13]!="form")closeallmenus() } if(ns4)d.onmousedown=coc;else d.onclick=coc if(mac&&d.all){d.write("<div style=\"position:abso lute;top:0;left:0\">")} frs=0 fre=0 } for(a=1;a<menus;a++){dmenu("menu"+a)} if(!ns61&ns6){window.onload=Minit}else{Minit();wind ow.onload=sis}

Page 51: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

49 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

C.2 Mmenu_array.js

// Description of the properties of the menu system timegap = 50; // submenu open interval followspeed = 10; // mouse-menu tracking followrate = 40; // subsequent menu item interva l suboffset_top = 0; suboffset_left = 0; effect = "fade(duration=0.0);Shadow(color='#CCCCCC' , Direction=100, Strength=0)"; function openwin(url) { nwin=window.open(url,"nwin",config="scrollbars=yes ,resizable=yes,toolbar=yes,location=yes,

status=yes,menubar=yes,"); nwin.focus(); } // prop1 is an array of properties. You can have as many property arrays as you need. prop1=[ "FFFFFF", // Off Font Color "7F8EB0", // Off Back Color "FF9966", // On Font Color "003366", // On Back Color "000000", // Border Color 11, // Font Size "normal", // Font Style "normal", // Font Weight "Verdana", // Font 3, // Padding "images/arrow.gif", // Sub Menu Image 0, // 3D Border & Separator "66ffff", // 3D High Color "000099", // 3D Low Color "ffffff", // Referer item Font Color (leave thi s blank to disable "7F8EB0" // Referer item Back Color (leave thi s blank to disable) ] // This is the array that contains your menu proper ties and details menu1=[ 75, // Top , // left 111, // Width 1, // Border Width "left", // Screen Position - here you can use "c enter;middle;right" prop1, // Properties Array - this is set higher up, as above 1, // Always Visible - allows the menu item to be visible at all time "center", // Alignment - sets the menu elements ali gnment, HTML values are valid here

for example: left, right or center , // Filter - Text variable for setting transitiona l effects on menu

activation , // Follow Scrolling - Tells the menu item to follow the user down the screen 1, // Horizontal Menu - Tells the menu to be horiz ontal instead of top to

bottom style , // Keep Alive - Keeps the menu visible until the user moves over another

menu or clicks elsewhere on the page , // Position of sub image left:center:right:m iddle:top:bottom , // Show an image on top menu bars indicating a sub menu exists below , // Reserved for future use // "Description Text", "URL", "Alternate URL", "Sta tus", "Separator Bar" "About FME","show-menu2","about.htm",,1, "News & Events","show-menu3",,,1, "Formal Methods","show-menu4","formal.htm",,1, "Organisations","show-menu5",,,1, "Positions","positions.jsp",,,1, "Contact us","contact.htm",,,1, "Sitemap","sitemap.htm",,,1 ]

Page 52: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

50 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

menu2=[ ,,130,1,"",prop1,,"left",effect,,,,,,, "Subgroups","subgroups.htm",,,0, "Projects","projects.htm",,,0, "Meetings","meetings.jsp",,,0, "Symposia","symposia.jsp",,,0, "Becoming a member","member.htm",,,0 ] menu3=[ ,,130,1,"",prop1,,"left",effect,,,,,,, "News","news.jsp",,,0, "Events","events.jsp",,,0 ] menu4=[ ,,130,1,"",prop1,,"left",effect,,,,,,, "Choosing","choosing.htm",,,0, "Methods","methods.htm",,,0, "Tools","tools.htm",,,0, "Applications","applications.htm",,,0, "FAQ's","faqs.htm",,,0, "Literature","literature.htm",,,0, "Journals","journals.htm",,,0, "Courses","courses.htm",,,0, "Links","links.htm",,,0 ] menu5=[ ,,130,1,,prop1,,"left",effect,0,,,,,, "Universities","universities.jsp",,,0, "Commercial","commercial.jsp",,,0, "Non-profit","nonprofit.jsp",,,0 ]

Page 53: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

51 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

Appendix D JSP documenten in verband met meetings

D.1 meetings.jsp

<html> <head> <title>About FME:: Meetings2</title> <%@ page contentType="text/html"%> <%@ page import="java.sql.*"%> <%! // Declaration of Connection, Statement and Result Set variables // which are going to be used during database conn ection and // data retrieval. String connectionURL = "jdbc:mysql://localhost:33 06/fme2"; Connection connection = null; Statement stat = null; ResultSet rs = null; ResultSet rsDate = null; static String composedRow(String subject, String u rl, String comment, String seperator){ String returnString=""; int whereURL; int whereSubject; while (url.indexOf(';')!=-1){ whereURL=url.indexOf(';'); whereSubject=subject.indexOf(';'); returnString=returnString+"<a href='"+url.substr ing(0,whereURL)+"'>"

+subject.substring(0,whereSubject)+"</a>"+seperato r; subject=subject.substring(whereSubject+1,subject .length()-1); url=url.substring(whereURL+1,url.length()-1); } if (comment==null) return returnString+"<a href='"+url+"'>"+subject +"</a>"; else return returnString+"<a href='"+url+"'>"+subject +"</a><br>"+comment; } static String composedRow(String subject, String u rl, String seperator){ if (subject.length()==0) return "&nbsp;"; String returnString=""; int whereURL; int whereSubject; while (url.indexOf(';')!=-1){ whereURL=url.indexOf(';'); whereSubject=subject.indexOf(';'); returnString=returnString+"<a href='"+url.substr ing(0,whereURL)+"'>"

+subject.substring(0,whereSubject)+"</a>"+seperato r; subject=subject.substring(whereSubject+1,subject .length()-1); url=url.substring(whereURL+1,url.length()-1); } return returnString+"<a href='"+url+"'>"+subject+ "</a>"; } static String printDate(String begin,String end){ if (end==null) return begin; else return begin.substring(0,begin.length()-5 ) + " - "+end; } static String rowBackcolor(int i){ if (i%2==0) return "<tr class='evenRow'>"; else return "<tr>"; } %> <% /* CONNECTING AND CREATING DATABASE STATEMENTS */ Class.forName("org.gjt.mm.mysql.Driver"); connection = DriverManager.getConnection(connecti onURL, "", ""); stat = connection.createStatement(); %> <!-- META-INFORMATION begin --> <meta http-equiv="Content-Type" content="text/html ; charset=iso-8859-1">

Page 54: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

52 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

<meta name="resource-type" content="document"> <meta name="revisit-after" content="10 days"> <meta name="classification" content="Computers"> <meta name="description" content="Formal Methods E urope (FME) is an organisation with the

mission of promoting and supporting the industrial use of formal methods for computer systems development. It is not allied to any single organisation or group of organisations. Its members come from different indu strial, academic, and government bodies.">

<meta name="keywords" content="formal, method, Eur ope, computer, system, development, support, promotion, industrial, government, academi c">

<meta name="robots" content="ALL"> <meta name="distribution" content="Global"> <meta name="copyright" content="(c) copyright 2002 Formal Methods Europe"> <meta name="language" content="english"> <meta name="doc-type" content="Public"> <meta name="doc-class" content="Completed"> <meta name="doc-rights" content="Public"> <!-- INCLUDED JAVASCRIPTS --> <SCRIPT type=text/javascript language=JavaScript s rc="newmenu_array.js"></SCRIPT> <SCRIPT type=text/javascript language=JavaScript s rc="mmenu.js"></SCRIPT> <SCRIPT type=text/javascript language=JavaScript s rc="printSubMenu.js"></SCRIPT> <!-- CASCADING STYLE SHEET REFERENCE --> <link rel=StyleSheet href="fme.css" type="text/css " media=screen> <style fprolloverstyle> A:hover {color: #FF6600; text-decoration:underlin e;} </style> </head> <body topmargin="0" leftmargin="0" marginwidth="0" marginheight="0" class="body"> <!---- FME BANNER + LOGO begin -------------------- ------------> <table border="0" width="100%" cellspacing="0" cel lpadding="0"> <tr> <td width="80%" height="75" align="left"><img border="0" src="images/banner.jpg"

width="500" height="75"></td> <td width="20%" height="75" align="right"><a h ref="index.htm"><img src="images/FME- LOGO%20copy.jpg" width="150" height="75" bo rder="0"></a></td> </tr> <tr> <td colspan="2" width="100%" height="21" bgcol or="#7F8EB0" style="border: 1 solid

#000000" class="plain">&nbsp;</td> </tr> <tr> <td width="100%" height="30" style="border-bot tom: 1 solid #000000" colspan="2">

<img border="0" src="images/blind.jpg" width="400" height="30"> </td>

</tr> </table> <!---- TEXT begin --------------------------------- ------------> <table border="0" width="100%" cellspacing="0" cel lpadding="0" style="font-family: Verdana;

font-size: 8 pt"> <tr> <td width="5%" valign="top" bgcolor="#003366" class="plain">&nbsp;</td> <td width="5%" valign="top" class="plain"><img src="images/subbanner3.gif" width="20"

height="20"></td> <td width="65%" valign="top" class="plain">&nb sp;</td> <td width="25%" valign="top" class="plain" row span="2"> <!---- SUBMENU begin ------------------------------ ---------------> <table width="100%" cellspacing="0" cellpaddi ng="0"> <tr> <td width="10%" height="20" class="plains ingle">&nbsp;</td> <td width="90%" height="20" class="plains ingle">&nbsp;</td> </tr> <tr> <td width="10%" height="20" class="plains ingle">&nbsp;</td> <td width="90%"> <script>printSubMenu("about FME")</scri pt> </td> </tr> </table> <!---- SUBMENU end -------------------------------- ---------------> </td> </tr>

Page 55: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

53 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

<tr> <td width="5%" class="plain" bgcolor="#003366" >&nbsp;</td> <td width="5%" class="plain">&nbsp;</td> <td width="65%"><img src="./images/sizer.gif" width="1" height="373" align="right"> <!---- INSERT CONTENTPANE HERE -------------------- ----------> <p class="plain">FME members usually meet thre e times a year, preferably at a &quot;reachable&quot; place somewhere in Europe s o that as many members can attend as possible. At the meetings ongoing matters are discussed as well as strategic matters regarding FME's future. The meetings are usually concluded with one or two technical presentations on formal methods.</p> <p class="plain">The following minutes of recent FME meetings are available on-line (all files are in PDF format):<br></p> <table border="1" bordercolor="#F2F2F2" width="10 0%" cellspacing="0" cellpadding="0"> <tr> <th width="20%" height="20">Date</th> <th width="30%" height="20">Meeting</th> <th width="20%" height="20">Material</th> <th width="10%" height="20">Photos</th> <th width="20%" height="20">Place</th> </tr> <% rs = stat.executeQuery("SELECT * FROM meeting"); stat=connection.createStatement(); rsDate = stat.executeQuery("SELECT date_format(be gindate,'%D %M %Y') as

bd,date_format(enddate,'%D %M %Y') as ed FROM meeti ng"); int counter=1; while(rs.next() && rsDate.next()){ out.println(" "+rowBackcolor(counter)); out.println(" <td height='40'>"

+printDate(rsDate.getString("bd"),rsDate.getString( "ed"))+"</td>"); out.print(" <td>");

out.println(composedRow(rs.getString("meeting"),rs .getString("meetingurl"),"<br>") +"</td>");

out.print(" <td>"); out.println(composedRow(rs.getString("material") ,rs.getString("materialurl"),"<br>")

+"</td>"); out.print(" <td><center>"); if (rs.getString("photosurl").length()>0) { out.print("<a href='"+rs.getString("photosurl ")+"'>

<img src='./images/checked.gif' border='0'></a>"); }

else { out.print("<img src=./images/unchecked.gif>") ;

} out.println("</center></td>"); out.println(" <td>"+rs.getString("place")+"< /td>"); out.println(" </tr>"); counter++; } //End of while rs.close(); rsDate.close(); stat.close(); connection.close(); %> </table> <!---- CONTENTPANE ENDS HERE ---------------------- ----------> </td> </tr> <!---- TEXT end ----------------------------------- ------------> <!---- COPYRIGHT begin ---------------------------- ------------> <tr> <td width="5%" valign="top" bgcolor="#003366" align="center">&nbsp;</td> <td width="5%"><img border="0" src="images/sub banner4.gif" width="20" height="20"></td> <td width="65%" valign="top"> <td width="25%" valign="top"></td> <tr> <td width="100%" valign="middle" align="left" colspan="4" height="20"

style="border-top: 1 solid #000000"><img border= "0" src="images/blind.jpg" width="400" height="30"></td>

<tr> <td width="100%" valign="middle" bgcolor="#003 366" align="center" colspan="4"

height="20">

Page 56: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

54 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

<p class="copyright">© copyright 2002 | Formal Methods Europe</p> </td> </tr> </table> <!---- COPYRIGHT end ------------------------------ ------------> </body> </html>

Page 57: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

55 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

D.2 Q-meetings

<html> <head> <title>FME :: Search the meetings</title> <%@ page contentType="text/html"%> <%@ page import="java.sql.*"%> <%! String connectionURL = "jdbc:mysql://localhost:330 6/fme2"; Connection connection = null; Statement stat = null; ResultSet rs = null; ResultSet rs2=null; String createClause; String orderBy; int counter; static String buildClause(String field, String con tent){ if (content.length()>0) { if (content.indexOf('+')!=-1) return composedTe rm(field, content)+" AND"; else return " "+field+"='"+content+"' AND"; } else return ""; } static String buildDateClause(String field, String content, String order){ if (content.length()==10) return " ("+field+order+"'"+content+"') AND"; else return ""; } static String composedTerm(String field, String co ntent){ int position; String returnString=" ("; while (content.indexOf('+')!=-1) { position=content.indexOf('+'); returnString=returnString+" "+field +"='"+conten t.substring(0,position)+"' OR"; content=content.substring(position+1,content.len gth()); } return returnString+" "+field+"='"+content+"')"; } static String rowBackcolor(int i){ if (i%2==0) return "<tr class='evenRow'>"; else return "<tr>"; } static String printDate(String date){ if (date!=null) return date; else return "&nbsp;"; } static String composedRow(String subject, String u rl, String comment){ String returnString=""; int whereURL; int whereSubject; while (url.indexOf(';')!=-1){ whereURL=url.indexOf(';'); whereSubject=subject.indexOf(';'); returnString=returnString+"<a href='"+url.substr ing(0,whereURL)+"'>"

+subject.substring(0,whereSubject)+"</a><br> "; subject=subject.substring(whereSubject+1,subject .length()-1); url=url.substring(whereURL+1,url.length()-1); } if (comment==null) return returnString+"<a href='"+url+"'>"+subject +"</a>"; else return returnString+"<a href='"+url+"'>"+subject +"</a><br>"+comment; } %> <% Class.forName("org.gjt.mm.mysql.Driver"); connection = DriverManager.getConnection(connectio nURL, "", ""); stat = connection.createStatement(); %> <link rel=StyleSheet href="fme.css" type="text/css " media=screen> </head> <body> <center>

Page 58: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

56 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

<table> <tr width="700" height="80"> <td> </td> </tr> <tr valign="top"> <td width="700"> <form> <input type="hidden" name="hiddenOne" VALUE="some Value" > <center><table width="500" border="1" cellspac ing="0" cellpadding="0"

bordercolor="#F2F2F2"> <tr> <th colspan="2" height="30">Perform a query o n the meetings-database</th> <th>Sort<br><img src="./images/up.gif">&nbsp;& nbsp;

<img src="./images/down.gif"></th> </tr> <tr> <td class="evenRow">Begins on</td> <td><select name="begindateOrder"><option><</o ption><option>=</option> <option selected>></option></select> <input type="text" name="begindate" size="24"> </td> <td><center><input type="radio" value="beginda teA" name="order">

<input type="radio" value="enddateD" name="order "></center></td> </tr> <tr> <td class="evenRow">Ends on</td> <td><select name="enddateOrder"><option><</opt ion><option>=</option> <option selected>></option></select> <input type="text" name="enddate" size="24"></ td> <td><center><input type="radio" value="enddate A" name="order">

<input type="radio" value="enddateD" name="order "></center></td> </tr> <tr> <td class="evenRow">Meeting</td> <td><input type="text" name="meeting" size="30 "></td> <td><center><input type="radio" value="meeting A" name="order">

<input type="radio" value="meetingD" name="order">< /center></td> </tr> <tr> <td class='evenRow'">Location</td> <td><input type="text" name="place" size="30"> </td> <td><center><input type="radio" value="placeA" name="order">

<input type="radio" value="placeD" name="order"></c enter></td> </tr> <tr> <td colspan="3"><p><br>&nbsp;<b>Some remarks</ b><br><br> &nbsp;&nbsp;<img src="./images/cube.gif">&nbsp; &nbsp;A + indicates the joining of

arguments by an OR-statement.<br> &nbsp;&nbsp;<img src="./images/cube.gif">&nbsp;&nbs p;The dateformatting is YYYY-MM-DD. Example:<i> 2002-05-20 is 20th may 2002.</i>

</p> <center><INPUT TYPE=SUBMIT VALUE="Query">&nbsp;<INP UT TYPE=RESET VALUE="Reset"> </center><br>

</td> </tr> </table></center> </form> <br><br> <% if(request.getParameter("hiddenOne")!=null) { createClause="WHERE "; createClause=createClause+buildClause("meeting",r equest.getParameter("meeting")); createClause=createClause+buildClause("place",req uest.getParameter("place"));

createClause=createClause+buildDateClause("beginda te",request.getParameter("begindate"),

request.getParameter("begindateOrder"));

createClause=createClause+buildDateClause("enddate" ,request.getParameter("enddate"), request.getParameter("enddateOrder"));

if (createClause.length()<7) createClause=""; else createClause=createClause.substring(0, createClause.length()-3); if(request.getParameter("order")!=null) { createClause=createClause+" ORDER BY "; orderBy=request.getParameter("order");

Page 59: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

57 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

createClause=createClause+" "+orderBy.substring( 0,orderBy.length()-1); if (orderBy.charAt(orderBy.length()-1)=='A') cre ateClause=createClause+ " ASC"; else createClause=createClause+ " DESC" ; } rs = stat.executeQuery("SELECT * FROM meeting "+c reateClause); stat = connection.createStatement(); stat = connection.createStatement(); rs2=stat.executeQuery("SELECT date_format(beginda te,'%D %M %Y') as

begindate,date_format(enddate,'%D %M %Y') as endda te FROM meeting "+createClause); } %> </td></tr> </table> </center> <% if(request.getParameter("hiddenOne")!=null) { counter=1; out.println("<center><table border='1' bordercolo r='F2F2F2' cellspacing='0'

cellpadding='0' width='780'>"); out.println(" <tr><th colspan='7' height='50'>T he results of your query</th></tr>"); out.println(" <tr>"); out.println(" <th height='20' width='30'>&nbsp;< /th>"); out.println(" <th height='20' width='120'>Begins on</th>"); out.println(" <th height='20' width='120'>Ends o n</th>"); out.println(" <th height='20'>Meeting</th>"); out.println(" <th height='20'>Place</th>"); out.println(" <th height='20'>Material</th>"); out.println(" <th height='20'>Photos</th>"); out.println(" </tr>"); while(rs.next() && rs2.next()) { out.println(" "+rowBackcolor(counter)); out.println(" <td height='40'><center>"+counter +"</center></td>"); out.println(" <td height='40' width='120'>"+

printDate(rs2.getString("begindate"))+"</td>"); out.println(" <td height='40' width='120'>"+

printDate(rs2.getString("enddate"))+"</td>"); out.print(" <td height='40'>");

out.println(composedRow(rs.getString("meeting"),r s.getString("meetingurl"),null) +"</td>");

out.println(" <td height='40'>"+rs.getString("p lace")+"</td>"); out.print(" <td height='40'>");

out.println(composedRow(rs.getString("material"),r s.getString("materialurl"),null)

+"</td>"); out.println(" <td height='40'><center>"); if (rs.getString("photosurl").length()>0) out.print("<a href='"+rs.getString("photosurl") +"'><img

src='./images/checked.gif'></a>"); else out.print("<img src='./images/unchecked.gif'>") ; out.println("</center></td>"); out.println(" </tr>"); counter++; } //End of while out.println(" <tr><th colspan='7' height='40'>T he query yielded "+(counter-1)

+" hits</th></tr>"); out.println("</table></center>"); orderBy=createClause=""; rs2.close(); rs.close(); stat.close(); connection.close(); } %> </body> </html>

Page 60: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

58 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

D.3 insertDB.jsp

<%@page contentType="text/html"%> <%@ page import="java.sql.*"%> <html> <head> <title>Update interface</title> <% if(session.getAttribute("firstRun").equals("")) { String connectionURL = "jdbc:mysql://localhost:3 306/fme2"; Connection connection = null; Statement stat = null; ResultSet rs = null; /* CONNECTING AND CREATING DATABASE STATEMENTS */ Class.forName("org.gjt.mm.mysql.Driver"); connection = DriverManager.getConnection(connecti onURL, "", ""); stat = connection.createStatement(); session.setAttribute("username", request.getParam eter("username")); session.setAttribute("password", request.getPara meter("password")); session.setAttribute("allowed","no"); rs = stat.executeQuery("SELECT * FROM access WHER E password='"

+session.getAttribute("password")+"' AND username ='" +session.getAttribute("username")+"'");

while(rs.next()) { session.setAttribute("accessLevel",rs.getString ("level")); session.setAttribute("allowed","yes"); } session.setAttribute("firstRun","alreadyUsed"); } %> <meta http-equiv="Content-Type" content="text/html ; charset=iso-8859-1"> <link rel=StyleSheet href="fme.css" type="text/css " media=screen> <style fprolloverstyle> A:hover {color: #FF6600; text-decoration:underlin e;} </style> </head> <body bgcolor="#FFFFFF" text="#000000"> <% if(session.getAttribute("allowed").equals("yes")) { int i=6; int accessLevel=Integer.parseInt((String)session. getAttribute("accessLevel")); String [] dataBases={"Events","Meetings","News"," Organisations","Positions","Symposia",

"Access"}; String [] codex={"Gandalf","Aragorn","Anfaulgir", "Sauron","Isildur","Beren","Saruman"};

out.println("<table border='0'><tr><td>"); out.println("<tr><td valign='top'>"); out.println("<table width='250' border='1' border color='#F2F2F2' cellspacing='0'

cellpadding='0'>"); out.print(" <tr><th height='40'>"); out.println("Access granted to</th></tr>"); while(i>=0) { if(accessLevel>=(int)Math.pow(2,i)) { out.print(" <tr><td height='40'>"); out.print("&nbsp;&nbsp;<img src='./images/arrow .gif'>&nbsp;"); out.print("<a href='insertDB.jsp?selector="+cod ex[i]+"&subject="+dataBases[i]+"'>"

+dataBases[i]+"</a>"); out.println("</td></tr>"); accessLevel=accessLevel-(int)Math.pow(2,i); } i--; } out.println("</table>"); out.println("</td><td width='20'></td><td valign='t op'>"); if(request.getParameter("selector")!=null){ if (request.getParameter("selector").equals(codex [6])) { … } if (request.getParameter("selector").equals(codex [5])) { … } if (request.getParameter("selector").equals(codex [4])) { …

Page 61: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

59 Appendices

De ontwikkeling van een nieuwe website Formal Methods Europe

} if (request.getParameter("selector").equals(codex [3])) { …

} if (request.getParameter("selector").equals(codex [2])) { out.println("<form>"); out.println("<table width='450' border='1' borde rcolor='#F2F2F2' cellspacing='0'

cellpadding='5'>"); out.println(" <tr><th colspan='2' height='40'>Fi ll in these fields to update the "+

request.getParameter("subject")+" database</th></tr >"); out.println(" <tr><td width='120' height='40' cl ass='evenrow'>Date**</td>"); out.println(" <td>&nbsp;<input type='text' name= 'date' size='40'</tr>"); out.println(" <tr><td width='120' height='40' cl ass='evenrow'>News</td>"); out.println(" <td>&nbsp;<textarea name='meeting' cols='30' rows='5'></textarea>

</tr>"); out.println(" <tr><td width='120' height='40' cl ass='evenrow'>News URL</td>"); out.println(" <td>&nbsp;<input type='text' name= 'url' size='40'</tr>"); } if (request.getParameter("selector").equals(codex [1])) { … } if (request.getParameter("selector").equals(codex [0])) { … } out.println(" <tr><td colspan='2' class='evenrow' ><b>Some remarks</b><br><br>");

out.println(" <ul><li>A <b>*</b> means that you ca n insert multiple fields seperated by a<b>;</b> in the appropriate fields.");

out.println(" <li> A <b>**</b> means you must appl y the date formatting (YYYY-MM-DD). </ul><br>");

out.println(" <br><center><INPUT TYPE=SUBMIT VALUE ='Update'>&nbsp;&nbsp;<INPUT TYPE=RESET VALUE='Reset'></center><br></td></tr>");

out.println("</table>"); out.println("</form>");

} //null out.println("</td></tr></table>"); //maintable } //upper %> </body> </html>

Page 62: HOOFDSTUK 1 INLEIDING 1lib.ugent.be › fulltxt › RUG01 › 000 › 728 › 096 › RUG01... · Inhoudstabel De ontwikkeling van een nieuwe website Formal Methods Europe 3.4 Gedetailleerde

60 Referenties

De ontwikkeling van een nieuwe website Formal Methods Europe

H o o f d s t u k 5 RE F E R E N T I E S

[1] Want to learn to design effective, attractive websites? http://www.moonlake.net/clinic/.

[2] The HTML 4.0 specification. http://www.w3.org/TR/REC-html40/.

[3] Index DOT HTML. http://www.blooberry.com/indexdot/html/.

[4] The ZDNet Developer Tag Library. http://www.zdnet.com/devhead/resources/tag_library/.

[5] The Cascading Style Sheets, level 1 specification (CSS1). http://www.w3.org/TR/REC-CSS1/.

[6] An Introduction to Cascading Style Sheets (CSS). http://www.webmasterbase.com/article/43/.

[7] Web Review's Style Sheets Reference Guide. http://webreview.com/guides/style/style.html.

[8] D. GOODMAN. JavaScript Bible. IDG Books, 1998.

[9] D. FLANAGAN. JavaScript: The Definitive Guide. O'Reilly & Associates, 3rd Edition June, 1998 .

[10] Slapping together a JSP environment. http://www.devshed.com/Server_Side/Java/JSPDev/page1.html.

[11] Java Server Pages. http://java.sun.com/products/jsp/.

[12] MySQL documentation. http://www.mysql.com/documentation/index.html.

[13] MM Mysql Drivers - Getting started with JDBC. http://www.jlab.org/~kowalski/java/mmJDBC/.