Componentes do JSF nao aparecem

Pessoal, boa noite.

Ja vi alguns topicos do GUJ com os termos que pus no titulo, mas ainda nao consegui chegar a uma solucao.
Criei algumas paginas XHTML, e estava funcionando (com Primefaces), os componentes eram renderizados normalmente.
Mas implementei uma validacao de sessao com filtros, e dentro dele, fiz um forward pra pagina de login (/login.xhtml).

A partir dai, as minhas paginas nao funcionam mais.
Ja parei o tomcat, gerei o projeto novamente, etc e tal.

As outras pessoas que tiveram esse problema, era relacionado a JAR’s que faltavam ou a indicacao do /faces/ na URL.
No meu caso, estava funcionando (apesar de que algumas paginas que crio apresentarem o mesmo problema).

Quando executo o projeto, a tela fica em branco. E olhando o codigo fonte, os componentes estao la, mas na forma como esta meu arquivo fonte (<p:inputText…> etc).

Alguem ja passou por algo? Ou sabe o porque disso?

Obrigado.

poste o cod de validacao que vc criou e que começou a dar erro a patir dele.

Desculpe, esqueci disso:

Filtro - ValidaSessao.java

@Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        System.out.println("Cheguei no filtro...");
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;

        if (!this.validar((HttpServletRequest) req)) {
            request.getRequestDispatcher(PAGINA_DE_LOGIN).forward(req, res);
        } else {
            //Desativa o cache do browser  
            response.setHeader("Cache-Control", "no-store");
            response.setHeader("Pragma", "no-cache");
            response.setDateHeader("Expires", 0);
            //Processa request e response  
            chain.doFilter(req, res);
        }
        System.out.println("Sai do filtro...");
    }

web.xml

<servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <filter>  
        <filter-name>VerificaSessao</filter-name>  
        <filter-class>filtro.ValidaSessao</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>VerificaSessao</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping> 

login.xhtml


<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"      
      xmlns:p="http://primefaces.prime.com.tr/ui" 
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Masotti - Identificação</title>
        <link rel="stylesheet" type="text/css" href="css/base.css" />
        <link rel="icon" href="img/dexter.ico" type="image/ico" />
    </h:head>
    <body>
       <f:view>
        <div id="blocoLogin">                        
            <h:form id="frm" prependId="false">
                <p:messages showDetail="false" />
                <h:panelGrid id="telaLogin" columns="2">
                    <h:outputLabel styleClass="rotulo" for="login" value="Usuário" />
                    <h:panelGroup>
                        <p:inputText size="30" id="login" value="#{loginController.usuario.login}" styleClass="entrada" required="true" requiredMessage="Informe o usuario"/>
                        <p:message for="login" showDetail="true" />
                    </h:panelGroup>
                    <h:outputLabel styleClass="rotulo" for="senha" value="Senha:" />
                    <h:panelGroup>
                        <p:password feedback="false" id="senha" value="#{loginController.usuario.senha}" size="30" minLength="10" styleClass="entrada" required="true" requiredMessage="Informe a senha" />
                        <p:message for="senha" />
                    </h:panelGroup>
                    <h:outputLabel styleClass="rotulo" for="blogin" />
                    <p:commandButton id="blogin" value=" Entrar " ajax="false" actionListener="#{loginController.doLogin}" />
                    <h:outputLabel for="esqueciSenha" />
                    <p:commandLink ajax="false" value="Esqueci a senha" id="esqueciSenha" action="/recuperarSenha.xhtml" />
                </h:panelGrid>
            </h:form>
        </div>
        </f:view>
    </body>
</html>

loginController.java


package controller;

import dao.Dao;
import entidade.Usuario;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;

@ManagedBean(name = "loginController")
@SessionScoped
public class LoginController {

    private Usuario usuario;

    public LoginController() {
        this.usuario = new Usuario();
    }

    public void doLogin() {
        Dao dao = new Dao();
        Criterion criterioLogin[] = new Criterion[2];
        criterioLogin[0] = Restrictions.eq("login", this.usuario.getLogin());
        criterioLogin[1] = Restrictions.eq("senha", this.usuario.getSenha());
        List resultado = dao.listarCondicional(Usuario.class, criterioLogin);
        Usuario usuarioLogado = null;
        if (resultado.isEmpty() ||
            resultado.size() != 1) {
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,
                    "Usuario e/ou senha invalidos",
                    "Informe corretamente os dados e tente novamente"));
        } else {
            usuarioLogado = (Usuario) resultado.get(0);
        }
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        session.setAttribute("usuarioLogado",usuarioLogado);
        System.out.println("Coisado...");
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
}

Obrigado

Como que você está chamando seu link?

Tipo: http://localhost:8080/projeto/asd.jsf ?

response.setHeader("Cache-Control", "no-store"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0);
Tente tirar essas propriedades e testar. Uma vez tive o mesmo problema e era alguma dessas propriedades, não vou lembrar exatamente qual agora :slight_smile:

Obrigado pelas respostas…

jakefrog: Eu estou chamando com htt://localhost:8084/projeto/faces/login.xhtml

Cesar: Tentei tirar a limpeza de cache, mas nao deu certo.

Acho que o problema eh o filtro mesmo, pois se eu removo ele, aparece o formulario.
Mais precisamente, a parte do

request.getRequestDispatcher(PAGINA_DE_LOGIN).forward(req, res);

Existe algum outro tipo de redirect que eu possa fazer pra testar?

Obrigado

Navegação estática. :wink:

Humm

Navigation rules? Seria isso?

Tem o response.sendRedirect(). [=

Teve algum ponto final nesse assunto, estou com o mesmo problema.

Fala brow,

Então, depois de apanhar alguns dias, chegamos a conclusão que os componentes não apareciam devido ao filtro, mas pelo seguinte:

Eu havia posto uma condição para redirecionar se o usuário não estivesse logado.
Mas o filtro obviamente pega toda requisição, inclusive de imagens, css e Javascript…

Eu consegui resolver colocando exceções no filtro, pra quando for esse tipo de recurso, o filtro não pegar.

Abraço!