FAQ JSFConsultez toutes les FAQ

Nombre d'auteurs : 8, nombre de questions : 70, dernière mise à jour : 10 juin 2008  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.


SommaireTrucs et astuces (10)
précédent sommaire
 

Il suffit d'invoquer ce traitement depuis une action dans un managed bean :

Code java : Sélectionner tout
1
2
3
((HttpSession) FacesContext.getCurrentInstance().getExternalContext() 
  
				.getSession(true)).invalidate();
Cette action peut être invoquée depuis un commandButton ou un commandLink.

Mis à jour le 10 juin 2008 Sniper37

Consultez le fichier message.properties contenu dans l'archive jar de l'implémentation JSF utilisée. Récupérez les clefs des messages que vous voulez modifier et reportez-les dans votre propre fichier de bundle. Ensuite déclarez ce fichier de bundle dans le fichier de configuration faces-config.xml :

Code xml : Sélectionner tout
1
2
<message-bundle> 
      mon.package.vers.mon.fichier.bundle</message-bundle>
Le fichier mon.package.vers.mon.fichier.bundle ne
doit pas être suffixé par l'extension .properties.

Mis à jour le 12 février 2008 fabszn

Méthode 1 : utilisation de JSF value binding :

Code xml : Sélectionner tout
1
2
3
4
FacesContext context = FacesContext.getCurrentInstance() 
		.getCurrentInstance(); 
SessionBean = (SessionBean) context.getApplication() 
		.createValueBinding("#{sessionBean}").getValue(context);
Méthode 2 : accéder directement à la session à l'aide de ExternalContext :

Code java : Sélectionner tout
1
2
Bean = (Bean)FacesContext.getCurrentInstance().getCurrentInstance() 
	.getExternalContext().getSessionMap().get("bean");
Méthode 3 : utilisation de JSF Value Expression :

Code java : Sélectionner tout
1
2
3
4
5
FacesContext context = FacesContext.getCurrentInstance(); 
ManagedBean bean = (ManagedBean) context.getApplication() 
		.getExpressionFactory().createValueExpression( 
				context.getELContext(), "#{managedBean}", 
				ManagedBean.class).getValue(context.getELContext());

Mis à jour le 12 février 2008 Sniper37

Avec le code suivant :

Code java : Sélectionner tout
1
2
3
UIComponent monComponent = (UIComponent) FacesContext 
		.getCurrentInstance().getViewRoot().findComponent( 
				"idDuComposant");
À noter que l'identifiant du composant doit être son identifiant complet,
c'est-à-dire préfixé par les identifiants de tous les composants
implémentant l'interface NamingContainer et séparés par des « : ».
Par exemple, dans le code suivant :

Code xml : Sélectionner tout
1
2
3
<h:form id="monFormulaire" ...> 
    <h:inputText id="monInput" ...> 
    ...
Alors l'identifiant complet de l'inputText sera « monFormulaire:monInput ».

Mis à jour le 12 février 2008 romaintaz

Il est parfois pratique d'ajouter sur chaque ligne d'une DataTable un lien cliquable (commandLink) ou un bouton (commandButton) qui permet de réaliser une action sur l'élément affiché sur cette ligne.

Pour pouvoir récupérer ensuite l'élément actif dans l'action déclenchée, il faut attacher l'attribut value du composant dataTable à un javax.faces.model.DataModel au lieu de l'attacher directement à une liste.

Voici la déclaration d'un DataModel dans un managedBean :

Code xml : Sélectionner tout
private DataModel dataModel = new ListDataModel();
DataModel est une interface tout comme List tandis que ListDataModel est une implémentation tout comme ArrayList.
Il faut ensuite pointer vers dataModel comme value d'une dataTable :

Code xml : Sélectionner tout
1
2
3
4
<h:dataTable value="#{monBean.dataModel}" var="x" > 
: 
: 
</h:dataTable>
Puis, suite à un clic sur un commandLink ou un commandButton sur une ligne, et dans l'action appelée, il suffit de faire :

Code java : Sélectionner tout
Object o = dataModel.getRowData();
pour récupérer l'objet représenté par la ligne active.
Il faut ensuite le caster vers son type d'origine.

Pour alimenter un DataModel avec une liste (List), on procède comme suit :
Code xml : Sélectionner tout
dataModel.setWrappedData(uneListeQuelconque);

Mis à jour le 12 février 2008 djo.mos

Il est parfois pratique d'ajouter sur chaque ligne d'une DataTable un lien cliquable (commandLink) ou un bouton (commandButton) qui permet de réaliser une action sur l'élément affiché sur cette ligne.

JSF propose des méthodes pour récupérer directement l'objet Java se trouvant sur la ligne contenant le lien sur lequel l'utilisateur a réalisé le clic.

Le composant Datatable (ou tout composant étendant UIData) de JSF propose en effet les méthodes getRowData() et getRowIndex() qui retournent respectivement l'objet et son index correspondant à la ligne du tableau sur laquelle l'utilisateur a cliqué sur un lien.

On pourra alors écrire dans son bean (selectionneElement est l'actionListener du lien cliquable affiché sur une ligne du tableau) :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void selectionneElement(ActionEvent evt) { 
    // On récupère la datatable. 
    HtmlDataTable table = getParentDatatable((UIComponent) evt.getSource()); 
    // On récupère l'objet affiché à la bonne ligne de la datatable. 
    Object o = table.getRowData(); 
    // On récupère aussi son index 
    int index = table.getRowIndex(); 
    // Suite du traitement sur l'objet sélectionné. 
} 
  
private HtmlDataTable getParentDatatable(UIComponent compo) { 
    if (compo == null) { 
        return null; 
    } 
    if (compo instanceof HtmlDataTable) { 
        return (HtmlDataTable) compo; 
    } 
    return getParentDataTable(compo.getParent()); 
}

Mis à jour le 12 février 2008 romaintaz

Il est parfois pratique d'ajouter sur chaque ligne d'une DataTable un lien cliquable (commandLink) ou un bouton (commandButton) qui permet de réaliser une action sur l'élément affiché sur cette ligne.

Pour pouvoir récupérer ensuite l'élément actif dans l'action déclenchée, il faut ajouter le composant setPropertyActionListener comme fils du composant qui déclenche l'action.

Exemple
On déclare un champ qui servira à récupérer l'objet de la ligne sélectionnée (du type fictif Car) :

Code xml : Sélectionner tout
private Car selectedCar
Il faut ensuite pointer vers dataModel comme value d'une dataTable :

Code xml : Sélectionner tout
1
2
3
4
5
6
7
8
<h:dataTable value="#{monBean.cars}" var="c" > 
  <h:column> 
    <h:commandButton value="supprimer" action="#{monBean.delete}">    
      <f:setPropertyActionListener value="#{c}" 
		target="#{monBean.selectedCar}" /> 
    </h:commandButton>     
  <h:column> 
</h:dataTable>
Puis, suite à un clic sur le commandButton d'une ligne, et dans l'action appelée, on est assuré que le champ selectedCar contient l'objet de type Car correspondant à la ligne contenant le bouton qui a déclenché le clic.

Mis à jour le 1er février 2008 djo.mos

En utilisant l'attribut escape du composant <h:outputText>.
Ainsi, l'exemple suivant affiche une ligne horizontale :

Code xml : Sélectionner tout
<h:outputText value="<hr>" escape="false" />
Tandis que l'exemple suivant affiche le texte <hr>

Code xml : Sélectionner tout
<h:outputText value="<hr>" escape="true" />
Le deuxième comportement est le comportement par défaut (escape=true).

Mis à jour le 12 février 2008 djo.mos

En mettant l'attribut immediate de l'élément qui déclenche l'action (commandButton, commandLink) à true.

Code xml : Sélectionner tout
<h:commandButton action="#{monManagedBean.monAction}" immediate="true" />

Mis à jour le 12 février 2008 Sniper37

Il faut créer un PhaseListener qui implémente l'interface javax.faces.event.PhaseListener :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class LogPhaseListener implements javax.faces.event.PhaseListener { 
	private static final long serialVersionUID = -4395863677889457550L; 
	private static final org.apache.log4j.Logger log = org.apache.log4j.Logger 
			.getLogger(LogPhaseListener.class); 
  
	public void afterPhase(javax.faces.event.PhaseEvent e) { 
		log.debug("afterPhase " + e.getPhaseId()); 
	} 
  
	public void beforePhase(javax.faces.event.PhaseEvent e) { 
		log.debug("beforePhase " + e.getPhaseId()); 
	} 
  
	public javax.faces.event.PhaseId getPhaseId() { 
		return javax.faces.event.PhaseId.ANY_PHASE; 
	} 
}
Il faut ensuite le déclarer dans faces-config.xml :

Code xml : Sélectionner tout
1
2
3
<lifecycle> 
	<phase-listener>package.LogPhaseListener</phase-listener> 
</lifecycle>
Ainsi, à l'affichage d'une page JSF, on peut voir ceci :

Code xml : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DEBUG (LogPhaseListener.java:17) - beforePhase RESTORE_VIEW 1 
DEBUG (LogPhaseListener.java:13) - afterPhase RESTORE_VIEW 1 
DEBUG (LogPhaseListener.java:17) - beforePhase APPLY_REQUEST_VALUES 2 
DEBUG (LogPhaseListener.java:13) - afterPhase APPLY_REQUEST_VALUES 2 
DEBUG (LogPhaseListener.java:17) - beforePhase PROCESS_VALIDATIONS 3 
DEBUG (LogPhaseListener.java:13) - afterPhase PROCESS_VALIDATIONS 3 
DEBUG (LogPhaseListener.java:17) - beforePhase UPDATE_MODEL_VALUES 4 
DEBUG (LogPhaseListener.java:13) - afterPhase UPDATE_MODEL_VALUES 4 
DEBUG (LogPhaseListener.java:17) - beforePhase INVOKE_APPLICATION 5 
DEBUG (LogPhaseListener.java:13) - afterPhase INVOKE_APPLICATION 5 
DEBUG (LogPhaseListener.java:17) - beforePhase RESTORE_VIEW 1 
DEBUG (LogPhaseListener.java:13) - afterPhase RESTORE_VIEW 1 
DEBUG (LogPhaseListener.java:17) - beforePhase RENDER_RESPONSE 6 
DEBUG (LogPhaseListener.java:13) - afterPhase RENDER_RESPONSE 6

Mis à jour le 6 mars 2008 djo.mos Sniper37

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsables bénévoles de la rubrique Java Web : Mickael Baron - Robin56 -