2013-04-23 5 views
9

Sto avendo un grosso problema ottenendo un compito estremamente semplice fatto in JSF. Il problema: ho oggetti, che hanno proprietà aggregate che possono variare di tipo da oggetto a oggetto. A seconda del tipo di proprietà, voglio utilizzare un diverso set di campi di input.<ui:include> con src dinamico ... completa follia

I componenti del sottotipo risiedono nei framework e vengono caricati su richiesta. A tal fine, io uso il seguente codice:

<h:panelGroup id="zusatzdaten"> 
    <fieldset class="clear"> 
    <legend>#{tickerUI.ticker.tickerDescription.label} 
      (#{tickerUI.ticker.tickerDescId}) 
    </legend> 
    <h:panelGroup rendered="#{tickerUI.editComponentName != null}"> 
     <ui:include src="#{tickerUI.editComponentName}"/> 
    </h:panelGroup> 
    </fieldset> 
</h:panelGroup> 

Il nome del componente esce TickerUI, che è di @SessionScope. Ora il bit abbagliante: quando viene caricato per la prima volta, viene visualizzato il sottocomponente corretto. Tuttavia, quando si utilizza un collegamento nella navigazione, che dovrebbe portare a includere un componente diverso, il contenuto NON viene aggiornato! Ciò si traduce in un errore, perché i dati ora sono un sottotipo diverso, ma i componenti del modulo sono ancora del precedente.

Quando si torna indietro dall'errore e si fa nuovamente clic sul collegamento, viene visualizzato il componente corretto. Ho registrato il valore di editComponentName e vengono restituiti i valori corretti. Questo è molto confuso. Perché è incluso il contenuto sbagliato quando il getter restituisce il nome del componente corretto all'attributo src?

Aiuto molto apprezzato.

+3

'' piste durante il tempo di visualizzazione di compilazione, non durante la visualizzazione tempo di rendering. Vedi anche http://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense – BalusC

+0

Grazie. Ovviamente sono ancora nuovo di JSF e questo JSTL/JSF renderizzare le cose del tempo non è facile da comprendere. Ho trovato la soluzione sul tuo blog: ' javax.faces.PARTIAL_STATE_SAVING false ' –

risposta

7

In realtà il tuo problema è una visualizzazione classica della vista rispetto alla visualizzazione del problema del tempo di rendering/incomprensione. Più specificamente, la vista è creata per ogni nuova richiesta e ricostruita da uno stato precedentemente salvato sui postback. Successivamente la visualizzazione è resa per produrre contenuto HTML.

Ora, come <ui:include> è un gestore tag, o in termini ufficiali, un vista tag tempo di costruzione, quando prima richiesta della pagina, il suo attributo value viene valutata, e la pagina inclusa si fa strada nella vista . Al momento del postback, contrariamente a quanto ci si potrebbe aspettare, i contenuti inclusi sono già lì, nella vista ricostruita. Quindi, è un comportamento previsto che avrai la parte esatta della visualizzazione renderizzata.

Per quanto riguarda la soluzione, è sufficiente includere semplicemente un elenco completo di include statici che sono racchiusi in componenti JSF con rendering condizionale <ui:fragment>. Per semplicità, tutti i contenuti possono essere posti all'interno di un contenitore come <h:panelGroup> che viene sempre visualizzato per semplificare gli aggiornamenti AJAX. Il codice potrebbe essere assemblato come segue:

<h:panelGroup id="ui"> 
    <ui:fragment rendered="#{bean.condition1}"> 
     <ui:include src="/path/to/file1.xhtml"/> 
    </ui:fragment> 
    ... 
    <ui:fragment rendered="#{bean.condition_n}"> 
     <ui:include src="/path/to/file_n.xhtml"/> 
    </ui:fragment> 
</h:panelGroup> 
+0

Grazie, ma in questo caso statico comprende non sono un'opzione.I componenti devono essere collegati da framework "aggiuntivi", senza toccare l'applicazione principale. Avevamo qualcosa di codificato lì, il motivo per cui ho iniziato a cercare di sostituirlo con una soluzione più dinamica. –

1

Un dilemma classico, a quanto pare. BalusC's blog ha dato la soluzione per il mio caso, sotto forma di un parametro di configurazione in web.xml:

<context-param> 
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name> 
    <param-value>false</param-value> 
</context-param>