[rd_jsfsquad] Re: Vraagje JSF DataTable - updaten List

  • From: Steve Schols <steve.schols@xxxxxxxxx>
  • To: rd_jsfsquad@xxxxxxxxxxxxx
  • Date: Tue, 2 Feb 2010 22:18:45 +0100

Bedankt Sander :-)

Ik heb na wat zoekwerk op google en de MyFaces WiKi de standaard JSF
injection inderdaad teruggevonden, maar er stond iets van comment bij dat
deze niet Lazy genoeg zou zijn en dat je dan beter via de FacesContext met
ValueExpression stuff zou gaan werken.

Nuja, nu heb ik dus gewerkt met de injection, die werkt naar behoren.

Ik heb de PersonBean Session scoped gemaakt (welke één persoon moet beheren
... hoewel hij de PersonListBean wel aanspreekt om terug de laatste state
uit de "database = Map" te gaan halen).
Wanneer ik op "Creëer persoon" klik, roep ik een ActionListener op in de
PersonBean die een "new Person()" doet, zodat deze ook leeg is...anders lijk
ik problemen te hebben met mijn enum's omdat de Person instance null is.

Ik check het dadelijk in, wanneer ik checkstyle ne PMD conform ben ...

Jullie mogen mijn code altijd eens controleren wanneer jullie daar zin en
tijd in / voor hebben en mij jullie commentaren, opmerkingen en "je zou dit
beter zo doen"-stuff doormailen.

Alvast bedankt.


2010/2/2 Sander De Vos <de.vos.sander@xxxxxxxxx>

> Steve,
>
> Je kan de session bean 'resetten' door deze uit de session-map te kicken.
>
> Ik heb momenteel geen IDE voor mij, maar wss iets zoals :
> .FacesContext.currentinstance.externalcontext.sessionmap.remove("personListBean").
> Je bean zal niet meer bestaan, en zal bij de volgende referentie opnieuw
> worden aangemaakt.
>
> Je kan ook de sessionbean injecteren in de requestscoped bean ( kijk eens
> naar de faces-config.xml) daarin kun je binnen de component declaraties
> andere beans injecteren.Dit heeft dus niks te maken met JEE6 maar is
> standard behaviour van JSF. Let wel op want je kan bv geen requestbeans in
> sessionbeans stoppen, de scope moet altijd groter zijn van de geinjecteerde
> bean, bv:  applicationbean in sessionbean injecteren, of sessionbean in
> requestbean. Je hoeft enkel setters te voorzien en ze in de faces-config.xml
> declareren.
>
> Voor het doorgeven van objecten kun je eventueel een attribuut meegeven aan
> je knop:
>
> <h:commandButton ...>
> <f:param id="personId" value="#{person.id}"
> </h:commandButton>
>
> In je requestbean kun je dan in de constructor of de @PostConstruct die
> variabele van de requestScope halen ( ook via external context ) en zo je
> object terug initialiseren.
>
> Als ik nog ideeën heb zal ik ze mailen
>
> Sander
>
> Op 02 Feb 2010, om 19:02 heeft Steve Schols het volgende geschreven:
>
> Hallo,
>
> Dit is waarschijnlijk een noobie-question ... maar toch...
>
> Ik ben terug bezig aan die ext-val poc om de navigatie verder uit te werken
> en een correct gebruik van JSF concepten te hanteren.
>
> Ik heb nu een Session-scoped PersonListBean welke mijn List bijhoudt van
> Person objecten. Deze gebruik ik om de lijst van personen te tonen in de
> datatable component.
> <t:dataTable value="#{personListBean.persons}" var="person"...
> In de constructor van deze managed bean haal ik alle personen op via een
> DAO. Ik vermoed, gezien dat deze een Session-scoped bean is, dat deze
> constructor slechts één maal per sessie wordt uitgevoerd.
>
> Daarenboven heb ik een Request-scoped PersonBean waarin ik een Person
> object steek.
> Wanneer ik op een detail-knop klik in de DataTable, verwijs ik door naar
> personBean.showDetail() via een actionListener op de commandLinkcomponent.
> public void showDetail(ActionEvent event) {
> this.person = (Person) ((UIData)
> event.getComponent().getParent().getParent()).getRowData();
> }
>
> Bij het verwijderen vanuit de DataTable roep ik ook de getRowData() methode
> op en voer ik daarna het volgende uit:
> personDAO.delete(this.person);
> Ik dacht dat de DataTable na dit verwijderen geüpdate zou zijn, maar die is
> natuurlijk niet rechtstreeks gekoppeld aan de Map van Person objecten die in
> de DAO zit.
>
> Hoe kan ik op de beste of meest gebruikte manier de PersonListBean oproepen
> om opnieuw een loadAll() te gaan doen of de persoon ook daar uit te
> verwijderen?
> Rudy sprak over Bean Injection, maar is dit ook beschikbaar buiten JEE 6 in
> Tomcat 6.0?
>
> Iemand tips over hoe dergelijke zaken meest worden aangepakt?
> Ook voor het klikken op een wijzig-knop om naar een editeerbaar scherm te
> gaan vanuit een raadpleegscherm van een persoon zit ik nog in de problemen.
> De PersonBean is wel Request-scoped maar ik dacht dat dit OK is. Ik ben dus
> bij het klikken op de commandButton "Wijzig" de Person instance terug kwijt.
>
> Alvast bedankt voor de info.
>
> Groetjes,
>
> Steve
>
>
> Sander De Vos
> Software Engineer
>
> E: de.vos.sander@xxxxxxxxx
> M: +32 (0)475/79 72 71
>
>
>
>

Other related posts: