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.
- Comment invalider la session/implémenter la fonctionnalité « Logout » ?
- Comment modifier les messages d'erreur par défaut des validators JSF ?
- Comment récupérer par programmation la valeur d'un managed bean ?
- Comment récupérer un composant d'une page JSF depuis le code Java ?
- Comment récupérer la ligne active d'une dataTable ?
- Comment récupérer la ligne active d'une dataTable ? (2e méthode)
- Comment récupérer la ligne active d'une dataTable ? (3e méthode)
- Comment permettre/empêcher l'échappement des caractères sensibles avec <h:outputText> ?
- Comment exécuter une requête sans passer par les phases validation et conversion ?
- Comment journaliser les phases de l'application JSF ?
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(); |
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. |
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); |
Code java : | Sélectionner tout |
1 2 | Bean = (Bean)FacesContext.getCurrentInstance().getCurrentInstance() .getExternalContext().getSessionMap().get("bean"); |
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()); |
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 « : ». |
Code xml : | Sélectionner tout |
1 2 3 | <h:form id="monFormulaire" ...> <h:inputText id="monInput" ...> ... |
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. |
Code xml : | Sélectionner tout |
1 2 3 4 | <h:dataTable value="#{monBean.dataModel}" var="x" > : : </h:dataTable> |
Code java : | Sélectionner tout |
Object o = dataModel.getRowData();
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);
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()); } |
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
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> |
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" />
Code xml : | Sélectionner tout |
<h:outputText value="<hr>" escape="true" />
Le deuxième comportement est le comportement par défaut (escape=true). |
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" />
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; } } |
Code xml : | Sélectionner tout |
1 2 3 | <lifecycle> <phase-listener>package.LogPhaseListener</phase-listener> </lifecycle> |
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 |
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 çaLes 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 © 2024 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.