Nous utilisons JSF 2 + Primefaces + Glassfish + CDI/WELD pour le développement. Nous avons un datalist/dataTable des listes de livres sur notre page search.xhtml, chacun rendu comme un outputLink. En cliquant sur une entrée, view.xhtml est affiché avec tous les détails du livre. Voici le code dans notre search.xhtml qui est invoquée:JSF 2 - Validation des paramètres de vue et de redirection
<h:outputLink value="${request.contextPath}/viewBook.xhtml?id=${book.id}">${book.title}
</h:outputLink>
Dans le viewBook.xhtml, basé sur le livre Id passé dans l'URL, les détails sont renseignés avant de rendre la page comme suit:
<f:metadata>
<f:viewParam name="id" value="#{bookBean.id}"/>
</f:viewParam>
<f:event type="preRenderView" listener="#{bookBean.populate}" />
</f:metadata>
notre exigence est de valider l'identité avant de rendre la page et si non présent dans notre base de données, nous devons rediriger vers une page d'erreur ou afficher le msg d'erreur sur la même page à savoir la recherche Page
nous avons essayé valider l'ID du livre de deux manières différentes: 1. A l'aide de validation dans la méthode populate comme suit
if (bookFound)
{
//Display details
}
else
{
FacesContext fc = FacesContext.getCurrentInstance();
fc.addMessage("id", new FacesMessage("No such book found in the system. Please try again."));
fc.renderResponse();
}
En accrochant un validateur personnalisé dans le view.xhtml et lancer une exception validateur (Faces messages) sur l'écran. Nous utilisons CDI-WELD, donc nous pouvons utiliser l'injection.
<f:metadata> <f:viewParam name="id" value="#{bookBean.id}"/> <f:validator validatorId="bookIdValidator"/> </f:viewParam> <f:event type="preRenderView" listener="#{bookBean.populate}" /> </f:metadata>
Ces deux approches fonctionnent mais ils montrent l'erreur sur l'écran d'affichage, pas l'écran de recherche. Il est possible de rediriger vers une page d'erreur en utilisant le code:
FacesContext.getCurrentInstance().getExternalContext().redirect("/error.xhtml");
- Y at-il un moyen de gérer la validation de telle sorte que les messages d'erreur sont affichés sur la page de recherche, où le outputLink est cliqué. Nous comprenons que nous devons gérer la validation sur la page de recherche, mais comment associer un validateur à h: outputLink. Pouvons-nous utiliser h: link alternativement (Nous devons utiliser les requêtes GET, pas POST ... donc utiliser un commmandLink ou un bouton n'est pas faisable)
Y a-t-il une meilleure façon de rediriger vers une page d'erreur que celle que nous faisons? il.
(FacesContext.getCurrentInstance() getExternalContext() redirect ("/ error.xhtml")..)
Les pointeurs seraient grandement appréciés.
Merci et salutations
Salut GargantuChet, Merci pour votre réponse. Bien que nous comprenions que nous pouvons faire ce travail en utilisant commandButtons et commandLinks, nous voulons utiliser les requêtes 'GET' et non 'POSTS'. Par conséquent, le lien de sortie. Pouvons-nous utiliser des alternatives? Merci, gkari – gkari
Puis-je demander pourquoi GET est nécessaire au lieu de POST? C'est-à-dire, quels bénéfices obtenez-vous en utilisant GET que vous souhaitez préserver? – GargantuChet