Domanda

Sto usando DataTable a pagina e mediante l'attributo di legame di legarsi al mio backing bean. Questo è il mio codice: -

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
            <h:form prependId="false">

                <h:dataTable var="item" value="#{testBean.stringCollection}" binding="#{testBean.dataTable}">
                    <h:column>
                        <h:outputText value="#{item}"/>
                    </h:column>
                    <h:column>
                        <h:commandButton value="Click" actionListener="#{testBean.action}"/>
                    </h:column>
                </h:dataTable>

            </h:form>

    </h:body>
</html>

Questa è la mia fagioli: -

package managedBeans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.html.HtmlDataTable;

@ManagedBean(name="testBean")
@ViewScoped
public class testBean implements Serializable {

    private List<String> stringCollection;

    public List<String> getStringCollection() {
        return stringCollection;
    }

    public void setStringCollection(List<String> stringCollection) {
        this.stringCollection = stringCollection;
    }

    private HtmlDataTable dataTable;

    public HtmlDataTable getDataTable() {
        return dataTable;
    }

    public void setDataTable(HtmlDataTable dataTable) {
        this.dataTable = dataTable;
    }

    @PostConstruct
    public void init(){
        System.out.println("Post Construct fired!!");
        stringCollection = new ArrayList<String>();
        stringCollection.add("a");
        stringCollection.add("b");
        stringCollection.add("c");

    }

    public void action(){
        System.out.println("Clicked!!");

    }
}

La prego di dirmi il motivo per cui è il @PostConstruct sparando ogni volta che clicca il bottone? Dovrebbe attiva una sola volta finché io sono sulla stessa pagina beacause il mio fagiolo è @ViewScoped. Inoltre, se rimuovere l'attributo di legame poi tutto funziona bene e @PostConstruct callback incendi solo una volta. Allora perché ogni volta quando uso vincolante attributo? Ho bisogno di legame attributi e voglia di eseguire attività di inizializzazione, come il recupero dei dati da webservice, ecc solo una volta. Cosa dovrei fare? Dove devo scrivere il mio compito di inizializzazione?

È stato utile?

Soluzione

Interessante, quando si utilizza vincolante per una vista componente limitato l'ambito di fagioli, le interruzioni di vista oscilloscopio.

Non sono sicuro se questo è un bug in JSF2, avrei dovuto leggere l'intera specifica JSF2 prima. Per quanto riguarda ora la soluzione migliore è quella di rilasciare il componente vincolante per la società e superare l'elemento selezionato tramite nuovo EL 2.2 metodo di sintassi dell'argomento:

<h:dataTable var="item" value="#{testBean.stringCollection}">
    <h:column>
        <h:outputText value="#{item}"/>
    </h:column>
    <h:column>
        <h:commandButton value="Click" action="#{testBean.action(item)}"/>
    </h:column>
</h:dataTable>

Vedi anche:


Aggiorna (dicembre 2012): questo è davvero un bug in JSF2. E 'una questione di pollo-uovo. La vista ambito chicchi vengono memorizzati nello stato di vista JSF. Quindi la vista ambito fagioli sono disponibili solo dopo il ripristino fase di vista. Tuttavia, i binding attributo viene eseguito durante il ripristino fase di vista, mentre la vista ambito fagioli non sono ancora disponibili. Questa creazione cause di una nuova istanza di bean vista ambito marchio, che viene poi sostituita dalla vera e propria vista bean con scope che è stato memorizzato in stato di visualizzazione JSF ripristinato.

Questo viene segnalato come JSF emissione 1492 e JSF spec isssue 787 che verrà fissato per JSF 2.2. Fino ad allora, la soluzione migliore è quella di utilizzare binding su richiesta di ambito fagioli esclusivamente, o per cercare modi alternativi per la particolare esigenza funzionale.


Aggiorna (marzo 2015): La correzione JSF 2.2 è stato backport per Mojarra 2.1.18. Quindi, se si sta ancora utilizzando JSF 2.0 / 2.1, faresti meglio aggiornamento almeno a quella versione. Vedi anche A.O. Che cosa è componente vincolante JSF? Quando si preferisce essere utilizzato? e JSTL in JSF2 Facelets ... ha un senso?

Altri suggerimenti

Come altro ha detto, direi che la cosa migliore da fare è far cadere componente vincolante (non è necessario qui).

Ma vorrei aggiungere che è possibile ottenere lo stesso che si sta cercando di fare in un object-oriented di moda di più utilizzando parametri di azione, in questo modo:

<h:commandButton value="Click" action="#{testBean.action(item)}"/>

... e nel codice Java:

  public void action(Item item){
    System.out.println("Clicked!!" + item);
}

Se si dispone di un fagiolo viewscoped e se si desidera mantenere i valori che sono stati inseriti nel modulo o non vogliono postconstruct sparato, si dovrebbe restituire null dal tuo metodo di azione.

Se si torna un po 'esito (ad esempio non valido) e quindi puntare l'esito non valida alla stessa pagina usando faces-config.xml, quindi il fagiolo viewscoped vengono ricreate e così provoca postconstruct al fuoco di nuovo.

Altro soluzione:

  • Rilegatura il HtmlDataTable in un fagiolo richiesta di ambito.
  • Inject questa richiesta portata di fagioli nel chicco vista oscilloscopio.

JBoss Seam utilizzare questa soluzione per componentes JSF legame ad una componente di ambito conversazione.

La risposta del balusc mi ha aiutato molto, vorrei dire che ho avuto il bug con mojarra versione 2.1.7, Attualmente sto usando 2.1.29-01 rilasciato nel gennaio 2015 e questo bug è stato risolto, il mio problema vincolava una visualizzazione a scheda ad un fagiolo viewscoped. Con questa versione non ho quel bug e vincolante e postconstruct sta lavorando bene. Io uso Jboss 5.2 e devo usare mojarra 2.1.x quindi spero questa risposta aiutare altre persone nella stessa situazione.

http://mvnrepository.com/artifact/ com.sun.faces / JSF-api / 2.1.29-01 http://mvnrepository.com/artifact/com.sun .faces / JSF-impl / 2.1.29-01

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