PDA

View Full Version : [Java-JSF] Aggiungere componenti dinamicamente


mux85
02-12-2011, 16:14
Ciao a tutti, ho iniziato da pochi giorni a lavorare con JSF e avrei bisogno di una mano. Ho una pagina con un menù a tendina e un pulsante, vorrei che quando si preme il pulsante vengano aggiunti alla pagina dei componenti (text input, check box, ecc...) in base a cosa c'è selezionato nel menu.
So come associare un action listener al pulsante ma dal suo interno non riesco ad aggiungere contenuti alla pagina in quanto nel context (ottenuto con FacesContext.getCurrentInstance()) il ResponseWriter è null, quindi quando chiamo la encodeEnd di un qualsiasi componente ricevo una NullPointerException (invece una semplice addMessage funziona).
Provando a fare la stessa cosa dentro a un componente creato da me invece che nell'action listener tutto funziona correttamente perchè il context (parametro di input di encodeBegin) contiene un ResponseWriter. Però in questo modo i componenti vengono creati subito e non alla pressione del pulsante.
Come faccio a inizializzare quel ResponseWriter?
O sto sbagliando completamente approccio?
Grazie a tutti

mux85
03-12-2011, 11:13
UP

gokan
03-12-2011, 11:19
Ciao, ti consiglio un altro approccio.
Quando hai una pagina con dei componenti jsf e vuoi mostrare o nascondere alcuni di questi componenti in base a delle necessità o controlli con logiche particolari ti conviene utilizzare la proprietà rendered.
Questa proprietà impostata a true piuttosto che a false ti consenti di visualizzare o nascondere il componente nella pagina.

Ti faccio un esempio classico.
Supponiamo che vuoi visualizzare una coppia label + inputText in base ad una proprietà del tuo backing bean jsf.


<h:panelGrid id="panel" columns="2" border="1" rendered={userBean.visualizzaPannello}>
<h:outputLabel for="username" value="#Nome" />
<h:inputText id="username" value="#{userBean.name}" />
</h:panelGrid>


Nel tuo backing bean, alla pressione di un pulsante, quando scateni una action postresti decidere di impostare la proprietà a tuo piacimento.

boolean visualizzaPannello = true; //oppure a false


public class UserBean{

private boolean visualizzaPannello = true; //oppure a false

//..getter e setter

//action
public String faiQualcosa(){
if(visualizzaPannello == true)
visualizzaPannello = false;
else visualizzaPannellon = true;

return "laStessaPagina";
}

}


Ciao

mux85
03-12-2011, 14:44
Quindi si tratterebbe solo di mostrare/nascondere elementi?
Se è così non si adatta al mio caso. Non posso semplicemente mettere tutti gli elementi possibili e mostrare quelli necessari. In pratica nel menu a tendina io seleziono un tipo di documento e da un file xml vado a leggere le proprietà di quel particolare tipo di documento per mostrare dei campi da compilare e fare una ricerca in base a quei campi. Caricare in anticipo tutti i tipi possibili mi sembra parecchio sconveniente se non impossibile.
Grazie per il suggerimento ma ne avete altri?

gokan
04-12-2011, 14:58
Non devi caricare in anticipo tutti i casi possibili.

Supponiamo tu abbia il caso di due menu a tendina classici come provincia e comuni.

Selezioni la provincia, se vuoi cliccki un pulsante (o in alternativa usi un componente ajax enabled) e quindi carichi il menu dei comuni.

Quando cliccli il pulsante tu esegui un metodo action che fa qualcosa di simile.

public String dammiComuni(){
List<Comune> comuni = ejb.cercaComuniDaProvincia(provincia);
...
}

l'oggetto provincia usata è una stringa che sta dietro il backing bean (ed è usata nel value della prima <h:selectOneMenu>).

Con la lista di comuni ti costruisci invece la seconda tendina (che inizialmente vuota ed invisibile).

Spero di esserti stato utile.

mux85
05-12-2011, 08:39
Grazie ma mi manca ancora qualcosa. Provo a spiegare un po' meglio cosa devo fare così magari potete aiutarmi ulteriormente.
A seconda di cosa c'è selezionato nel primo menu a tendina (che indica un tipo di documento, ad esempio: fattura, bolla di trasporto, scheda di un dipendente, ecc...) una volta premuto il tasto devo far comparire dei campi che cambiano in base a cosa c'è selezionato. Non devo riempire un altro menu a tendina. In un caso potrei aver bisogno di due campi di testo e una checkbox (con relative etichette), un'altra volta un campo di testo, una checkbox e una combo. Insomma il numero e il tipo di campi può cambiare radicalmente da un tipo di documento all'altro. Posso lo stesso usare il metodo che mi suggerisci? Se si mi sfugge come, puoi spiegarmi meglio? Grazie

gokan
05-12-2011, 09:06
In linea teorica potresti usare l'approccio sopra e mettere dei panelgrid per ogni tipo di documento.
Da quello che mi dici, ad esempio, si potrebbe usare un approccio ancora diverso, utilizzando una jsp diversa per ogni tipo di documento. In una pagina iniziale si potrebbe decidere il tipo di documento e scegliendo un documento piuttosto che un altro l'utente venga direzionato su una pagina/jsp/xhtml diversa.

Bye

mux85
05-12-2011, 09:31
La nuova pagina da usare però andrebbe costruita a priori per ogni tipo di documento no? Io invece vorrei leggere i campi da creare da un file xml al momento del caricamento della pagina