2011-06-02 2 views
2

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(); 
} 
  1. 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"); 
  1. 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)
  2. 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

Répondre

1

gkari,

Peut-on utiliser JSF pour la navigation? Je ne suis pas familier avec WELD, mais une solution pure-JSF pourrait fonctionner comme suit. Cela suppose que vous avez un bean backing appelé bookBean. Il devrait avoir une propriété appelée id, avec un getter (getId) et un setter (setId).

  1. Créez une méthode vierge dans votre bean backing. Il ne doit pas prendre de paramètres et retourner une chaîne.

    String viewBook() { 
        // We'll fill this in later. 
        return "success"; 
    } 
    
  2. Changer votre h:outputLink à un h:commandLink, qui appelle la nouvelle méthode:

    <h:commandLink action="#{bookBean.viewBook}" /> 
    
  3. Mise à jour le lien avec une action pour définir id propriété bookBean lorsque le lien est activé:

    <h:commandLink action="#{bookBean.viewBook}"> 
        <f:setPropertyActionListener 
         target="#{bookBean.id}" 
         value="#{book.id}" /> 
    </h:commandLink> 
    
  4. Mettez à jour la nouvelle méthode dans votre backing bean pour effectuer le travail nécessaire idation et renvoie une chaîne indiquant le succès ou l'échec:

    String viewBook() { 
        String result; 
    
        if (bookIdIsValid (this.getId()) { 
         result = "success"; 
        } else { 
         result = "error"; 
        } 
    
        return result; 
    } 
    
  5. Créer des règles de navigation dans votre visage-config.xml pour acheminer vers la cible correcte, en fonction du code de résultat:

    <navigation-rule> 
        <from-view-id>/search.xhtml</from-view-id> 
        <navigation-case> 
         <from-action>#{bookBean.viewBook}</from-action> 
         <from-outcome>success</from-outcome> 
         <to-view-id>/viewBook.xhtml</to-view-id> 
        </navigation-case> 
        <navigation-case> 
         <from-action>#{bookBean.viewBook}</from-action> 
         <from-outcome>error</from-outcome> 
         <to-view-id>/error.xhtml</to-view-id> 
        </navigation-case> 
    </navigation-rule> 
    

Cela permet au bean backing d'indiquer le résultat à JSF et la bibliothèque JSF gère la redirection vers l'emplacement approprié.

+0

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

+0

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

0

Il semble que le problème que vous rencontrez est que vous créez un FacesMessage sur une page mais que vous voulez qu'il s'affiche sur un autre. Vous aurez besoin de stocker le FacesMessage dans la session des utilisateurs (ou éventuellement une portée de vie plus courte si disponible), puis le retirer sur la page dans laquelle vous voulez l'afficher.

Il y a quelques tentatives d'automatisation de ce:

Il y a un champ d'application Flash JSF 2 et une setKeepMessages méthode. Vous pouvez essayer cela, mais je n'ai pas eu beaucoup de chance avec ça.

Il est de copier-coller solution d'écouteur de phase discuté ici: http://ocpsoft.com/java/persist-and-pass-facesmessages-over-page-redirects/

Affichage des messages à travers réoriente est également une caractéristique de Seam 3.

Questions connexes