Java Server Faces: flexibele standaard

Vergelijkbare documenten
Acht stappen voor JSF

Dynamische webapplicaties in Java

Applicatie-Architecturen

Applicatie-Architecturen

Inhoudsopgave. Hoofdstuk 1.Inleiding...3

INFITT01 - Internettechnologie WEEK 8

JavaServer Faces 2.1

User interface ontkoppeling

4 ASP.NET MVC. 4.1 Controllers

Technisch Ontwerp W e b s i t e W O S I

DrICTVoip.dll v 2.1 Informatie en handleiding

Gebruik van cryptografie voor veilige jquery/rest webapplicaties. Frans van Buul Inter Access

TaskCentre Web Service Connector: Creëren van requests in Synergy Enterprise

Zelftest Java EE Architectuur

F r a m e w o r k s. LinkWorks

Session Beans.

Een ASP.NET applicatie opzetten. Beginsituatie:

Het reclyclen van Oracle Forms

Knowledgeable Referenceable Personable Accountable Scalable

Proware Cloud Webbuilder Versie 2.30

JSF webapplicatie performance

Eigen Widgets in CRM. Introductie. Limitering. Widgets beschikbaar stellen. Tips & Tricks Eigen Widgets in CRM

public Bier ( string N, double P, Brouwerij B) { Naam = N; AlcoholPerc = P; Brouwer = B;

1. Milieuklacht Handleiding opladen XML in mkros Werken met Refertes... 5

Open SQL Server Management Studio en log in als Administator. Je ziet dan wat je in figuur 2.1 ziet.

INHOUDSOPGAVE Het Boekenwinkeltje Registreer.aspx Opgaven... 97

Met een LightSwitch applicatie een OData service uit de Windows Azure Marketplace consumeren

ECTS fiche. Module info. Evaluatie. Gespreide evaluatie OPLEIDING. Handelswetenschappen en bedrijfskunde HBO Informatica

i ll take off to the cloud

Technisch ontwerp. Projectteam 6. Project "Web Essentials" 02 april Versie 2.1.0

Zelftest Java concepten

Kleine cursus PHP5. Auteur: Raymond Moesker

Copyright IBS Nieuwbouw. Vereenvoudigd en versnelt Java ontwikkeling. Huub Cleutjens

Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel:

Object Oriented Programming

Inhoud eindtoets. Eindtoets. Introductie 2. Opgaven 3. Terugkoppeling 9

MVC BASICS 2. Kevin Picalausa

INFITT01 Internettechnologie WEEK 2

Handleiding RS Form! 1.0.4

Angular Best Practices Door Alex en Chris van Beek

J2EE/.NET en de rol Applicatie Architectuur

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is

Formulieren maken met Dreamweaver CS 4/CS 5

ArcGIS Mobile ADF. Smart Client Applicaties voor ArcGIS Server Eva Dienske, Wim Ligtendag

Selenium IDE Webdriver. Introductie

Een website maken met databasetoegang.

Implementatie AssurePay ASP.NET. ideal

Lab Webdesign: Javascript 7 april 2008

Katholieke Hogeschool Kempen ASP

Is APEX a worthy substitute for Oracle Forms?

Programming Content Management Server 2002

Werken op afstand via internet

Oracle Application Server Portal Oracle Gebruikersgroep Holland Oktober 2003

Datum: Gemaakt door: Berend de Groot Voor: ComSi, ROC Friese Poort

SMART-Microsoft Software Factory

De architect: in spagaat tussen mensen en technische details. Illustratie met een simpel voorbeeld

Verslag. Projectteam: 107 Datum: 16 oktober 2008 Project leden: Lennard Fonteijn Harish Marhe Nicoletta Saba Turgay Saruhan Robin Tummers

Workflows voor SharePoint met forms en data K2 VOOR SHAREPOINT

INSTALLATIE EXCHANGE CONNECTOR

File Uploads met standaard ASP.NET

Installatiehandleiding CORFU. Cak Online Registratie FUnctionaliteit

JHeadstart 10g: J2EE webapp development

Tutorial 1, Delphi: Geldspraak

Onderzoek Templating en i18n

Kennis na het volgen van de training. Na het volgen van deze training bent u in staat:

Ondersteuning van zorg gerelateerde processen en activiteiten voor patiënt en zorgverstrekkers

Capita Selecta Design Patterns voor administratieve applicaties

Coligo conne ct. Gebruikershandleiding

Siemens workpoints en DHCP options

Software Factories. Toepassing van Domain Specific Languages. achtergrond

Chris de Kok TDI 3. Vak: Software Architectuur Datum: Docent: Fons van Kesteren

Sparse columns in SQL server 2008

Fun met webparts in ASP.Net

Java op het Oracle 9i platform

Programmeren in C ++ met wxwidgets les 5

Documentatie. InstantModules Q42. Versie 1.1

AFO 142 Titel Aanwinsten Geschiedenis

Security web services

Formulieren en waarden posten naar een view

Handleiding Coligo Connect installatie en gebruik

Les 9: formulier controle met javascript.

Dynamiek met VO-Script

Tentamen Object Georiënteerd Programmeren TI januari 2013, Afdeling SCT, Faculteit EWI, TU Delft

Naam project Lost And Found Animals Lokaal gehost Percentage van het totaal geleverde werk 1 Cindy Jansen 50% 2 Eline Steyvers 50%

Portals & Open Source

Technisch Ontwerp VISSIM-PPA Koppeling

Hieronder volgt een overzicht van relevante contactpersonen binnen KPN Telecom.

APEX vs OutSystems, een vergelijking door een gebruiker

Aquo Domeintabellen Services (Aquo DS) Handleiding Webservice

What is the advantage of using expression language instead of JSP scriptlets and JSP expressions?

Delft-FEWS & Web Services

In gesprek met externe toepassingen

AFO 139 Automatische export

HTTPS. HTTP over SLL Publieke sleutel certificaat Getekend door betrouwbare bron In transport laag

De plug-in is heel eenvoudig te installeren met een setup-programma. Waarna je een aantal menu opties in het tools menu er bij krijgt.

Software Requirements Specification

Transcriptie:

Sinds dit voorjaar is er een nieuwe standaard, Java Server Faces (JSF), voor het ontwikkelen van Java webapplicaties. JSF heeft als fundamenten de aloude servlet en JSP specificaties en biedt een Web Applicatie Framework gebaseerd op het Model View Controller (MVC) design pattern. In dit artikel gaat Willem Koppenol in op de onderdelen en opbouw van een JSF applicatie, aan de hand van een simpele login applicatie. thema Java Server Faces: flexibele standaard Introductie event driven programmeer model Met JSF heeft de webontwikkelaar de beschikking over onder meer een reeks standaardcomponenten, een uitbreidbaar componenten model, tag library s voor interactie met JSP, navigatie-ondersteuning, validatieen conversiecomponenten, gestandaardiseerde foutafhandeling en ingebouwde ondersteuning voor internationalisatie. De belangrijkste innovatie is echter dat met JSF het event driven programmeer model, zoals dat bekend is van tools als Visual Basic en Delphi, in de Java webapplicatie-wereld wordt geïntroduceerd. JSF is daarmee een antwoord op Microsoft s ASP.NET dat dit programmeermodel al eerder voor.net webapplicaties introduceerde. Een andere belangrijke inspiratiebron van JSF is het open source Struts Framework, waarvan het navigatiemodel in grote lijnen door JSF is overgenomen. MODEL VIEW CONTROLLER JSF is gebaseerd op de Model View Controller (MVC) architectuur. De Controller is bij JSF een centraal FacesServlet dat de navigatie beslissingen in de webapplicatie neemt. Alle requests in een JSF applicatie lopen via dit centrale FacesServlet. De navigatieregels zijn vastgelegd in het faces.config.xml bestand dat door het FacesServlet wordt gelezen. Het centrale FacesServlet delegeert volgens de MVC architectuur het uitvoeren van business-logica en het benaderen van data aan de Model componenten (Java beans). De output naar de client browser wordt gedelegeerd aan de View componenten (JSP pagina s). Een JSF applicatie heeft dezelfde structuur als een standaard Java Web Applicatie. Een centrale plaats wordt ingenomen door de deployment descriptor web.xml in de WEB_INF directory. Deze wordt bij het opstarten door de Web Server gelezen en bevat declaraties van servlets die geactiveerd moeten worden en initialisatie bestanden die moeten worden gelezen. Bij onze login applicatie staat in web.xml: <servlet> <servlet-name>faces Servlet</servlet-name> <servletclass>javax.faces.webapp.facesservlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> F IGUUR Initial JSP Page JSP response submit 1. JSF Overview FACES SERVLET faces-config.xml JSP response Event listener Backing Bean events» Software Release Magazine 4» Java Magazine 2» juli 2004 5

Adv. Compuware

F IGUUR 2. Login scherm Het servlet-mapping element geeft aan dat alle requests met het URL patroon /faces/ door het FacesServlet worden afgehandeld. UI COMPONENTEN Een belangrijk onderdeel van JSF is het User Interface (UI) Component Framework. Deze UI componenten leven op de server, worden getoond aan de client en kunnen hun toestand tussen client requests in vasthouden. Onder de standaard UI componenten bevinden zich oude bekenden die overeenkomen met HTML tags, zoals labels, tekst velden, hyperlinks, buttons en list boxen. Maar er zijn ook geavanceerdere componenten waarmee bijvoorbeeld data binding mogelijk is of die foutmeldingen ophalen en tonen. In onze login applicatie hebben we een startpagina met labels, knoppen, een tekst en een password veld. Niet zichtbaar is een message component waarin eventuele foutmeldingen worden getoond. De Info knop toont de gebruiker de geldige username en password combinatie en met de login knop wordt daadwerkelijk ingelogd. TAG LIBRARIES De UI componenten worden in JSP pagina s gerepresenteerd door JSF custom tags. JSF kent een tweetal custom tag libraries. De component tag library definieert de tags die de UI componenten representeren. De core tag library definieert tags die het mogelijk maken events te registreren, en validators en converters aan componenten te koppelen. De custom tags komen door de volgende directives in een JSP pagina beschikbaar: <%@ taglib uri= http://java.sun.com/jsf/html prefix= h %> <%@ taglib uri= http://java.sun.com/jsf/core prefix= f %> Met opname van deze taglib directives ziet de achterliggende JSP code met JSF tags van onze login pagina er als volgt uit: <f:view> <h:form binding= #{UserBean.form1 id= form1 > <h:outputtext binding= #{UserBean.titLbl id= titlbl value= JSF Demo /> <h:outputtext binding= #{UserBean.usLabel id= uslabel value= Username /> <h:outputtext binding= #{UserBean.pwLabel id= pwlabel value= Password /> <h:inputtext binding= #{UserBean.userName id= username required= true /> action= #{UserBean.login_action binding= #{UserBean.loginButton id= loginbutton value= Login /> action= #{UserBean.info_action binding= #{UserBean.infoButton id= infobutton value= Info /> <h:inputsecret binding= #{UserBean.passWord id= password validator= #{UserBean.length- Validator1.validate /> <h:messages binding= #{UserBean.mList1 id= mlist1 showdetail= true /> </h:form> </f:view> BACKING BEANS Wat opvalt aan bovenstaande code zijn de binding attributen van de verschillende UI componenten. De expressie #{UserBean.userName is Java Expression Language (EL) die het gelijknamige tekst veld koppelt aan de username property van de bean UserBean. Hierdoor worden de gegevens in de invoervelden op het scherm automatisch gesynchroniseerd met de property s van een UserBean op de server. Deze beans worden daarom backing beans genoemd. Na een geslaagde login bevat de bean de username en password combinatie. Bij fouten worden reeds ingevulde data vanuit de bean opnieuw op de pagina gezet. Voor ontwikkelaars die bekend zijn met Struts zal dit bekend voorkomen want het lijkt erg op de functionaliteit van ActionForm classes. Overigens kan de koppeling behalve met het binding attribuut ook met het value attribuut worden gelegd. In dat geval is er geen koppeling met de UI Component maar alleen met de waarde in de UI Component. Een gedeelte van de code van de login bean ziet er als volgt uit: public class UserBean extends AbstractPageBean { private HtmlInputText username = new HtmlInputText(); public HtmlInputText getusername() {» Software Release Magazine 4» Java Magazine 2» juli 2004 7

return username; public void setusername(htmlinputtext hit) { this.username = hit; private HtmlInputSecret password = new HtmlInputSecret(); public HtmlInputSecret getpassword() { return password; public void setpassword(htmlinputsecret his) { this.password = his; Het is in JSF niet perse noodzakelijk om één bean te gebruiken voor iedere UI pagina. Een pagina kan ook worden gekoppeld aan meer dan één bean. Verder introduceert JSF het concept van de managed beans. Deze beans worden in het centrale configuratie bestand, faces-config.xml, gedeclareerd. Ze worden dan automatisch gecreëerd als ze de eerste keer worden benaderd. Creatie door middel van Java code of JSP tags is niet nodig. De scope van de managed beans kan ook worden aangegeven in faces-config.xml en varieert tussen request, session of applicatie: processaction methode. Het ValueChanged event gaat af als de gebruiker de waarde van UIInput component of één van de daarvan afgeleide classes wijzigt, zoals invoervelden, check en list boxen. De abonnees op deze events implementeren het ValueChangeListener interface met de processvaluechange methode. Beide methodes krijgen het event object als parameter mee om eventuele nadere gegevens uit te lezen. Een applicatie kan op een tweetal manieren reageren op gegenereerde events. Ofwel de listener class wordt bij de UI Component geregistreerd door een valuechangedlistener tag of een actionlistener tag op te nemen onder de UI Component tag. Ofwel een methode uit de backing bean wordt door een binding expressie gekoppeld aan het juiste attribuut, i.e. action, van de UI Component tag. Dit laatste is het geval bij de Login en Info buttons in de login pagina en ziet dit er als volgt uit : action= #{UserBean.login_action binding= #{UserBean.loginButton id= loginbutton value= Login /> action= #{UserBean.info_action binding= #{UserBean.infoButton id= infobutton value= Info /> <managed-bean> <managed-bean-name>userbean</managed-beanname> <managed-beanclass>jsfdemo.userbean</managed-bean-class> <managed-bean-scope>session</managed-beanscope> </managed-bean> De implementatie van de info_action event functie in de backing bean toont een nieuwe webpagina met de benodigde login informatie. De login_action event functie controleert de login gegevens en toont dan ofwel een welkomst scherm met de gebruikers naam of een hernieuwd login scherm met een foutmelding: EVENTS De belangrijkste innovatie van JSF is het event driven programmeer model. Het drukken op een knop in een JSF webpagina kan eenvoudig gekoppeld worden aan het uitvoeren van een functie in een backing bean op de server. Het gehanteerde event model is het standaard Java publish en subcribe event model. UI componenten genereren events na activering door de gebruiker. Deze events worden opgevangen door event listeners die zich bij de UI Componenten op de events hebben geabonneerd. JSF onderscheidt een tweetal standaard events. Het ActionEvent gaat af als UI componenten die het ActionSource interface implementeren, zoals buttons en hyperlinks, worden geactiveerd. Abonnees implementeren het ActionListener interface met de public java.lang.string login_action() { // Add your event code here... String uname = (String)userName.get- Value(); String pword = (String)passWord.get- Value(); if ( uname.equals( JSFNovice ) && pword.equals( JSF )) { return success ; else { FacesContext context = FacesContext.getCurrentInstance(); FacesMessage message = new FacesMessage( Invalid Username and/or Password ); context.addmessage( form1, message); return failure ; 8» Java Magazine 2» juli 2004» Software Release Magazine 4

public java.lang.string info_action() { return info ; F IGUUR 3. Webpagina na klikken op de Info button NAVIGATIE REGELS JSF biedt ook faciliteiten voor het vastleggen van de navigatie structuur van webapplicaties. De navigatie regels worden gedefinieerd in FACES-CONFIG. XML en koppelen strings aan URL s. Het FACES-CONFIG. XML bestand vormt het hart van iedere JSF applicatie en wordt door het FacesServlet bij het opstarten gelezen. Het bevat naast de definitie van de navigatieregels zoals we zagen ook de declaratie van de Managed Beans. Het FacesServlet gebruikt de navigatieregels om te bepalen wat er moet gebeuren als bepaalde acties plaatsvinden. Een voordeel van het vastleggen van de navigatie structuur in een centraal extern bestand is, dat het wijzigen van de navigatie eenvoudiger wordt. De navigatiestructuur kan in verschillende tools ook grafisch worden vastgelegd. Het faces-config.xml bestand lijkt sterk op het strutsconfig.xml bestand uit Struts en is daar zeker door geïnspireerd. In onze login applicatie retourneert de login_action afhankelijk van de username en password combinatie success of failure. Het faces-config.xml bestand geeft dan aan welke pagina vervolgens zal verschijnen: <faces-config> <navigation-rule> <from-view-id>/info.jsp</from-view-id> <to-view-id>/userbean.jsp</to-viewid> <from-outcome>return</from-outcome> </navigation-rule> <navigation-rule> <from-view-id>/userbean.jsp</from-viewid> <to-view-id>/welcome.jsp</to-viewid> <from-outcome>success</from-outcome> <to-view-id>/info.jsp</to-view-id> <from-outcome>info</from-outcome> <to-view-id>/userbean.jsp</to-viewid> <from-outcome>failure</from-outcome> </navigation-rule> </faces-config> VALIDATORS Een veel voorkomende en vaak tijdrovende taak in webapplicaties is het valideren van ingevoerde gegevens. Dit is vaak noodzakelijk, omdat het problemen voorkomt bij de verdere verwerking van de gegevens. Voor deze taak biedt JSF ondersteuning in de vorm van een reeks standaard-validatiecomponenten. Ontwikkelaars kunnen hiermee veel tijd besparen. De validatiecomponenten worden gekoppeld aan invoervelden en zorgen dat de invoer binnen bepaalde grenzen blijft. De LengthValidator beperkt bijvoorbeeld het maximaal in te voeren aantal karakters en de LongeRangeValidator en DoubleRangeValidator zorgen dat ingevoerde getallen binnen bepaalde grenzen blijven. De validatiecomponenten genereren in geval van ongeldige invoer een fout. Het FacesServlet zal vervolgens de oorspronkelijk pagina opnieuw tonen met zo mogelijk de foutmelding in een Message component. Bij de login applicatie is een LengthValidator op de volgende manier gekoppeld aan het invoerveld voor het password : <h:inputsecret binding= #{UserBean.passWord id= password validator= #{UserBean.lengthValidator1.validate /> success UserBean.jsp info Welcome.jsp info.jsp failure F IGUUR 4. Grafische voorstelling van de navigatiestructuur in de login applicatie return» Software Release Magazine 4» Java Magazine 2» juli 2004 9

Validatie met validatiecomponenten vindt plaats op de server. Desgewenst kan ook gevalideerd worden met Javascript op de client. De UI Componenten hebben daartoe property s die aan Javascript event functions kunnen worden toegekend. Overigens is het model voor validatiecomponenten in JSF precies gespecificeerd en het is dan ook mogelijk om je eigen validatiecomponenten te schrijven. Al wat dient te gebeuren is een implementatie te verzorgen van het Validator interface met de validate methode: public class PasswordValidator implements Validator { public void validate(facescontext context, UIComponent component, Object tovalidate) { Naar verwachting zullen IDE s die JSF implementeren weldra met meer geavanceerdere validatie componenten op de markt verschijnen. Met name een reguliere expressievalidator, zoals ook aanwezig in ASP.NET, zou erg handig zijn. beans kunnen de FacesContext benaderen en er foutmeldingen als FacesMessages aan toevoegen. Het resultaat - een verkeerde login - is te zien in Figuur 5. De foutboodschap is in de login_action functie gegenereerd. INTERNATIONALISATIE JSF ondersteunt de internationalisatie van alle meldingen in de applicatie door ze te definiëren in ResourceBundles. Een ResourceBundle bevat een reeks gelokaliseerde meldingen en wordt opgeslagen in een bestand met de extensie.properties. Voor de login applicatie heet dit bestand bijvoorbeeld LoginMessages.properties en bevat id s van meldingen en de vertaling daarvan in de oorspronkelijke taal: username_label=username password_label=password login_button=login Om de meldingen in de ResourceBundle te kunnen gebruiken refereert een webpagina met JSF tags met een loadbundle tag aan de ResourceBundle: ERROR HANDLING De UIMessage en UIMessages componenten worden in JSF gebruikt voor het tonen van foutmeldingen. Ze worden op een webpagina geplaatst door respectievelijk de <message> en de <messages> tags. Op de plek van de <messages> tag worden alle foutmeldingen getoond, terwijl de <message> tag een for attribute heeft om een koppeling te leggen met één specifieke component. Een <message> tag die een foutmelding toont als een invoer veld niet is ingevuld wordt als volgt gekoppeld: <h:inputtext binding= #{UserBean.userName id= username required= true /> <h:message for= username showdetail= true /> Voor het tonen van foutmeldingen bekijken de UIMessage componenten de FacesContext. De backing F IGUUR 5. Foutmelding in een UIMessages Component <f:loadbundle basename= message.loginmessages var= bundle /> Voor andere taal/land combinaties worden extra.properties bestanden toegevoegd met de taal/land combinatie als extra extensie. De applicatie refereert vervolgens in JSF tags aan de id s van de meldingen en de vertaling in de huidige taal land combinatie wordt ingevuld. CONVERTERS JSF kent ook een standaardmechanisme om conversies toe te passen op in UI componenten ingevoerde gegevens. Deze gegevens zijn in de webpagina s van het type string. Door converters te koppelen aan UI componenten worden deze strings voor verdere verwerking geconverteerd naar het type van de converter. De koppeling wordt aangebracht door de converter als attribuut op te nemen bij de UI Component. Onder de standaardconverters die het JSF Framework levert zijn onder andere een DoubleConverter, een BooleanConverter en een DateTimeConverter. De converters kunnen ook een rol spelen bij het tonen van gegevens aan de gebruiker. De conversie verloopt dan andersom. Verder kunnen in JSF eenvoudig eigen converters worden geschreven door de Converter interface te implementeren. Deze interface bestaat uit de volgende twee methoden: 10» Java Magazine 2» juli 2004» Software Release Magazine 4

public class MyConverter implements Converter { public Object getasobject(facescontext context, UIComponent component, String newvalue) throws ConverterException { public String getasstring(facescontext context, UIComponent component, Object value) throws ConverterException { RENDERERS Het laatste kenmerk van JSF dat ik wil vermelden, heeft betrekking op de opmaak van componenten in JSF. Deze wordt overlaten aan aparte Renderers. Als in webpagina s de JSF component tag library wordt gebruikt, zijn de gebruikte UI componenten generiek en niet gebonden aan een specifieke opmaak taal. In een standaard JSF implementatie is een default HTML Renderer aanwezig die de pagina s in HTML opmaakt voor web browsers. Voor het hergebruik van de pagina s in mobiele telefoons, moet een aparte WML (Wireless Markup Language) Renderer worden gebruikt. De oorspronkelijke UI componenten kunnen ongewijzigd blijven. Het slotscherm van de login applicatie kan nu verschijnen. De naam van de succesvol ingelogde gebruiker wordt uit de property s van de backing bean gehaald (zie Figuur 6). is bedoeld voor fabrikanten van tools en componenten die zich met JSF kunnen focussen op een enkel component Framework voor Java Web Applicaties. De acceptatie van JSF zal afhangen van de implementatie in tools. Sun gaf onlangs het goede voorbeeld door met Java Studio Creator, voormalig project Rave, een eerste RAD en ease of use JSF ontwikkeltool te tonen. Alle andere toonaangevende toolfabrikanten hebben aangekondigd dit op korte termijn ook te doen. De verwachting is dat JSF daarna in rap tempo de wereld zal veroveren en we Java Web Applicaties kunnen bouwen door het draggen en droppen van componenten en het invoeren van event handling code. De achterliggende JSF tags zullen voor ons worden gegenereerd. Het is dan ook aan te raden om nieuwe Java Web Applicaties vanaf nu direct in JSF te bouwen. Graig McClanahan, grondlegger van Struts en specification lead van de JSR-127 JSF heeft het navigatiemodel van het open source Struts Framework in grote lijnen overgenomen beveelt aan om Struts-applicaties om te bouwen naar JSF in plaats van de twee te integreren. En er zijn al library s beschikbaar die deze migratie vergemakkelijken. SLOTWOORD Een belangrijk voordeel van JSF ten opzichte van andere Java Web Application Frameworks is dat het een Java-standaard is en als zodanig zal worden opgenomen in J2EE. JSF is zeer flexibel en biedt enorm veel mogelijkheden. Aanvankelijk is de JSF standaard echter nogal sceptisch ontvangen door sommige Java-ontwikkelaars. Er was met name nogal wat kritiek op de keerzijde van de flexibiliteit, namelijk de complexiteit van de specificatie. JSF zal pur sang inderdaad voor de gemiddelde ontwikkelaar moeizaam in applicaties te gebruiken zijn. Dit is echter nooit de bedoeling geweest, zoals ook in de specificatie staat vermeld: JSF F IGUUR 6. De gebruikersnaam wordt uit de property s van de backing bean gehaald drs. Willem Koppenol is Product Specialist Software Development Training bij Twice IT Training (e-mail: wkoppenol@twice.nl).» Software Release Magazine 4» Java Magazine 2» juli 2004 11