[rd_jsfsquad] Re: Vraagje JSF DataTable - updaten List

  • From: Sander De Vos <de.vos.sander@xxxxxxxxx>
  • To: rd_jsfsquad@xxxxxxxxxxxxx
  • Date: Tue, 2 Feb 2010 22:12:42 +0100

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 commandLink component.
> 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: