J’ai trouvé un problème lorsque vous utilisez le ou
dans une page d’inclure la et
associées à la `` composant n’est simplement pas invoquée. Quelles sont les causes possibles et solutions pour cela ?
Réponses
Trop de publicités?Chaque fois qu'un UICommand
composant ne parvient pas à invoquer l'action associée méthode ou un UIInput
élément ne parvient pas à mettre à jour la valeur de modèle, puis vérifiez les points suivants:
UICommand
etUIInput
des composants doivent être placés à l'intérieur d'unUIForm
composant, par exemple,<h:form>
.Vous ne pouvez pas imbriquer plusieurs
UIForm
composants les uns dans les autres. C'est à savoir illégales en HTML. Attention à inclure des fichiers!Pas de
UIInput
de la valeur de la validation ou de la conversion d'erreur doit avoir été produite. Vous pouvez utiliser<h:messages>
pour afficher tous les messages qui ne sont pas représentés par une entrée spécifique<h:message>
composants. N'oubliez pas d'inclure l'id
de<h:messages>
dans la<f:ajax render>
, le cas échéant, de sorte qu'il sera mis à jour, ainsi que sur les requêtes ajax.Si
UICommand
ouUIInput
des composants sont placés à l'intérieur d'une itération composant (<h:dataTable>
,<ui:repeat>
,, etc, alors vous devez vous assurer que exactement le mêmevalue
de la composante a été conservé au cours de l'appliquer les valeurs de demande phase de la soumettre le formulaire de demande. JSF va savoir réitérer plus à trouver le lien cliqué bouton/et soumis valeurs d'entrée. Mettre la fève dans la portée de vue et/ou de faire en sorte que vous chargez le modèle de données en@PostConstruct
de la fève (et donc pas dans une méthode de lecture!) devrait résoudre le problème.L'
rendered
de l'attribut de composant et tous les composants parent ne doit pas évaluer à l'false
au cours de l'appliquer les valeurs de demande phase de la soumettre le formulaire de demande. JSF va savoir le réactiver ensuite dans le cadre de mesures de protection contre trafiqué piraté demandes. Mettre la fève dans la portée de vue et/ou de faire en sorte que vous êtes preinitializing la condition en (post), le constructeur de la fève devrait résoudre le problème. La même chose s'applique à l'disabled
attribut du composant, ce qui ne devrait pas évaluer à l'true
lors du traitement du formulaire de soumission.L'
onclick
attribut de l'UICommand
du composant et de l'onsubmit
attribut de l'UIForm
composant ne doit pas renvoyerfalse
ou causer une erreur JavaScript. Il devrait en cas d'<h:commandLink>
ou<f:ajax>
également pas de JS erreurs dans le document. Dans les navigateurs récents vous pouvez appuyer sur la touche F12 pour obtenir sur le web développeur d'outils avec la JS console. Tous les JS erreurs seront enregistrées. Généralement googler le message d'erreur exact vais déjà vous donner la réponse.Si vous êtes en utilisant JSF 2.x
<f:ajax>
sur la commande de composants, assurez-vous que vous avez un<h:head>
dans le maître-modèle, à la place de l'<head>
. Sinon JSF ne sera pas en mesure d'auto-include nécessairesjsf.js
fichier JavaScript qui contient les fonctions Ajax. Ce résultat serait une erreur de JavaScript comme "mojarra est pas défini" dans le JS de la console.Si l'un des parents de l'
<h:form>
avec l'UICommand
bouton est été rendus/mis à jour par une requête ajax à l'avance, puis la première action échouera toujours. La deuxième et les suivantes actions de travail. Cela est dû à un bogue dans l'état d'affichage de la manipulation qui est déclaré comme JSF éd. 790 et actuellement prévue pour être fixée dans JSF 2.3. Pour les anciens JSF versions, vous devez explicitement spécifier l'ID de l'<h:form>
dans larender
de la<f:ajax>
, ou pour utiliser le script dans cette réponse.Si l'
<h:form>
aenctype="multipart/form-data"
ensemble afin de soutenir le fichier de téléchargement, vous devez vous assurer que le filtre de servlet qui est responsable de l'analyse multipart/form-data " demande est correctement configuré, sinon l'FacesServlet
finirez toujours pas de paramètres de la requête à tous, et ainsi ne pas être en mesure d'appliquer les valeurs de demande. Comment faire pour configurer un filtre dépend de l'upload de fichier du composant utilisé. Pour Tomahawk<t:inputFileUpload>
, cochez cette réponse et pour PrimeFaces<p:fileUpload>
, cochez cette réponse. Ou, si vous êtes réellement pas le téléchargement d'un fichier, puis supprimez l'attribut en tout.Assurez-vous que l'
ActionEvent
argument de l'actionListener
estjavax.faces.event.ActionEvent
et n'est donc pasjava.awt.event.ActionEvent
, ce qui est ce que la plupart des IDEs suggèrent que la 1ère option d'auto-complétion.Assurez-vous qu'aucun
PhaseListener
ou toutEventListener
dans la requête-réponse de la chaîne a changé la JSF le cycle de vie d'ignorer l'invoquer la phase d'action, par exemple, en appelantFacesContext#renderResponse()
ouFacesContext#responseComplete()
.Assurez-vous qu'aucun
Filter
ouServlet
dans la même requête-réponse de la chaîne a bloqué la demande fo l'FacesServlet
en quelque sorte.
Mon pari que votre problème est causé par le point 2: des formulaires imbriqués. Vous avez probablement déjà un <h:form>
dans la page parent qui enveloppe le fichier include. Le fichier à inclure lui-même devrait pas avoir un <h:form>
. Vous pouvez également le fixer à l'inverse, s'assurer que le parent n'est pas d' avoir un <h:form>
autour de la place de l'include de fichier.
Si votre est à l’intérieur d’une
il y a une autre raison pourquoi les h:commandLink peuvent ne pas fonctionner :
La source de données sous-jacente qui est liée à la `` doivent également être disponibles dans le deuxième JSF-du cycle de vie qui est déclenché lorsque l’utilisateur clique sur le lien.
Donc, si la source de données sous-jacente est demande étendue, le `` ne fonctionne pas !
Tandis que ma réponse n'est pas de 100% applicable, mais la plupart des moteurs de recherche de trouver ce que le premier succès, j'ai décidé de le poster néanmoins:
Si vous êtes à l'aide de PrimeFaces (ou similaire API) p:commandButton
ou p:commandLink
, les chances sont que vous avez oublié d'ajouter explicitement process="@this"
sur votre commande de composants.
Comme le PrimeFaces de l'Utilisateur de Guider les états dans la section 3.18, les valeurs par défaut pour process
et update
sont à la fois @form
, dont pratiquement tout oppose les valeurs par défaut que vous pourriez vous attendre à partir de la plaine de JSF f:ajax
ou RichFaces, qui sont execute="@this"
et render="@none"
respectivement.
Juste m'a fallu un looong moment de découvrir. (... et je pense que c'est plutôt unclever pour utiliser les valeurs par défaut qui sont différentes de JSF!)
Si vous avez utilisé en
tag, voir cette réponse : http://stackoverflow.com/a/6763215/1189324