[JSF] Itereren over HashMap die teruggegeven wordt

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Ik heb de volgende JSF code:
Java Server Faces:
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<content xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:ui="http://java.sun.com/jsf/facelets">    
    <c:forEach items="#{Opvragen.request()}" var="info">
        <household id="#{info.key}">
            <c:forEach items="#{info.value}" var="person">
                <person name="#{person.name}" />
            </c:forEach>
        </household>
    </c:forEach>
</content>


Vrij basic code, die een lijst met huishoudens met daarin alle personen met hun naam plaatst.

Maar het probleem is dat de functie request() van de bean Opvragen voor elke keer dat er wordt geitereerd opnieuw wordt uitgevoerd.

Ik wil dat deze slechts één keer wordt uitgevoerd, ik wil dus dat het resultaat op de een of andere manier gekopieerd wordt, zodat ie over een hashmap loopt in plaats van over een functie zeg maar.

Als ik de functie vooraf uitvoer (door #{Opvragen.request()} boven de eerste c:forEach uit te voeren en vervolgens loop over #{Opvragen.householdInformation} (een getter die de gemaakte HashMap<Long, ArrayList<Person>> teruggeeft) krijg ik een foutmelding dat de property null is. Het lijkt alsof de c:forEach al wordt uitgevoerd terwijl de request() functie nog niet voltooid is.

Iemand enig idee hoe ik dit nou goed kan maken?

EDIT: En als ik ui:repeat gebruik, krijg ik ook helemaal geen resultaten.

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Bump.

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Wanneer dit voorkomt in een programmeertaal, dan zou je er voor kunnen kiezen om gebruik te maken van een variabele die buiten de loop is gedefinieerd. Op deze manier zal er een variabele worden aangemaakt met het resultaat. Het voordeel hiervan is, dat het maar eenmaal wordt opgevraagd. Precies waar je naar op zoek bent.

Na wat onderzoek heb ik geconstateerd dat het mogelijk is om gebruik te maken van variabele binnen JSF. Dit kan door gebruik te maken van de <c:set /> tag:

Java Server Faces:
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<content xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:ui="http://java.sun.com/jsf/facelets">
    <c:set var="opvraagItems" value="#{Opvragen.request()}" />
    <c:forEach items="#{opvraagItems}" var="info">
        <household id="#{info.key}">
            <c:forEach items="#{info.value}" var="person">
                <person name="#{person.name}" />
            </c:forEach>
        </household>
    </c:forEach>
</content>


Verder zou ik persoonlijk nog eens kijken naar de implementatie. Wat je hier probeert te doen, is een request aanroepen vanuit een presentatielaag. Vaak wordt dit gescheiden. Op deze manier heb je niet de variabele in je JSF staan, maar zal dit op een andere laag gebeuren. Daardoor blijft je (presentatie)code ook netjes (gescheiden). Nu weet ik niet wat de volledige context van de applicatie is, dus dat laat ik even achterwege. Zie het als tip, misschien kun je er wat mee.

[ Voor 5% gewijzigd door Feanathiel op 30-04-2010 22:00 . Reden: Toegevoegde waarde van scheiden toegevoegd ]