Bonjour,

J'essaye de me faire une petite application web en JSF pour me former au framework. J'ai un peu du mal à mettre en place ce que je veux. Je pense qu'il y a un truc que j'ai pas compris.

J'ai une page avec un Datatable qui affiche des données provenant d'une BDD. Dans ce DataTable j'ai un commandLink qui permet de charger le détail complet des informations de mon objet et de les afficher dans une nouvelle page.

Le code de la vue countries.xhtml (avec le datatable) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
                  <h:form>
			<h:dataTable value="#{countryBean.countries}" var="country" styleClass="countryTable" headerClass="countryTableHeader"
				rowClasses="countryTableOddRow,countryTableEvenRow">
				<h:column>
					<f:facet name="header">
						<h:outputText value="Code" />
					</f:facet>
					<h:outputText value="#{country.code}" />
				</h:column>
				<h:column>
					<f:facet name="header">
						<h:outputText value="Nom" />
					</f:facet>
					<h:outputText value="#{country.name}" />
				</h:column>
				<h:column>
					<h:commandLink action="#{countryBean.showCountryDetails(country.code)}">
						<img src="resources/images/loupe.png" width="20px" />
					</h:commandLink>
				</h:column>
			</h:dataTable>
		</h:form>
Le code du ManagedBean :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
@ManagedBean
@RequestScoped
public class CountryBean implements Serializable {
    private static final long serialVersionUID = -7737871761357537657L;
    private CountryDTO selectedCountry;
    private List<CountryDTO> countries;
 
    @EJB
    private CountryServicesManager countryServicesManager;
 
    private static final Logger LOG = Logger.getLogger(CountryBean.class);
 
    public List<CountryDTO> getAllCountries() {
        return countryServicesManager.getAllCountries();
    }
 
    public String showCountryDetails(String code) {
        LOG.debug("code pays sélectionné = " + code);
        CountryDTO countryDTO = new CountryDTO();
        countryDTO.setCode(code);
        countryDTO.setContinent("continent");
        countryDTO.setName("countryName");
        countryDTO.setPopulation(100000);
        countryDTO.setSurface(1000033787.98);
        selectedCountry = countryDTO;
        return "countryDetails";
    }
 
 
    public CountryDTO getSelectedCountry() {
        return selectedCountry;
    }
 
    public void setSelectedCountry(CountryDTO selectedCountry) {
        this.selectedCountry = selectedCountry;
    }
 
	public List<CountryDTO> getCountries() {
		if (countries==null) {
			countries = getAllCountries();
		}
		return countries;
	}
 
	public void setCountries(List<CountryDTO> countries) {
		this.countries = countries;
	}
 
}
Le code de ma 2ème page qui affiche simplement le détail d'un pays :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
                <p><span class="label">Code : </span> <h:outputText value="#{countryBean.selectedCountry.code}"/></p>
		<p><span class="label">Continent : </span> <h:outputText value="#{countryBean.selectedCountry.continent}"/></p>
		<p><span class="label">Surface : </span> <h:outputText value="#{countryBean.selectedCountry.surface}"/></p>
		<p><span class="label">Nombre d'habitants : </span> <h:outputText value="#{countryBean.selectedCountry.population}"/></p>
		<br/>
		<p><pretty:link mappingId="countries">Retour à la liste des pays</pretty:link></p>
Ce que je ne comprend pas c'est que quand je passe en debug dans ma méthode getCountries je remarque qu'elle est appelée de nombreuses fois. Pourquoi ? Elle devrait être appelée une seul fois lorsque la page countries.xhtml est chargée non ?
De plus quand je clique sur mon commandLink pour charger la page de détail à partir du code pays de la ligne choisie, je remarque que ma méthode getCountries est de nouveau exécutée et cela avant même que la méthode showCountryDetails (l'action de mon commandLink) ne soit appelée. Est-ce que je m'y prend mal ?

Merci d'avance pour votre aide.

EDIT : J'ai oublié de préciser que j'utilise MyFaces version 2.2.5. L'application est déployée dans un serveur glassfish version 4.1.