Domanda

Ho la seguente pagina:

<h:form id="gameSelectionForm">
    <h:selectOneMenu id="gameSelection">
        <f:selectItems value="#{gameBean.gameIds}" />
    </h:selectOneMenu>
    <h:commandButton id="gameSelector" value="Play" action="#{gameBean.changeGame}"  />
</h:form>

<h:panelGroup id="gameDiv">
    <f:verbatim>
        <iframe src="/levelup/resources/games/#{gameBean.gameId}/#{gameBean.htmlPage}"  width="700px" height="800px" frameborder="0"/>
    </f:verbatim>
</h:panelGroup>

Quando clicco sul pulsante "gameSelector", ecco la sequenza di eventi: 1. gameBean.getGameId e gameBean.getHtmlPage sono chiamati 2. gameBean.changeGame si chiama 3. La pagina viene aggiornata.

I miei problemi risiede nell'ordine di 1. e 2. La modifica changeGame una variabile gameBean che viene utilizzato dal getGameId e getHtmlPage. Voglio quindi ad esso eseguire per primo, in modo che quando gli altri pannelli vengono aggiornati, contengono i dati appropriati.

Si noti che questo problema sembra verificarsi solo per la chiamata all'interno dell'elemento gameDiv (le altre variabili siano correttamente aggiornati).

Vuoi avere alcuna idea di cosa avrei potuto fare per ripristinare l'ordine di 1. e 2., in modo che il metodo changeGame () è il primo chiamato?

sto utilizzando JavaServer Faces 2.0 su Tomcat 7.0.

Grazie in anticipo

È stato utile?

Soluzione

Come per il proprio risposta su questo argomento:

Ho rimosso il f: tag verbatim, ed ora funziona correttamente. Io ancora non capisco il motivo per cui ha causato questo comportamento però.

Il <f:verbatim> è stato introdotto in JSF 1.0 una parte posteriore molto tempo con il solo scopo di essere in grado di includere semplice HTML nell'albero dei componenti JSF. Su JSF 1.0 (e 1.1), quando l'albero componente ottenere costruito, tutto il codice HTML pianura è stato ignorato. La pagina rimane reso con tutto il codice HTML pianura e poi il rendering HTML di componenti JSF dopo . Così, per esempio

<p>Hello</p>
<h:inputText />
<p>World</p>
<h:outputText value="outputtext" />
<p>This is weird</p>

get reso come

<p>Hello</p>
<p>World</p>
<p>This is weird</p>
<input type="text" />
outputtext    

Il <f:verbatim> permesso agli sviluppatori di prendere semplice HTML nell'albero dei componenti JSF, in modo che essi vengono resi "in sincronia" come ci si aspetterebbe dalla codifica.

<f:verbatim><p>Hello</p></f:verbatim>
<h:inputText />
<f:verbatim><p>World</p></f:verbatim>
<h:outputText value="outputtext" />
<f:verbatim><p>This is weird</p></f:verbatim>

Sono tuttavia ottenere inline durante la visualizzazione Crea tempo, non durante la visualizzazione rendere di tempo. Questa è la causa del problema, i getter vengono richiamati durante il ripristino fase di vista, invece di rendere fase di risposta.

Dal JSF 1.2, con il miglioramento gestore di vista, è stato possibile inline semplice HTML "in sincrono", senza hassling con le etichette <f:verbatim> brutti. Quindi non è più necessario. Ci sono anche casi di utilizzo non utili per il tag più, si aspettano di forse alcune ottimizzazioni premature di prestazioni, ma ancora allora, non si dovrebbe usare in combinazione con dati dinamici come ottenuto da Expression Language.

Domande correlate:

Altri suggerimenti

Mettere un set di attributi immediato su true sul commandButton.

<h:commandButton id="gameSelector" value="Play" action="#{gameBean.changeGame}" immediate="true" />

Si esegue il metodo in fase ApplyRequestValues ??poi.

Ho rimosso il f: tag verbatim, e ora funziona correttamente. Io ancora non capisco il motivo per cui ha causato questo comportamento però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top