2011-06-17 4 views
1

Je suis nouveau à JSF et en utilisant JSF2 pour construire une webapp qui a plusieurs pages. J'utilise un bean scoped de session pour garder certains paramètres qui ont été définis en parcourant les différentes pages.validation avant rendu page

Lorsque la session expire (ou que je redéploie l'application) et que j'accède à une page spécifique, cette page n'est pas capable de s'afficher correctement car certaines données sont manquantes dans la session. À ce stade, je veux que la page d'accueil soit affichée.

Je souhaite utiliser ce mécanisme pour toutes les pages. Donc, en général, je veux faire une validation avant de rendre une page et diriger l'utilisateur vers la page d'accueil si la validation échoue.

Comment dois-je gérer cela?

+0

question similaire (et réponses) [ici] (http://stackoverflow.com/q/1438351/620338) –

+0

Dans mon cas d'utilisation, avec un délai d'attente de la session, je signifie que les données de mon bean session ne sont plus disponibles. C'est ce à quoi je veux répondre en redirigeant l'utilisateur vers une page différente. J'ai aussi un problème quand j'obtiens une exception ViewExpiredException mais c'est un problème différent. – thehpi

Répondre

4

Dans ce cas particulier, j'utiliserais un simple filter qui se connecte aux requêtes JSF et vérifie la présence du bean géré dans la session. L'exemple ci-dessous suppose ce qui suit:

  • FacesServlet est DÉFINIES dans web.xml comme <servlet-name>facesServlet</servlet-name>
  • Votre session SCOPED haricot a un nom de bean géré de yourSessionBean.
  • Votre page d'accueil se trouve à home.xhtml

@WebFilter(servletName="facesServlet") 
public class FacesSessionFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 
     HttpSession session = request.getSession(false); 

     if (!request.getRequestURI().endsWith("/home.xhtml") && (session == null || session.getAttribute("yourSessionBean") == null)) { 
      response.sendRedirect(request.getContextPath() + "/home.xhtml"); // Redirect to home page. 
     } else { 
      chain.doFilter(req, res); // Bean is present in session, so just continue request. 
     } 
    } 

    // Add/generate init() and destroy() with empty bodies. 
} 

Ou si vous voulez le faire plus JSF-ish, ajouter un <f:event type="preRenderView"> au modèle maître.

<f:metadata> 
    <f:event type="preRenderView" listener="#{someBean.preRenderView}" /> 
</f:metadata> 

avec

@ManagedProperty(value="#{yourSessionBean}") 
private YourSessionBean yourSessionBean; 

public void preRenderView() { 
    if (yourSessionBean.isEmpty()) { 
     yourSessionBean.addPage("home"); 
     FacesContext.getCurrentInstance().getExternalContext().redirect("/home.xhtml"); 
    } 
} 
+0

thanx BalusC. Je préférerais en effet la solution JSF-ish. Je l'ai essayé mais quand le bean de session est vide alors il entre dans une boucle sans fin. Donc, je dois probablement rediriger seulement quand je ne suis pas sur la page d'accueil (comme votre première solution). Je vais essayer comme vous l'avez décrit. – thehpi

+0

Cela a du sens. Vous souhaitez modifier le bean session d'une manière ou d'une autre afin que la condition évalue false après la redirection. J'ai édité la réponse. Vous pouvez également faire ce travail dans '@ PostConctruct' d'un bean géré associé à' home.xhtml'. – BalusC

+0

Est-ce que vous voulez dire ici que yourSessionBean.addPage ("home") fait que le return yourSessionBean.isEmpty() est faux? – thehpi

Questions connexes