2012-05-19 10 views
5

Come posso passare un elenco a un componente JSF in EL senza backingbean? O in altre parole, come posso dichiarare e inizializzare una lista/matrice in JSF senza un bean?Passare un elenco a un componente JSF senza utilizzare un bean

Esempio:

caller.xhtml

/* Call a JSF-Component */ 
<mycomp:displayList value="HERE I WANT TO PASS A LIST WITHOUT A BACKINGBEAN"/> 

displayList.xhtml

/* MY Component */ 
<composite:interface> 
    <composite:attribute name="value" type="java.util.list" /> 
</composite:interface> 

C'è qualche possibilità di passare un elenco/Collection che non viene dichiarato in un Bean per un JSF componente?

risposta

5

Anche se non esiste un elenco letterale EL, è possibile dichiarare una lista senza la necessità di un fagiolo di contenerlo dichiarando uno in faces-config.xml:

<managed-bean> 
    <managed-bean-name>someList</managed-bean-name> 
    <managed-bean-class>java.util.ArrayList</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
    <list-entries> 
     <value>One</value> 
     <value>Two</value> 
     <value>Three</value> 
    </list-entries> 
</managed-bean> 

È anche possibile utilizzare un tipo di utility per costruire una lista:

import java.util.*; import javax.faces.bean.*; 

@ManagedBean @NoneScoped 
public class Lister<T> extends AbstractList<T> { 
    private List<T> list = new ArrayList<T>(); 

    public Lister plus(T t) { 
    list.add(t); 
    return this; 
    } 

    @Override public T get(int index) { 
    return list.get(index); 
    } 

    @Override public int size() { 
    return list.size(); 
    } 

    @Override public String toString() { 
    return list.toString(); 
    } 
} 

Questo può essere utilizzato con un'espressione come #{lister.plus('one').plus('two').plus('three')}

+0

La soluzione con il tipo di utilità è ottima. Molte grazie. –

2

Se la tua domanda significa qualcosa come "c'è un elenco letterale in EL?", La risposta è "non c'è nessuno".

Se si desidera creare un elenco e non utilizzare i bean di supporto JSF, la risposta è: "utilizzare i fagioli CDI oi bean Spring".

Se semplicemente non ti piace avere classi modello nei tuoi progetti Java, puoi facilmente creare e registrare un resolver EL che creerà un nuovo elenco quando viene utilizzato un nome specifico.

In entrambi i casi, probabilmente stai commettendo un grosso errore o frainteso qualcosa di importante. Forse avresti dovuto fare una domanda diversa.

+1

Forse non sono stato chiaro. Ma "c'è un elenco letterale in EL" è bello quello che voglio chiedere :-) –

2

costruzione Collection è possibile con EL 3.0.

Set:

{1, 2, 3} 

listino:

[1, "two", [foo, bar]] 

Mappa:

{"one":1, "two":2, "three":3} 

Esempio di utilizzo di EL costruzione collezione con JSF:

<h:dataTable value="#{[1, 2, 3]}" var="v"> 
    <h:column>#{v}</h:column> 
</h:dataTable> 

Vedere EL 3.0 Specification - final release, 2.2 Costruzione di oggetti di raccolta.

Problemi correlati