Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[JSF] Werken met querystrings

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben al enkele jaren bezig met webontwikkeling in PHP en ben onlangs begonnen met wat te experimenteren met JSF. Nu ben ik ondertussen op een probleem gestoten waar ik nog geen oplossing voor gevonden heb (ik kan het niet goed verwoorden in zoekmachine-termen). Het gaat om de volgende situatie:

Stel, een systeem met verschillende gebruikers. Laat ons uit eenvoud veronderstellen dat elke gebruiker enkel een uniek ID heeft en een unieke gebruikersnaam. Een beheerder kan een lijst bekijken van alle gebruikers en eventueel aanpassingen doorvoeren aan de gebruikersnaam.

In PHP zou ik dan het ID meegeven via de querystring en de aanpassingspagina zou dan deze code bevatten (even snel getypt, vergeef me eventuele fouten):

PHP:
1
2
3
4
5
$uid = (int) $_GET['uid'];
if (User::exists($uid))
   $user = User::get($uid);
else
   trigger_error("Ongeldig uid, blablabla", E_USER_ERROR);


Nu ben ik niet 100% zeker hoe ik dit moet aanpakken in JSF! Ik heb al gevonden dat parameters uit de querystring opgehaald kunnen worden via:

Java:
1
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param...");


Maar ik vraag me af of m'n manier van werken wel goed is. De backing bean User ziet er nu als volgt uit:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class User {

   private Long id;
   private String userName;

   public User() {
      Object uid = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("uid");  
        
      if (uid != null)
         get(Long.valueOf(uid.toString())); // get() gaat via een DAO de nodige waardes ophalen, niet relevant hier....
   }

   ....
}


Dit lijkt me echter niet de ideale manier van werken, als iemand me hier wat kan bij helpen dan zou ik hem/haar zeer dankbaar zijn ;)

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Misschien is deze JSP tutorial een goed start punt?
http://www.jsptut.com/

If it isn't broken, fix it until it is..


  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
In JSP (en daarmee ook in JSF) is er een Session object geassocieerd met een 'verbinding'. Het lijkt mij verstandig dit soort sessie-gegevens daarin op te nemen ipv iedere keer in het request te zetten. Maar idd, misschien is het verstandig om je iets meer te verdiepen in de lifecycle van Java servlets, JSPs ed

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Remus schreef op woensdag 06 augustus 2008 @ 09:57:
In JSP (en daarmee ook in JSF) is er een Session object geassocieerd met een 'verbinding'. Het lijkt mij verstandig dit soort sessie-gegevens daarin op te nemen ipv iedere keer in het request te zetten. Maar idd, misschien is het verstandig om je iets meer te verdiepen in de lifecycle van Java servlets, JSPs ed
Je moet je objecten altijd in de goede scope zetten. Iets met een kortere levensduur in de sessie plaatsen is vaak een bron van ellende, omdat die objecten langer in leven blijven dan je wilt. Expliciet doorpassen via het request is dan weleens een betere optie. Echter, het kost iets meer moeite tijdens het implementeren.

Nu JSF specifiek, want de TS heeft vast een goede reden om met request parameters te werken.

Ik zou beginnen met een utility voor je FacesContext, zoals:
Java:
1
2
3
4
5
6
7
8
9
class JSFUtil {
    public static FacesContext fc() {
        return FacesContext.getCurrentInstance();
    }

    public static ExternalContext ec() {
        return fc().getExternalContext();
    }
}


Daarmee kun je alvast de hoeveelheid boilerplate code verminderen.

Daarnaast heb je verschillende manieren om objecten uit je request op te vragen.

Je kunt het configureren in je faces-config met een managed-property:
XML:
1
2
3
4
5
6
7
8
9
<managed-bean>
  <managed-bean-name>userBean</managed-bean-name>
  <managed-bean-class>....UserBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <managed-property>
    <property-name>uid</property-name>
    <value>#{param.uid}</value>
  </managed-property>
</managed-bean>

Zorg er dan wel voor dat je een setter voor die uid hebt. Bovendien, deze injectie wordt uitgevoerd bij elke instantiatie van je bean. Het kan zijn dat je dit niet wilt, omdat je zelf controle wilt houden over wanneer je de variabele wilt uitlezen. Dan kan de volgende optie werken.
Java:
1
2
3
Application a = fc().getApplication();
ValueBinding vb = a.createValueBinding("#{param.uid}");
String uid = (String) vb.getValue(fc());


Maar ik moet eerlijk zeggen, ik gebruik deze truuk eigenlijk alleen voor het opvragen van managed beans en zo, niet voor parameters. Voor parameters doe ik hetzelfde als jij, gewoon met de Map. Met dergelijke utility methods valt de hoeveelheid code vaak nog wel mee.

Maar goed, met GET variabelen werken is niet echt volgens de "JSF way". Als je met GETs wilt werken, is een form based framework zoals Spring MVC of Struts 2 (of gewoon platte Servlets en JSPs) waarschijnlijk een betere keuze.

[ Voor 0% gewijzigd door JKVA op 06-08-2008 11:35 . Reden: zin was niet af :) ]

Fat Pizza's pizza, they are big and they are cheezy


Verwijderd

Topicstarter
JKVA schreef op woensdag 06 augustus 2008 @ 11:35:
[...]

Je moet je objecten altijd in de goede scope zetten. Iets met een kortere levensduur in de sessie plaatsen is vaak een bron van ellende, omdat die objecten langer in leven blijven dan je wilt.
Dat dacht ik ook, ja.
JKVA schreef op woensdag 06 augustus 2008 @ 11:35:
Nu JSF specifiek, want de TS heeft vast een goede reden om met request parameters te werken.
Zoals je zelf ook al aangaf, je kan niet alles in de session-scope proppen ;-) Soms zijn request parameters dus nodig, en zoals aangegeven door het W3 (cru verwoord): best GET voor requests die geen wijzigingen teweeg brengen, best POST in de andere gevallen.
JKVA schreef op woensdag 06 augustus 2008 @ 11:35:
Maar goed, met GET variabelen werken is niet echt volgens de "JSF way". Als je met GETs wilt werken, is een form based framework zoals Spring MVC of Struts 2 (of gewoon platte Servlets en JSPs) waarschijnlijk een betere keuze.
Ik kan me weinig webapplicaties voorstellen waarbij er niet op een bepaald moment met GET variabelen moet gewerkt worden, eigenlijk :? Ik twijfel niet aan je uitspraak hoor, maar dat zou de bruikbaarheid van JSF toch sterk beperken imho. Nu, goed, bedankt voor je input!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Verwijderd schreef op woensdag 06 augustus 2008 @ 13:26:
[...]


Dat dacht ik ook, ja.


[...]


Zoals je zelf ook al aangaf, je kan niet alles in de session-scope proppen ;-) Soms zijn request parameters dus nodig, en zoals aangegeven door het W3 (cru verwoord): best GET voor requests die geen wijzigingen teweeg brengen, best POST in de andere gevallen.


[...]


Ik kan me weinig webapplicaties voorstellen waarbij er niet op een bepaald moment met GET variabelen moet gewerkt worden, eigenlijk :? Ik twijfel niet aan je uitspraak hoor, maar dat zou de bruikbaarheid van JSF toch sterk beperken imho. Nu, goed, bedankt voor je input!
My bad, ik had over de zin heen gelezen dat het over het beheer ging, en dacht dus dat het om de 'huidige' gebruiker ging (in die situatie is gebruik van Session-scope wel beter nl).

Ik zelf ben momenteel ook JSF aan het bekijken, en het punt is geloof ik voornamelijk dat je JSF de lifecycle laat beheren en het toekennen en uitlezen van request parameters ed dus voornamelijk door het framework laat doen en niet nog eens zelf gaat doen (behalve in uitzonderingsgevallen).

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Verwijderd schreef op woensdag 06 augustus 2008 @ 13:26:
[...]
Ik kan me weinig webapplicaties voorstellen waarbij er niet op een bepaald moment met GET variabelen moet gewerkt worden, eigenlijk :? Ik twijfel niet aan je uitspraak hoor, maar dat zou de bruikbaarheid van JSF toch sterk beperken imho. Nu, goed, bedankt voor je input!
Tja, ik kan weinig aan de waarheid veranderen. JSF is om meerdere redenen niet het ideale framework voor publieke websites. Onder andere schaalbaarheid (geheugengebruik), responsetijd, alles POST, JavaScript verplichtingen op client, bookmarking, back button, etc...

Voor intern gebruik wordt JSF vaker gebruikt. Daar zijn die punten doorgaans minder relevant.

Dus als je geen problemen hebt met dat JSF je lifecycle beheert (en dus voor elke link een form genereerd wordt), kun je er vrij productief applicaties mee bouwen.

Als je een purist bent (zoals ik) wordt alles met JSF 2.0 beter.

Fat Pizza's pizza, they are big and they are cheezy


  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
JKVA schreef op woensdag 06 augustus 2008 @ 14:57:
[...]
JSF is om meerdere redenen niet het ideale framework voor publieke websites. Onder andere schaalbaarheid (geheugengebruik), responsetijd, alles POST, JavaScript verplichtingen op client, bookmarking, back button, etc...
Als je -het- back button probleem bedoelt in JSF, dan is dat iets wat al heel lang geleden is opgelost. Momenteel werkt deze gewoon. In het algemeen echter is de back button altijd problematisch in web applicaties, of je nu met Struts, puur JSP of PHP werkt. In JSF is de back button momenteel niet een groter of kleiner probleem dan met de andere bekende frameworks. Als jij toch een specifieke use case weet dan ben ik erg benieuwd daarna.

Alles POST is zeker niet zo. 1 van de grootste platenzaken in the UK (zavvi, vroeger virgin megastores) gebruikt JSF: http://www.zavvi.co.uk/index.jsf

Merk op dat nagenoeg alle requesten GET gebasseerd zijn, het een publieke website is en de response time zeer ok is.

Zoals al aangegeven, je kunt in JSF heel simpel request parameters uit een GET request binden aan je backing bean. Via de @postcontruct annotation kun je dan voor elke request een methode laten uitvoeren die hier wat mee doet.

Merk op dat technisch gezien de JSF manier van werken heel erg dicht tegen ASP.NET aan zit. Het component model, de gegenereerde form, de client-side of server-side state. Het lijkt er als 2 druppels water op. ASP.NET zie je vrij vaak voor publieke sites, met name de wat serieuzere web winkels van grotere bedrijven.

Dat niet elke Java website JSF gebruikt komt voor een groot gedeelte vanwege het feit dat JSF gewoon erg laat was. Voordat JSF op de markt kwam (officieel, in Java EE 5), waren er al velen andere frameworks die de leempte op vulde. Struts is daarbij 1 van de bekendere. Als je al je web applicatie in Struts gemaakt hebt ga je die niet zo snel in JSF omschrijven natuurlijk.

Het concept werkt echter wel degelijk. ASP.NET is al wat langer op de markt en je ziet dus dat dit veel gebruikt wordt.

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

flowerp schreef op woensdag 06 augustus 2008 @ 20:16:
[...]
Als je -het- back button probleem bedoelt in JSF, dan is dat iets wat al heel lang geleden is opgelost. Momenteel werkt deze gewoon. In het algemeen echter is de back button altijd problematisch in web applicaties, of je nu met Struts, puur JSP of PHP werkt. In JSF is de back button momenteel niet een groter of kleiner probleem dan met de andere bekende frameworks. Als jij toch een specifieke use case weet dan ben ik erg benieuwd daarna.
Alleen de kans op problemen is bij JSF veel groter. Deels omdat het pull is i.p.v. push (dus niet expliciet waar je pagina initialisatie logica staat), deels lifecycle (waarin geen gestandaardiseerde pagina initialisatie hooks zitten), deels postback (waardoor je vaker op session scoped data terug moet vallen). Maar de rode draad hierin is de het component based is. En component based heeft (vooral voor publieke sites) een aantal nadelen zoals genoemd.

Dus het kan idd wel werken, maar zorg dan voor een consistent design met "pagebeans" zodat elke pagina een geassocieerde request scoped bean heeft. Want het concept van pagina initialisatie kent JSF niet.

Ook moet je geen commandLink en commandButton objecten voor je navigatie gebruiken, maar <a href /> of outputLink, zodat je geen postback hebt in je primaire navigatie.
Alles POST is zeker niet zo. 1 van de grootste platenzaken in the UK (zavvi, vroeger virgin megastores) gebruikt JSF: http://www.zavvi.co.uk/index.jsf

Merk op dat nagenoeg alle requesten GET gebasseerd zijn, het een publieke website is en de response time zeer ok is.
Ja, maar als ik naar de sources kijk, is er vrij veel custom gebouwd. Ik zie een soort URL rewriting, waarvan ik verwacht dat die niet helemaal door mod_rewrite wordt afgehandeld.

Een andere goede practice is dat ze veel navigatie met normale links in plaats van commandLinks gebruiken. Nadeel van normale links is alleen dat JSF je daar niets extra's biedt.

Maar ik zie ook tientallen keren die enorme "jsf_tree_64" tag en van die verschrikkelijke JavaScript die in JSF 2.0 waarschijnlijk verboden wordt.

Ook issie traag, maar dat kan aan het internet hier liggen, dus dat is niet echt een argument.

Wat me ook opvalt is dat op sommige schermen de back button voor problemen zorgt: "Waarschuwing: de pagina is verlopen"
Zoals al aangegeven, je kunt in JSF heel simpel request parameters uit een GET request binden aan je backing bean. Via de @postcontruct annotation kun je dan voor elke request een methode laten uitvoeren die hier wat mee doet.
Request scoped page beans hebben alleen nadelen in JSF, zoals het bekende 2x laden probleem bij datatables. Vroeger was er ook een probleem genaamd "The Trap" waar events verdwenen omdat de ontwikkelaar gebruik maakte van request scoped beans. Daar kun je natuurlijk wel omheen (bijv: met session scoped beans), maar naar mijn idee is JSF dan niet meer het geschikte framework. Ik zeg niet dat het niet kan, maar volgens mij zijn er betere alternatieven.

En die alternatieven zou ik voorlopig zoeken in de form based frameworks zoals Spring MVC.
Merk op dat technisch gezien de JSF manier van werken heel erg dicht tegen ASP.NET aan zit. Het component model, de gegenereerde form, de client-side of server-side state. Het lijkt er als 2 druppels water op. ASP.NET zie je vrij vaak voor publieke sites, met name de wat serieuzere web winkels van grotere bedrijven.

Dat niet elke Java website JSF gebruikt komt voor een groot gedeelte vanwege het feit dat JSF gewoon erg laat was. Voordat JSF op de markt kwam (officieel, in Java EE 5), waren er al velen andere frameworks die de leempte op vulde. Struts is daarbij 1 van de bekendere. Als je al je web applicatie in Struts gemaakt hebt ga je die niet zo snel in JSF omschrijven natuurlijk.

Het concept werkt echter wel degelijk. ASP.NET is al wat langer op de markt en je ziet dus dat dit veel gebruikt wordt.
Ik ben ook absoluut niet anti-JSF. Integendeel, ik ben momenteel volop bezig met JSF 2.0. JSF heeft absoluut zijn nut, maar op andere gebieden zijn andere frameworks volgens mij beter. En ik denk dat dit zo'n ander gebied is.

Over de vergelijking met ASP.NET, conceptueel komen ze idd veel overeen (zover gaat meteen mijn ASP.NET kennis), maar zover ik kan zien, is ASP.NET qua implementatie al stukken verder dan JSF. JSF 2.0 gaat hier voor een deel verandering in brengen met een aantal noodzakelijke standaardisaties. En Ryan is nog steeds fanatiek bezig met de performance.

Fat Pizza's pizza, they are big and they are cheezy


Verwijderd

flowerp schreef op woensdag 06 augustus 2008 @ 20:16:
Dat niet elke Java website JSF gebruikt komt voor een groot gedeelte vanwege het feit dat JSF gewoon erg laat was. Voordat JSF op de markt kwam (officieel, in Java EE 5), waren er al velen andere frameworks die de leempte op vulde. Struts is daarbij 1 van de bekendere. Als je al je web applicatie in Struts gemaakt hebt ga je die niet zo snel in JSF omschrijven natuurlijk.
Volgens mij is de timing van JSF niet de belangrijkste factor waarom het nog niet zo breed ingezet wordt. Ik denk dat de voornaamste reden is dat de toegevoegde waarde ten opzichte van andere frameworks niet zo hoog is terwijl er wel een forse leercurve tegenover staat. Struts bijvoorbeeld was lang de defacto standaard voor Java webapplicaties. Maar ook struts heeft plaats gemaakt voor andere frameworks die klaarblijkelijk wel aansluiten bij de wensen.

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Verwijderd schreef op donderdag 07 augustus 2008 @ 11:05:
[...]
Volgens mij is de timing van JSF niet de belangrijkste factor waarom het nog niet zo breed ingezet wordt. Ik denk dat de voornaamste reden is dat de toegevoegde waarde ten opzichte van andere frameworks niet zo hoog is terwijl er wel een forse leercurve tegenover staat. Struts bijvoorbeeld was lang de defacto standaard voor Java webapplicaties. Maar ook struts heeft plaats gemaakt voor andere frameworks die klaarblijkelijk wel aansluiten bij de wensen.
Ik hoop dat JSF 2.0 gewoon op een Servlet 2.5/JSP 2.1 container kan draaien. Momenteel kan dat gewoon met de early draft, maar er is nog geen officiële beslissing genomen hierover.

Wachten op Java EE 6 lijkt me geen optie. Als ik al zie hoe lang het duurt voordat bedrijven met Java EE 5 aan de gang gaan...

Fat Pizza's pizza, they are big and they are cheezy


  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
JKVA schreef op donderdag 07 augustus 2008 @ 09:48:
[...]
Alleen de kans op problemen is bij JSF veel groter. Deels omdat het pull is i.p.v. push (dus niet expliciet waar je pagina initialisatie logica staat)
Dat mag je even uitleggen (als je wilt ;)) want dat snap ik niet helemaal. Ik neem aan dat je de MVC varianten push en pull bedoelt en niet de netwerk variant. Wat betreft het netwerk is elk gangbaar framework pull (request naar server, server stuurt response terug), tenzij je iets als comet gebruikt (server pushed naar client wanneer het daar aanleiding voor ziet). In het netwerk geval heeft het zeker gevolgen voor de back button, maar dat is onafhankelijk van JSF.

JSF is qua MVC pull, in de zin dat je in de view bindings naar managed beans definieert (liefst slechts 1 en dan spreken we in het algemeen over een backing bean). In zekere zin pulled je view dus data vanuit je bean(s) naar zich toe.

Vergeet echter niet dat je beans makkelijk geinitialiseerd kunnen worden -voordat- er zo'n pull plaats vind. Voor een conversation scope implementatie (die je vrij makkelijk zelf kunt maken, of kant en klaar kunt gebruiken van add-ons zoals Orchestra of Seam) vind er ook dikwijls een push plaats naar je backing bean voordat een UI component een pull uitvoert.

Een expliciete push van data vanuit je backing bean naar je UI components is inderdaad niet mogelijk, maar wat is het grote verschil? Ik kan in een backing bean na een post back eerst processing doen en dan forwarden naar een specifieke view. De components waaruit deze view bestaat komen de data dan bij mijn bean halen. Dat pattern wijkt IMHO amper af van wat je in een MVC push implementatie doet. Maar misschien weet jij iets wat ik niet weet. Hoe dan ook zie ik zeker niet waarom de back button hier een onderscheid in maakt.
, deels lifecycle (waarin geen gestandaardiseerde pagina initialisatie hooks zitten)
Waarom denk je dat die er niet in zitten? Er zijn hier zelfs diverse mechanismen voor. De meest voor de hand liggende is een @postcontruct annotation op een request scoped backing bean. Werkt altijd, per definitie. Al je managed properties zijn dan gezet (injected) en je kunt kijken of de request een post back was of een gewone (non-faces) request.

Wil je iets meer fine-grained reageren op een page request dan kun je gewoon aan een specifieke pagina een phase listener hangen. Je kunt dan b.v. dingen initialiseren vlak voor dat de rendering plaats vind (before render response) of b.v. vlak nadat de component tree restored is, maar nog voor dat validations hebben plaatsgevonden (after restore view). De keuze is aan jouw. Een phaselistener aan een pagina koppelen is super makkelijk gewoon een eenvoudige tag op de page.

Wil je dingen doen/initialiseren voordat er uberhaupt sprake is van een view? Dan kun je b.v. gebruik maken van een viewhandler. Via het zeer ellegante decorator pattern kun je gewoon een klein stukje code toevoegen aan de bestaande functionaliteit, of (indien je dat wilt) alles vervangen wat de standaard view handler doet.

Voorts kun je zelf nog op component basis per-page initialisatie doen. Gewoon door een managed bean via een bind attribute aan een component te binden. Als je hier b.v. de form voor gebruikt dan weet je zeker dat je method die je bind wordt aangeroepen in het begin van het renderen (bij een non-faces request) of restoren (post back).

Daarnaast heb je ook altijd nog de mogelijkheden die de Servlet package je biedt. Sommige dingen zijn logischer om met een good old Filter op te lossen (je hebt dan alleen nog niet toegang tot de FacesContext).

Al met al meer dan genoeg mogelijkheden lijkt me toch?
, deels postback (waardoor je vaker op session scoped data terug moet vallen).
Waarom impliceert een postback het gebruik van session scoped data? Ik zie dat verband niet echt. Ik denk dat als je goed kijkt jij ook niet, want dat verband is er helemaal niet. Een post zegt domweg dat je client parameters mee stuurt via de HTTP headers en niet via een URL. Of de server de data die het ontvangt in de sessie op slaat of niet zegt daar helemaal niets over. Een post -back- meer specifiek zegt dat een pagina eerst iets rendert en dit dan na een post weer terug krijgt. Ook hier impliceert niets dat er perse een sessie scope gebruikt zou moeten worden.

Ik vermoed dat je doelt op de zogenaamde view state die bij een post back betrokken is. Hier spelen echter 2 dingen mee.

1) Deze state hoeft zeker niet perse in de sessie opgeslagen te worden. Je hebt default een keuze; state on client, of state on server. State on server gebruikt inderdaad de sessie, maar state on client dus niet.

2) Of er gebruik gemaakt wordt van view state is eigenlijk voornamelijk een beslissing van individuele componenten en niet een core issue van het JSF framework. Als view state voor jou een probleem is, kun je er voor kiezen om een set components te kiezen en/of zelf te schrijven die geen view state gebruiken. Ik weet ook wel dat dat niet helemaal realistisch is, maar als je wilt kan dat wel.

Ook heb je nog de mogelijkheid om gewoon de hele state management in eigen hand te nemen, wederom door gebruik te maken van het decorator pattern. JSF biedt werkelijk enorm veel mogelijkheden om nagenoeg elk stukje framework gedrag met eigen code aan te vullen of geheel te vervangen. Dit gaat echt heel erg ver. Zelfs de hele lifecycle is in haar geheel te vervangen, deels te overriden, of aan te vullen.
Maar de rode draad hierin is de het component based is. En component based heeft (vooral voor publieke sites) een aantal nadelen zoals genoemd.
Eigenlijk heb ik die nadelen nog helemaal niet gehoord. Dat jij denkt dat het een nadeel is, maakt het nog niet automatisch tot een nadeel ;) Lees eens terug wat ik hierboven schreef. ASP.NET gebruikt -exact- dezelfde filosofie en dit zie ik behoorlijk vaak eigenlijk. Tapestry en de 2de opvolger van Struts zijn overigens ook component based.
Dus het kan idd wel werken, maar zorg dan voor een consistent design met "pagebeans" zodat elke pagina een geassocieerde request scoped bean heeft.
Dat heet dus een backing bean en dat is in nagenoeg alle gevallen sowieso al de standaard best practice. 1 page met daarachter 1 backing bean in request scope. JSF enforced die methode echter niet, maar laat de programmeur vrij om het ook anders te doen. Dat kan misbruik in de hand werken, ik ben de eerste die dat toe zal geven. Het lukraak binden van diverse UI components aan diverse session scoped beans (of nog erger, application scoped beans) is in de regel een beginners fout en kan vrij onvoorspelbaar gedrag veroorzaken.

In zekere zin is het jammer dat JSF dit toe staat. Alleen iemand die -echt- weet wat ie doet zou het heel af en toe wel eens nuttig kunnen inzetten. Ik denk dat de JSF designers er voor gekozen hebben om mensen vrij te laten in hun aanpak. Volgens mij staat er in het boek van Ed Burns ook ongeveer zoiets over.
Ja, maar als ik naar de sources kijk, is er vrij veel custom gebouwd. Ik zie een soort URL rewriting, waarvan ik verwacht dat die niet helemaal door mod_rewrite wordt afgehandeld.
Het mooie is dat JSF dit allemaal toe staat. Veel mensen denken dat JSF de custom tags zijn die je op een JSP page neer zet. Net zoals veel mensen denken dat Eclipse een Java IDE is (Eclipse zelf is niet alleen geen Java IDE (JDT is een plugin), maar zelfs nog niet eens een IDE). Zo is het ook met JSF. Je kunt diverse onderdelen vrij krachtig gebruiken zonder andere dingen die mensen soms als volledig geïntegreerd met JSF zien te gebruiken.
Een andere goede practice is dat ze veel navigatie met normale links in plaats van commandLinks gebruiken. Nadeel van normale links is alleen dat JSF je daar niets extra's biedt.
Dat is niet altijd een best practice en hangt ervan af wat je aan het doen bent. Zit je in een sequence van dialogen (een conversatie) waar het dikwijls volledig onzinnig is om naar een pagina midden in zo'n sequence te linken, dan voldoet de commandlink uitstekend. Je conversatie state wordt mooi meegenomen van page naar page zonder dat je expliciet de session scope hoeft te gebruiken. Ga je echter naar een compleet nieuwe view (page) dan zijn normale links te prefereren.
Request scoped page beans hebben alleen nadelen in JSF, zoals het bekende 2x laden probleem bij datatables.
2x laden probleem?
Vroeger was er ook een probleem genaamd "The Trap" waar events verdwenen omdat de ontwikkelaar gebruik maakte van request scoped beans.
In mijn JSF applicaties (ondertussen al diversen) ben ik eigenlijk nooit events kwijtgeraakt. Ik gebruik alleen maar request scoped beans als backing beans. Welke events bedoel je? Wanneer gebeurt dit?
maar zover ik kan zien, is ASP.NET qua implementatie al stukken verder dan JSF.
Absoluut. Zal ik zeker niet ontkennen. JSF heeft eerst de basis geïmplementeerd en is daar zoals gezegd rijkelijk laat mee. De ellenlange 'preview' periode (voordat het officieel in Java EE 5 kwam) lijkt meer kwaad te hebben gedaan dan goed. Voornamelijk de nice-to-haves en de fancy features moeten nog komen. Het concept, het fundamentele idee is echter IMHO wel degelijk ok en dat gaat ook zeker in JSF 2.0 niet radicaal veranderen.

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


Verwijderd

flowerp schreef op donderdag 07 augustus 2008 @ 22:48:
Absoluut. Zal ik zeker niet ontkennen. JSF heeft eerst de basis geïmplementeerd en is daar zoals gezegd rijkelijk laat mee. De ellenlange 'preview' periode (voordat het officieel in Java EE 5 kwam) lijkt meer kwaad te hebben gedaan dan goed.
Dat is nou al de zoveelste keer dat je dat claimed zonder enige onderbouwing. Timing is compleet irrelevant aangezien de grotere frameworks gekomen en weer 'verdwenen' zijn: Kijk maar naar Struts. De reden dat JSF het gat niet te vult is gewoon doodsimpel: Het voegt projectmatig helemaal niets toe, want:
- Ontwikkeling gaat niet sneller ten opzichte van basic JSP's
- Request flow wordt nodeloos complex
- Je introduceert een leercurve

  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
Verwijderd schreef op vrijdag 08 augustus 2008 @ 09:49:
[...]
Dat is nou al de zoveelste keer dat je dat claimed zonder enige onderbouwing.
Wat valt er te onderbouwen? Het zat voor Java EE 5 niet officieel in Java EE. Sun maakt wel vaker projecten al openbaar voordat het in Java wordt opgenomen. De vorige keer gaf ik je ook nog Swing als voorbeeld. De tijd voordat JSF in Java EE kwam was erg lang en al die tijd zaten er vervelende bugs in zowel de spec als de implementatie. Ik wil die bugs wel stuk voor stuk gaan onderbouwen, maar ik neem aan dat je ze via Google wel makkelijk kunt vinden. Om je toch een paar keywords te geven: multi-window apps, content interweaving en back button.
De reden dat JSF het gat niet te vult is gewoon doodsimpel: Het voegt projectmatig helemaal niets toe, want:
- Ontwikkeling gaat niet sneller ten opzichte van basic JSP's
Je weet hoop ik dat verreweg de meeste kosten gaan zitten in onderhoud en debugging he? Ga jij maar lekker in een half uurtje ranzige basic JSP's in elkaar frutselen, met business logic overal op de page, navigatie/control logic ertussen en overal daar om heen en door heen HTML fragmenten. Inderdaad, dat schrijf je in een half uurtje, maar kost je later uren tot dagen voor de meest basic veranderingen.

Nee, dan spendeer ik liever 4 uur voor een basic JSF pagina, waarvan ik tenminste weet dat mijn view alleen de view is en niet stiekum business logic bevat. Het is 8x langzamer developen dan een basic JSP, maar na 8 maanden kan ik het nog wel teug lezen ;)
- Request flow wordt nodeloos complex
*kuch* Heb je ooit wel eens de flow proberen te achterhalen van een 'pure JSP' Java applicatie? Met al die if-jes midden op de page, gepropt tussen de HTML. Waarbij URLs deels programmatisch uit opgebouwd worden uit Strings, met overal HTML en javascript er doorheen. Geloof me, als zo'n applicatie ook maar iets groter is dan zeg 20 pagina's dan wordt je daarna heeeel erg blij als je met zoiets als JSF mag werken.

Daarmee wil ik pure JSP pagina's verder niet afkraken. Dat is juist de grote kracht van Java EE. Je -hoeft- niet het MVC model te omarmen als je applicatie gewoon klein en eenvoudig is. Wordt je applicatie iets groter dan doe je er meestal beter aan wel naar MVC over te gaan. The right tool for the right job, toch?
- Je introduceert een leercurve
Verhip. Das waar ook. Programmeurs worden geacht niet te kunnen leren en de nieuwe generatie schijnt geboren te worden met JSP kennis in het hoofd. Ok, daar heb je dus gelijk in. Puntje voor jou. :+

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

flowerp schreef op donderdag 07 augustus 2008 @ 22:48:
[...]
Dat mag je even uitleggen (als je wilt ;)) want dat snap ik niet helemaal. Ik neem aan dat je de MVC varianten push en pull bedoelt en niet de netwerk variant. Wat betreft het netwerk is elk gangbaar framework pull (request naar server, server stuurt response terug), tenzij je iets als comet gebruikt (server pushed naar client wanneer het daar aanleiding voor ziet). In het netwerk geval heeft het zeker gevolgen voor de back button, maar dat is onafhankelijk van JSF.

JSF is qua MVC pull, in de zin dat je in de view bindings naar managed beans definieert (liefst slechts 1 en dan spreken we in het algemeen over een backing bean). In zekere zin pulled je view dus data vanuit je bean(s) naar zich toe.

Vergeet echter niet dat je beans makkelijk geinitialiseerd kunnen worden -voordat- er zo'n pull plaats vind. Voor een conversation scope implementatie (die je vrij makkelijk zelf kunt maken, of kant en klaar kunt gebruiken van add-ons zoals Orchestra of Seam) vind er ook dikwijls een push plaats naar je backing bean voordat een UI component een pull uitvoert.

Een expliciete push van data vanuit je backing bean naar je UI components is inderdaad niet mogelijk, maar wat is het grote verschil? Ik kan in een backing bean na een post back eerst processing doen en dan forwarden naar een specifieke view. De components waaruit deze view bestaat komen de data dan bij mijn bean halen. Dat pattern wijkt IMHO amper af van wat je in een MVC push implementatie doet. Maar misschien weet jij iets wat ik niet weet. Hoe dan ook zie ik zeker niet waarom de back button hier een onderscheid in maakt.
[...]
True, ik doelde op de MVC variant. Wat ik hiermee bedoelde heeft niet direct met back button support te maken, maar kan wel voor problemen zorgen. Als één request scoped backing bean achter elk scherm hangt EN JSF 1.2 gebruikt zodat je @PostConstruct kunt gebruiken, kun je het goed afvangen.

Ik kom in mijn klantenkring echter nog maar weinig JSF 1.2 enabled servers tegen. En zonder JSF 1.2 kom je bij zelfbouw of third party plugins. Voor beiden heb je al relatief veel JSF kennis nodig om ze foutloos in ze zetten.
[...]
Waarom denk je dat die er niet in zitten?
[...]
Al met al meer dan genoeg mogelijkheden lijkt me toch?
[...]
En het zijn er nog veel meer. Denk aan Variable-/Property-/ELResolver, NavigationHandler, etc...

Heb je ook al de publish/subscribe system events gezien die in JSF 2.0 komen? In de huidige staat nog absoluut niet bruikbaar, maar al wel vrij elegant qua API.

Maar wat ik bedoel, is dat je wederom vrij veel kennis van het framework moet hebben om iets fatsoenlijks neer te zetten. Bij Spring hoef je toch ook geen custom factories te schrijven als je iets productie waardigs wilt bouwen? Of entitylisteners bij JPA? Dat zijn constructies die je nodig hebt als je iets afwijkends wilt. Bij JSF moet je vrij snel terugvallen op constructies die je op zijn minst 'lastig' mag noemen. Je kunt (of je projectleden kunnen) er zonder veel moeite hele irritante bugs mee introduceren.
[...]
Waarom impliceert een postback het gebruik van session scoped data?
[...]
Ik bedoelde geen state management, maar dat je gewoon relatief vaak terug moet vallen op sessiedata als je een beetje performende applicatie wilt bouwen.

Zie opmerking over datatable verderop.
[...]
Eigenlijk heb ik die nadelen nog helemaal niet gehoord. Dat jij denkt dat het een nadeel is, maakt het nog niet automatisch tot een nadeel ;) Lees eens terug wat ik hierboven schreef. ASP.NET gebruikt -exact- dezelfde filosofie en dit zie ik behoorlijk vaak eigenlijk. Tapestry en de 2de opvolger van Struts zijn overigens ook component based.
[...]
Ik ga niet met je in discussie over ASP.NET, want daar heb ik geen praktijkervaring mee. Wat ik wel hoor van mensen die ermee werken, is dat het al vrij ver doorontwikkeld is. En dat kun je van JSF niet zeggen.

Om een beetje lekker met JSF te kunnen werken, heb je toch minimaal Facelets nodig. Voor AJAX iets van Ajax4jsf of meteen de complete RichFaces set. Met pageflows (en die komen vaak voor) heb je Seam of Spring Web Flow nodig. Nadeel is alleen dat veel van dergelijke libraries niet goed integreren. Bij de bovenstaande gaat het toevallig goed, maar dan hoef je niet te verwachten dat Apache Trinidad zonder problemen werkt.

Vooral op het gebied van AJAX, renderkits, e.d. zitten ze elkaar nog weleens in de weg.

Tel daarbij op dat Facelets niet echt 'IDE friendly' is en de support dus nog te wensen overlaat.

Vandaar dat ik denk dat JSF er nog lang niet is.

Over Tapestry en Struts 2 (en Wicket), die zijn niet puur component based (alsus Ed Burns), aangezien ze features bieden zoals URL mounting en daardoor meer op MVC frameworks zoals Struts 1 of Spring MVC lijken dan JSF.
[...]
Dat heet dus een backing bean en dat is in nagenoeg alle gevallen sowieso al de standaard best practice. 1 page met daarachter 1 backing bean in request scope. JSF enforced die methode echter niet, maar laat de programmeur vrij om het ook anders te doen. Dat kan misbruik in de hand werken, ik ben de eerste die dat toe zal geven. Het lukraak binden van diverse UI components aan diverse session scoped beans (of nog erger, application scoped beans) is in de regel een beginners fout en kan vrij onvoorspelbaar gedrag veroorzaken.

In zekere zin is het jammer dat JSF dit toe staat. Alleen iemand die -echt- weet wat ie doet zou het heel af en toe wel eens nuttig kunnen inzetten. Ik denk dat de JSF designers er voor gekozen hebben om mensen vrij te laten in hun aanpak. Volgens mij staat er in het boek van Ed Burns ook ongeveer zoiets over.
[...]
LOL, ik zit mijn posts terug te lezen en ik zie dat ik al tig keer page bean gezegd heb. 8)7
Zal wel al te lang bij dezelfde klant zitten...

Ik zeg zelf doorgaans liever Request Scoped Managed Bean of Session Scoped Managed Bean, omdat mensen anders in de war raken met Spring beans, EJB, JavaBeans spec, Mr Bean, etc...

Maar ik ben het wel met je eens. Gewoon 1 backing bean per pagina. Je kunt eventueel afwijken als je met Facelets (of JSP tag files) werkt en van een pagina een component wilt maken, maar zelfs dan is het meestal niet echt nuttig.
[...]
Het mooie is dat JSF dit allemaal toe staat. Veel mensen denken dat JSF de custom tags zijn die je op een JSP page neer zet. Net zoals veel mensen denken dat Eclipse een Java IDE is (Eclipse zelf is niet alleen geen Java IDE (JDT is een plugin), maar zelfs nog niet eens een IDE). Zo is het ook met JSF. Je kunt diverse onderdelen vrij krachtig gebruiken zonder andere dingen die mensen soms als volledig geïntegreerd met JSF zien te gebruiken.
[...]
Over Eclipse en JSF, dat begrijp ik gelukkig, maar ik ben het er niet mee eens dat het mooi is, omdat ik het vaak fout zie gaan.
[...]
Dat is niet altijd een best practice en hangt ervan af wat je aan het doen bent. Zit je in een sequence van dialogen (een conversatie) waar het dikwijls volledig onzinnig is om naar een pagina midden in zo'n sequence te linken, dan voldoet de commandlink uitstekend. Je conversatie state wordt mooi meegenomen van page naar page zonder dat je expliciet de session scope hoeft te gebruiken. Ga je echter naar een compleet nieuwe view (page) dan zijn normale links te prefereren.
[...]
Ik had het ook over normale navigatie. Ik weet het, het woord normaal is voor interpretatie vatbaar, maar ik doelde op pure navigatie, zonder dat de server moet ingrijpen, dus niet zoals in een wizard.
[...]
2x laden probleem?
[...]
Bekend probleem. Al veel besproken op o.a. de MyFaces, Facelets en JSF RI fora/mailinglists.

Het komt er op neer, je hebt een JSF pagina met een datatable (of ui:repeat, etc).
XML:
1
2
3
<h:dataTable var="person" value="#{requestScopedBean.people}">
    ...
</h:dataTable>


Daarachter heb je een request scoped managed bean met daarin de lijst die getoond moet worden. Voor het gemak ga ik ervan uit dat die uit een database query komt.

Het maakt geen verschil of de data access logica in de constructor/postconstruct of getter staat. Dus zoiets:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class RequestScopedBean {
    private DataModel people;

    public RequestScopedBean() {
        this.people = new listDataModel(/* get list from database */);
    }

   // standaard getter
}

OF:

class RequestScopedBean {
    private DataModel people;

    // Default constructor

    public DataModel getPeople() {
        if (this.people == null) {
            this.people = new listDataModel(/* get list from database */);
        }
        return this.people;
    }
}

XML:
1
2
3
4
5
<managed-bean>
    <managed-bean-name>peopleBean</managed-bean-name>
    <managed-bean-class>nl...PeopleBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

Je hebt vast weleens dergelijke code gezien. ;)

Nu wil je in die lijst een knop om een bepaald record te openen. Master/detail dus.

Iedere tutorial, boek, etc. zegt dat je dat met een UICommand component moet doen, dus een h:commandLink/Button.

Stel dat je dat advies volgt, dan krijg je iets dergelijks:
XML:
1
2
3
4
5
<h:dataTable var="person" value="#{requestScopedBean.people}">
    <h:column>
        <h:commandButton action="#{requestScopedBean.details}" value="Details" />
    </h:column>
</h:dataTable>


En een action method in je backing bean.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class RequestScopedBean {
    private DataModel people;

    private Person person;

    public RequestScopedBean() {
        this.people = new listDataModel(/* get list from database */);
    }

    public String details() {
        this.person = this.people.getRowData();
        return "personDetails";
    }

   // standaard getter
}

OF:

class RequestScopedBean {
    private DataModel people;

    // Default constructor

    public DataModel getPeople() {
        if (this.people == null) {
            this.people = new listDataModel(/* get list from database */);
        }
        return this.people;
    }

    public String details() {
        this.person = this.people.getRowData();
        return "personDetails";
    }
}

Als je deze code draait (na de typo's eruit gehaald te hebben) zul je zien dat bij het submitten de ValueExpression achter de UIData opnieuw uitgevoerd wordt, nog voordat het ActionEvent afgehandeld wordt. Om precies te zijn, tijdens het decoden in de Apply Request Values phase.

Het moge duidelijk zijn dat dit een onnodige performance penalty geeft. Zeker als je met een ORM werkt, die hele objectbomen gaat aanmaken, terwijl dat in dit geval niet nodig is.

Je kunt vanalles gaan hacken in de lifecycle, maar dit effect voorkom je niet zolang je met request scoped beans werkt. Op de Facelets mailinglist werd op een gegeven moment zelfs geopperd om het dan maar in de 2nd level cache van Hibernate op te lossen.

Je kunt je datamodels ook in de session scope stoppen, maar dat is bij grote overzichten ook geen optie.

Heel verhaal, maar dat komt dus doordat JSF postbacks sterk promoot. Als je gewoon een GET naar het detailscherm doet, met daarin een parameter, kun je daar een query voor één resultaat doen.

Nadeel is dat je zelf een link met parameters moet klussen. En je moet ze in de volgende pagina weer uitlezen. En dat is niet echt "des JSF's", want op o.a. dit gebied claimt JSF een abstractieniveau boven MVC frameworks te zitten. Als je dan zelf constructies gaat maken om weer low level te gaan werken, waarom kies je dan voor JSF?

Dat is eigenlijk het hele punt dat ik wil maken. Als je request parameters wilt uitlezen, kun je beter voor Struts of Spring MVC kiezen. Die zijn er specifiek voor gemaakt. En tegenwoordig kun je dat zelfs component based doen, met Spring Faces.
[...]
In mijn JSF applicaties (ondertussen al diversen) ben ik eigenlijk nooit events kwijtgeraakt. Ik gebruik alleen maar request scoped beans als backing beans. Welke events bedoel je? Wanneer gebeurt dit?
[...]
Laat maar, oude bug. Ik heb er zelf ook nooit last van gehad. Het had ermee te maken dat per request steeds andere ID's gegenereerd werden waardoor een ID niet terug gemapped kon worden naar een component, met als gevolg dat je actionlistenet niet uitgevoerd werd.
[...]
Absoluut. Zal ik zeker niet ontkennen. JSF heeft eerst de basis geïmplementeerd en is daar zoals gezegd rijkelijk laat mee. De ellenlange 'preview' periode (voordat het officieel in Java EE 5 kwam) lijkt meer kwaad te hebben gedaan dan goed. Voornamelijk de nice-to-haves en de fancy features moeten nog komen. Het concept, het fundamentele idee is echter IMHO wel degelijk ok en dat gaat ook zeker in JSF 2.0 niet radicaal veranderen.
JSF gaat vooral een aantal features toevoegen die noodzakelijk zijn om lekker te kunnen werken. Bijvoorbeeld een view scope (process/conversational/pageflow komt er niet in, maar in WebBeans. Ben daar niet echt blij mee), maar ook publish subscribe events bieden leuke mogelijkheden.

Heel lang verhaal, en volgens mij zijn we al erg ver afgedwaald. :) Ik moet er eerlijk bij zeggen dat ik pas een paar JSF 1.2 klussen heb gedaan en dus nog niet echt de best practices van JSF 1.2 features ken. Maar ik heb niet de indruk dat de veranderingen zo groot zijn dat dat mijn punt niet meer klopt.

Gaat JSF 2.0 alles gaat oplossen? Ik verwacht het eerlijk gezegd niet. Ik denk dat ze erg achter de feiten aan lopen. Ik ben bang dat ze de EG te groot hebben gemaakt en dat daardoor alles vertraagt.
Verwijderd schreef op vrijdag 08 augustus 2008 @ 09:49:
[...]
Dat is nou al de zoveelste keer dat je dat claimed zonder enige onderbouwing. Timing is compleet irrelevant aangezien de grotere frameworks gekomen en weer 'verdwenen' zijn: Kijk maar naar Struts. De reden dat JSF het gat niet te vult is gewoon doodsimpel: Het voegt projectmatig helemaal niets toe, want:
- Ontwikkeling gaat niet sneller ten opzichte van basic JSP's
- Request flow wordt nodeloos complex
- Je introduceert een leercurve
Ontwikkelsnelheid:
Met JSF kun je prima snel ontwikkelen. Het is aan te raden om een ervaren JSF-er op het project te hebben. Maar geldt dat niet voor alles?

Bovendien, hoewel het voordeel van JSF bij een CRUD applicatie misschien beperkt is, als je applicatie groter en complexer wordt, zul je snel genoeg de voordelen zien. Zeker als je een mooie component library kunt gebruiken. Of maak jij je JavaScript kalendertjes en picklists zelf?

Verder sluit ik me bij flowerp aan v.w.b. dit punt. Ik heb genoeg JSP-spaghetti nachtmerries gehad.

Complexe request flow:
Je moet een tot in detail gespecificeerde flow niet verwarren met een complexe flow. JSF doet in essentie hetzelfde als ieder ander framework, maar het verschil is dat alle ervaren JSF developers op die lifecycle met zijn subtiliteiten zitten te hameren, zodat mensen die net beginnen, vrijwel meteen afhaken. Als je op je eerste Struts dag meteen de interne werking te horen krijgt, gaan je oren ook flapperen.

Leercurve:
Dusss, jij denkt dat een zelfbouw JSP/Servlet oplossing gemakkelijker te leren is dan JSF? Tenzij het niet meer is dan een simpele tag library, lijkt het me sterk. Al is het maar dat er voor JSF ontzettend veel bronnen te vinden zijn.

Ten slotte vind ik het wel leuk dat je het woord "projectmatig" noemt, aangezien JSF zover ik weet het enige web framework is waar ze expliciet rekening houden met teamsamenstelling en rollen.

Fat Pizza's pizza, they are big and they are cheezy


Verwijderd

JKVA schreef op zondag 10 augustus 2008 @ 21:16:
Ontwikkelsnelheid:
Met JSF kun je prima snel ontwikkelen. Het is aan te raden om een ervaren JSF-er op het project te hebben. Maar geldt dat niet voor alles?
[..]
Verder sluit ik me bij flowerp aan v.w.b. dit punt. Ik heb genoeg JSP-spaghetti nachtmerries gehad.
Je kunt er prima snel mee ontwikkelen. Maar je kunt er niet sneller mee ontwikkelen dan de meeste andere gangbare frameworks. Het uithanden nemen van werk zoals we dat bijvoorbeeld van RoR kennen is niet aan de orde. De reden dat ik het vergelijk met basic jsp's is omdat het noemen van een andere frameworks zo snel de vergelijkings mangel in wordt geduwd.
JKVA schreef op zondag 10 augustus 2008 @ 21:16:
Bovendien, hoewel het voordeel van JSF bij een CRUD applicatie misschien beperkt is, als je applicatie groter en complexer wordt, zul je snel genoeg de voordelen zien. Zeker als je een mooie component library kunt gebruiken. Of maak jij je JavaScript kalendertjes en picklists zelf?
nee uiteraard niet. Maar zit daar nu echt het werk? Maakt dat het verschil op een project?
JKVA schreef op zondag 10 augustus 2008 @ 21:16:
Complexe request flow:
Je moet een tot in detail gespecificeerde flow niet verwarren met een complexe flow. JSF doet in essentie hetzelfde als ieder ander framework, maar het verschil is dat alle ervaren JSF developers op die lifecycle met zijn subtiliteiten zitten te hameren, zodat mensen die net beginnen, vrijwel meteen afhaken. Als je op je eerste Struts dag meteen de interne werking te horen krijgt, gaan je oren ook flapperen.
Ik verwar het ook niet. Het is nou eenmaal geen php script.
JKVA schreef op zondag 10 augustus 2008 @ 21:16:
Leercurve:
Dusss, jij denkt dat een zelfbouw JSP/Servlet oplossing gemakkelijker te leren is dan JSF? Tenzij het niet meer is dan een simpele tag library, lijkt het me sterk. Al is het maar dat er voor JSF ontzettend veel bronnen te vinden zijn.
Dat is inderdaad heel sterk. Het gaat er niet zozeer om dat je iets moet leren, het gaat erom dat je iets moet leren wat in essentie weinig toevoegd. En begrijp me niet verkeerd, ik vind jsf heel erg goed spul maar dat wil nog helemaal niet zeggen dat ik het zou inzetten. Want daarvoor moet het een bestaand probleem oplossen en dat doet het niet. Het is gewoon een andere manier.
JKVA schreef op zondag 10 augustus 2008 @ 21:16:
Ten slotte vind ik het wel leuk dat je het woord "projectmatig" noemt, aangezien JSF zover ik weet het enige web framework is waar ze expliciet rekening houden met teamsamenstelling en rollen.
En wat voegt dat toe dan?

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Verwijderd schreef op zondag 10 augustus 2008 @ 23:13:
Je kunt er prima snel mee ontwikkelen. Maar je kunt er niet sneller mee ontwikkelen dan de meeste andere gangbare frameworks. Het uithanden nemen van werk zoals we dat bijvoorbeeld van RoR kennen is niet aan de orde. De reden dat ik het vergelijk met basic jsp's is omdat het noemen van een andere frameworks zo snel de vergelijkings mangel in wordt geduwd.
RoR is natuurlijk supersnel voor CRUD applicaties, maar als je complexe applicaties gaat bouwen (en daar zijn component based/event driven frameworks voor bedoeld), heb je zover ik het ken weinig voordeel van RoR. Het voordeel van RoR zit hem toch vooral in master/detail CRUD applicaties (correct me if I am wrong).
nee uiteraard niet. Maar zit daar nu echt het werk? Maakt dat het verschil op een project?
Ik noemde date pickers als voorbeeld van componenten die je op een heel elegante manier kunt hergebruiken. Hetzelfde geldt voor modal panels, geavanceerde datatables, charts, validaties, etc. Ik kan aardig JavaScripten, maar met RichFaces bouw ik sneller een AJAX applicatie. En qua code is het stukken minder spaghetti, waardoor het weer beter te onderhouden is.
Ik verwar het ook niet. Het is nou eenmaal geen php script.
[...]
Dat is inderdaad heel sterk. Het gaat er niet zozeer om dat je iets moet leren, het gaat erom dat je iets moet leren wat in essentie weinig toevoegd. En begrijp me niet verkeerd, ik vind jsf heel erg goed spul maar dat wil nog helemaal niet zeggen dat ik het zou inzetten. Want daarvoor moet het een bestaand probleem oplossen en dat doet het niet. Het is gewoon een andere manier.
Probleem is een groot woord, maar precies zoals je zelf al aangeeft, het is een andere manier van werken. En die is voor sommige dingen meer geschikt dan voor andere. En naar mijn idee is dat voornamelijk complexere applicaties.
En wat voegt dat toe dan?
Dat is altijd de vraag, maar je kunt als je wilt, relatief gemakkelijk een rollenscheiding aanbrengen tussen de techneuten (die bijv. componenten en ander herbruikbaar spul bouwen) en de (minder technische) applicatieprogrammeurs.

Fat Pizza's pizza, they are big and they are cheezy


Verwijderd

Verwijderd schreef op vrijdag 08 augustus 2008 @ 09:49:
[...]
De reden dat JSF het gat niet te vult is gewoon doodsimpel: Het voegt projectmatig helemaal niets toe,
Zonder me verder al te veel te willen mengen in de discussie kan ik melden dat ik gebruik van JSF juist wel behoorlijk zie stijgen. Wij gebruiken het zelf naar volle tevredenheid (team van +- 8 mensen). Diverse mensen die ik ken hebben laatst ook projecten met JSF gedaan en waren ook tevreden.

De reden dat ik denk (nu meng ik me toch een beetje erin :P) dat het een tijdje terug weinig gebruikt werd is de beschikbaarheid van Java EE 5 servers. JSF mag dan misschien al wat langer standalone bestaan, veel bedrijven nemen het pas echt in overweging nu het standaard in Java zit. Een Java server die veel gebruikt wordt is Jboss en die heeft nog steeds geen officiele Java EE 5 versie, hoewel de oudere Jboss 4 wel het meeste toch al aan boord heeft. Andere Java servers waren ook wat laat met Java EE 5 versies.

Verwijderd

JKVA schreef op zondag 10 augustus 2008 @ 21:16:
Als je deze code draait (na de typo's eruit gehaald te hebben) zul je zien dat bij het submitten de ValueExpression achter de UIData opnieuw uitgevoerd wordt, nog voordat het ActionEvent afgehandeld wordt. Om precies te zijn, tijdens het decoden in de Apply Request Values phase.

Het moge duidelijk zijn dat dit een onnodige performance penalty geeft. Zeker als je met een ORM werkt, die hele objectbomen gaat aanmaken, terwijl dat in dit geval niet nodig is.

Je kunt vanalles gaan hacken in de lifecycle, maar dit effect voorkom je niet zolang je met request scoped beans werkt.
Wij zaten ook met dit probleem. Het komt volgens mij omdat UIData het originele datamodel nodig heeft om te kunnen bepalen welk virtueel component gevuurt heeft. Die button die jij indrukt staat namelijk niet echt in de component tree. Zou het niet intern op te lossen zijn door die virtuele component tree ook op te slaan in de view state?

Wij hebben dit opgelost door het DataModel dat gebruikt wordt voor het renderen van de DataTable gewoon via de saveState tag (http://myfaces.apache.org/tomahawk/uiSaveState.html) op te slaan.

Na een postback wordt de tabel gewoon voor je gezet in een getter van je backing bean. Natuurlijk zorg je er wel voor dat het DataModel altijd klein is; je slaat precies dat gedeelte op dat gebruikt is voor rendering. Als je dus alleen 1 page rendert (zeg rij 100 t/m 120), dan sla je op deze manier alleen de view 100 t/m 120 op en niet je hele model. Ten tweede moet je even uitkijken als je save state on client hebt gedaan. Soms bevat een datamodel meer dan hetgeen je rendert, en die andere dingen wil je nooit naar je client sturen. Omdat bij ons het datamodel dat we renderen altijd een snapshot view is van het datamodel dat we oorspronkelijk bij de DB ophaalde is dit nooit een probleem. Met state on server is het nog veel minder een issue.

Omdat dit een vaak terugkerend pattern bleek te zijn hebben we het allemaal nog wat makkelijker gemaakt door support code ervoor te schrijven, maar ook daar zonder is het niet zo moeilijk.

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Verwijderd schreef op maandag 11 augustus 2008 @ 18:02:
[...]


Wij zaten ook met dit probleem. Het komt volgens mij omdat UIData het originele datamodel nodig heeft om te kunnen bepalen welk virtueel component gevuurt heeft. Die button die jij indrukt staat namelijk niet echt in de component tree. Zou het niet intern op te lossen zijn door die virtuele component tree ook op te slaan in de view state?

Wij hebben dit opgelost door het DataModel dat gebruikt wordt voor het renderen van de DataTable gewoon via de saveState tag (http://myfaces.apache.org/tomahawk/uiSaveState.html) op te slaan.

Na een postback wordt de tabel gewoon voor je gezet in een getter van je backing bean. Natuurlijk zorg je er wel voor dat het DataModel altijd klein is; je slaat precies dat gedeelte op dat gebruikt is voor rendering. Als je dus alleen 1 page rendert (zeg rij 100 t/m 120), dan sla je op deze manier alleen de view 100 t/m 120 op en niet je hele model. Ten tweede moet je even uitkijken als je save state on client hebt gedaan. Soms bevat een datamodel meer dan hetgeen je rendert, en die andere dingen wil je nooit naar je client sturen. Omdat bij ons het datamodel dat we renderen altijd een snapshot view is van het datamodel dat we oorspronkelijk bij de DB ophaalde is dit nooit een probleem. Met state on server is het nog veel minder een issue.

Omdat dit een vaak terugkerend pattern bleek te zijn hebben we het allemaal nog wat makkelijker gemaakt door support code ervoor te schrijven, maar ook daar zonder is het niet zo moeilijk.
Analyse klopt. Het is alleen - afhankelijk van de situatie - niet altijd voldoende.

Ik heb een paar opdrachten terug een JSF project gedaan waar ze in 1 scherm tegelijk 1500 rijen wilden kunnen zien en bewerken, zonder paginering. En het werd nog erger, elke rij bevatte een checkbox (voor multi row selecties), x (0 tot 5) radio buttons, een select met een stuk of 10 opties (opties variërend per rij), en aan het einde van de rij een set met invoervelden die openklapten afhankelijk van de keuze in de radio/select.

Ik kan je vertellen dat je dat niet op de client (of in memory) wil opslaan. Uiteindelijk was de oplossing eenmalig een zwaar geoptimaliseerde pagina renderen, dus niet met een dataTable component, maar gewoon een ui:repeat uit Facelets (in feite een for loop) en dan met de hand tr, td, etc neerzetten. Na GZIPpen, MyFaces upgraden en nog wat verkleinigstrucs (handmatig ID's zetten, in plaats van genereren) kwamen we uit op 600kB op het lijntje. Die custom HTML zorgde tevens voor wat mogelijkheden om de JavaScript sneller te maken, want in IE 6 over zo'n enorme table itereren is een drama als je standaard (lees: cross browser) constructies gebruikt.

Als je dan naar een detailscherm wilde gaan, ging dat gewoon met een GET link, om dit gedrag te voorkomen. Het is ff wat meer werk, maar op zo'n moment doe je alles om het laatste beetje performance eruit te persen. En een factor 2 (ff bot gezegd) zonder echte nadelen performance wise pik ik dan graag mee.

State saving, of het nou client of server is, is dan veel te veel overhead qua memory, netwerk en CPU.

Btw. Ik klik net ff op de link in je profiel en kom dan op een website waar JSF gemixed lijkt te worden met JSP en PHP. Bevalt dat een beetje? Ook met interactie tussen PHP/JSF pagina's?

Fat Pizza's pizza, they are big and they are cheezy


  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
JKVA schreef op maandag 11 augustus 2008 @ 20:51:
[...]
Analyse klopt. Het is alleen - afhankelijk van de situatie - niet altijd voldoende.
Inderdaad, afhankelijk van de situatie. Eigenlijk doe ik bijna het zelfde, behalve dat ik dan niet het Tomahawk component gebruik, maar mijn backing bean de StateHolder interface laat implementeren (in een base class) en ik deze backing bean programmatisch aan de component tree toe voeg. Dit is natuurlijk niet iets wat je als beginnende JSF programmeur even zelf in elkaar klust. Niet omdat het nou -zo- moeilijk is, maar je moet wel even weten waar je mee bezig bent. De andere mensen in mijn team gebruiken het gewoon.

Het is jammer dat JSF niet zoiets als dit standaard bevat. Ik zie inderdaad vele beginners met JSF worstelen met dit probleem. In de gangbare turtorials staat er ook niets over eigenlijk.
Ik heb een paar opdrachten terug een JSF project gedaan waar ze in 1 scherm tegelijk 1500 rijen wilden kunnen zien en bewerken, zonder paginering. En het werd nog erger, elke rij bevatte een checkbox (voor multi row selecties), x (0 tot 5) radio buttons, een select met een stuk of 10 opties (opties variërend per rij), en aan het einde van de rij een set met invoervelden die openklapten afhankelijk van de keuze in de radio/select.
Ik snap wat je bedoelt. De JSF view state kan dan erg zwaar worden. Aan de ene kant is zo'n UI lichtelijk over the top. Aan de andere kant is JSF -juist- ontworpen voor erg zware en complexe interfaces.

Soms wordt ik een beetje moe van de snelle "JSF, EJB3, etc Sucks, Sun is evil" argumentatie, maar dat betekent natuurlijk niet dat diegene die deze technieken wel met plezier gebruiken blind moeten zijn voor de zwakke punten erin. JSF heeft wel degelijk een aantal zwakke punten. Het erg zwaar worden van de view state bij zulke super zware pagina's is zeker wel een nadeel. Voor een gedeelte komt dat wel degelijk door iets in de architectuur van JSF. Wat ik merkte is dat bij het opslaan van de view state, constanten van components ook gewoon opgeslagen worden. Bij interfaces met het aantal rijen wat jij noemt kan dit enorm aan tikken.

B.v.

XML:
1
<x:someConverter low="12" high="14" code="abcdefghi" seed="899" />


Hoewel alle attributes hier constanten zijn, die JSF gewoon uit de page description zou kunnen lezen bij het restoren van de tree, worden default al deze attributen naar de view state geschreven. Bij 1500 rijnen zijn dat dus zo'n 4500 integers en 13500 karakters. Als je dit naar de client zou saven zit je al op 20K extra alleen voor die ene converter.

Omdat in JSF alles enorm plugable is, is het moeilijk om JSF zelf de schuld hiervan te geven. Je zou kunnen zeggen dat het de schuld van de default StateManager is, die hier best wel wat slimmers zou kunnen doen. Maar ja, met dat standaard ding moeten de meesten mensen het wel doen natuurlijk.

Dit geldt ook een beetje voor de UIData based components. Deze werken allemaal met tabellen die de cursor van een DataModel na een postback op de juiste plek zetten. Het staat iedereen echter vrij om gewoon een tabel component te maken die heel anders werkt en bijvoorbeeld een setter van je backing bean aanroept met als value een primary key.
Heb je ook al de publish/subscribe system events gezien die in JSF 2.0 komen? In de huidige staat nog absoluut niet bruikbaar, maar al wel vrij elegant qua API.
Ik heb nog heel erg weinig naar JSF 2.0 gekeken, maar dat ga ik zeker eens beter doen. Bedankt voor de tip :)
Ik kom in mijn klantenkring echter nog maar weinig JSF 1.2 enabled servers tegen. En zonder JSF 1.2 kom je bij zelfbouw of third party plugins. Voor beiden heb je al relatief veel JSF kennis nodig om ze foutloos in ze zetten.
JSF 1.2 is nu toch al weer een flink tijdje op de markt (2006). Waarom blijven alle klanten dan perse bij JSF 1.1? Als je geen JSP 2.1 kunt gebruiken (vanwege een J2EE 1.4 server) kun je gewoon Facelets toepassen voor je view description. Is nog beter dan JSP ook ;) Voor een klant die al een server heeft draaien is het natuurlijk niet altijd makkelijk om iets te laten upgraden, maar b.v. Jboss 4.2.3 levert JSF 1.2 standaard mee. Het is een beetje jammer als wie dan ook met problemen uit het verleden moet blijven zitten die allang al opgelost zijn. Spring 1 (om maar iets te noemen) had ook enkele problemen, maar daar lijkt de bereidheid om up te graden veel groter te zijn. Men (niet perse jij, maar in 't algemeen ;)) vergelijkt dan JSF 1.1 (2004) met het Spring uit 2008.

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

flowerp schreef op maandag 11 augustus 2008 @ 22:08:
[...]
Ik heb nog heel erg weinig naar JSF 2.0 gekeken, maar dat ga ik zeker eens beter doen. Bedankt voor de tip :)
[...]
Als je nog een goede bron nodig hebt, kijk hier eens:
http://blogs.sun.com/rlubke/

Ryan schrijft over ongeveer alle nieuwe features een stukje op zijn blog. Scheelt je weer een spec doorspitten.
[...]
JSF 1.2 is nu toch al weer een flink tijdje op de markt (2006). Waarom blijven alle klanten dan perse bij JSF 1.1? Als je geen JSP 2.1 kunt gebruiken (vanwege een J2EE 1.4 server) kun je gewoon Facelets toepassen voor je view description. Is nog beter dan JSP ook ;) Voor een klant die al een server heeft draaien is het natuurlijk niet altijd makkelijk om iets te laten upgraden, maar b.v. Jboss 4.2.3 levert JSF 1.2 standaard mee. Het is een beetje jammer als wie dan ook met problemen uit het verleden moet blijven zitten die allang al opgelost zijn. Spring 1 (om maar iets te noemen) had ook enkele problemen, maar daar lijkt de bereidheid om up te graden veel groter te zijn. Men (niet perse jij, maar in 't algemeen ;)) vergelijkt dan JSF 1.1 (2004) met het Spring uit 2008.
Tja, ik verkondig Facelets overal waar ik kom. Jammergenoeg krijg je met Facelets alleen een ViewHandler (die overigens regeert) en een implementatie van Unified EL mee en niet bijv. de @PostConstruct.

Het lijkt er trouwens wel op dat het aantal Java EE 5/JSP 2.1 servers groeit. Ook bij mijn huidige klant hoor ik plannen om van JBoss 4.0.5 naar 4.2 te gaan. Jammergenoeg dat de beheerorganisatie daar vaak een stokje voor steekt. Terwijl ze gratis performancewinst en bugfixes krijgen. :S Ik snap het niet...

Fat Pizza's pizza, they are big and they are cheezy

Pagina: 1