Ao Davi mas outros podem postar também

10/05/2011

0

Eu falei ao Davi é porque ele que enviou essa solução:

public FacesContext getFacesContext() {
        return FacesContext.getCurrentInstance();
    }

public HttpSession getSession() {
        return (HttpSession) getFacesContext().getExternalContext().getSession(false);
    }

Assim vc recupera a session e para salvar ou chamar um atributo na session basta:

getSession().setAttribute("usuarioLogado", ordemProducao.getCodigoOP());


Usuario usuario = (Usuario) getSession().getAttribute("usuarioLogado");

Esse getSession não entendi o que coloco em ordemProducao... Eu tenho uma classe Login(Apenas validacao) e LoginDAO que persiste e etc... Esse tipo Usuario equivale a que? Para mim LoginDAO, mas dá erro nessa implementação.
Pjava

Pjava

Responder

Posts

10/05/2011

Robson Teixeira

primeiro vc vai recuperar o seu usuario do banco conforme ja discutido em outro post acredito e esse ordemProdução pode ser 1 obj de negocio que traz o objeto do tipo usuario isso so foi 1 exemplo para vc dado pelo davi no caso vc vai usar o seu LoginDAO e vai trazer o seu Usuario e chamar o setAttribute do mesmo jeito que ta ai.
Responder

10/05/2011

Davi Costa

Exatamente o que o robson flw,
talvez seja interessante vc pesquisar como recuperar esse session do glassfish.
Akele lib que havia comentado antes é da servlet api, caso não funcione add essse jar, vc pode pesquisar como recuperar a session da app pelo glassfish.

Att Davi
Responder

10/05/2011

Pjava

Mas dá erro. Essa é a classe LoginDAO
public class LoginDAO extends DAOGenerico<Login> {    
    public LoginDAO(EntityManager em) {
        super(em);
    }
    @SuppressWarnings("unchecked")
    public List<Login> buscaLogin(String loginProcurado) {        
        Query q = em.createQuery("from Login l where l.login = :loginProcurado");
        q.setParameter("loginProcurado", loginProcurado);
        List<Login> listaLogin = q.getResultList();         
        return listaLogin;
    }    
    @SuppressWarnings("unchecked")
    public List<Login> getLogins(){
        Query q = em.createQuery("from Login");
        List<Login>listLogin = q.getResultList();
        return listLogin;
    }    
}

LoginDAO usuario = (LoginDAO) getSession().getAttribute("usuarioLogado");
Agora a outra linha dá erro
Responder

10/05/2011

Davi Costa

Explica melhor o que está dando erro, tá muito confuso.
Vc deve pegar não uma lista, mas sim um único resultado.
basta filtrar pelo login e senha.
Caso a consulta do banco seja diferente de vazio vc usa um setAtribute("usuario", objeto);
Na session httpSession, não é em outra session não.
Cuidado com a separação de camadas como falei, não é interessante mantermos um httpSession na camada de negócio não.Veja os conceitos de SOLID(
http://lellysinformatica.com/blog/2011/05/pilula-de-arquitetura-principios-solid/
http://ianntech.com.br/2011/01/09/principios-solid-de-desenvolvimento-oo-the-open-closed-principle/)...
em miúdos onde eu kero chegar, cada camada cuida do seu.


Dá uma olhada nesses links:

http://netbeans.org/kb/docs/javaee/ecommerce/manage-sessions_pt_BR.html

http://www.slideshare.net/joaosavio/minicurso-java-server-faces

http://www.caelum.com.br/curso/fj-21-java-web/   (baixa o pdf)


Att davi
Responder

10/05/2011

Pjava

Consigo pegar com o código abaixo o usuário logado. A query é montada, mas na página vem vazia, mas pelo log do glassfish ela tá correta a query.
List <Escola> listEscola = null;
        try {
           
            HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            LoginControle loginControle = (LoginControle)   session.getAttribute("LoginControle");
            Login login = loginControle.getLogin();
           
            //em.getTransaction().begin();
           
            String comando = "select distinct esc from Escola esc ,Matricula mat" +
                                " where mat.idescola = esc.idescola" +
                                " and mat.idpessoa =  " + login.getPessoa().getIdPessoa() +
                                " and mat.situacao = 'A' order by esc.nome";
           
            Query query =  em.createQuery(comando);   
            listEscola = query.getResultList();//Quero por um break aqui e não tá parando
           
        } catch (Exception e) {
            e.printStackTrace();
           
            //if(em.getTransaction().isActive()){
                //em.getTransaction().rollback();
            //}
        }finally{
            em.close();
        }       
        return listEscola;   
    }
Responder

10/05/2011

Pjava

Aqui tá vindo NULL, pois eu debuguei e foi isso q encontrei.
Query query =   em.createQuery(comando);    
            listEscola = query.getResultList();

Assim chamo o em
private EntityManager em = EntityManagerFactorySingleton.getInstance().createEntityManager();   
Responder

10/05/2011

Davi Costa

Mais especificamente oquê está vindo?
O atributo da httpSession ou a consulta do banco?


Att Davi
Responder

11/05/2011

Pjava

o meu query.getResultList() ou esse em.createQuery(comando) ele tá vindo null. A query está correta e ele pega o usuário logado. Abaixo meu Singleton
public class EntityManagerFactorySingleton {
    private static EntityManagerFactory instancia = null;    
    private EntityManagerFactorySingleton() {        
    }    
    public static EntityManagerFactory getInstance() {        
        if (instancia == null){
            instancia = Persistence.createEntityManagerFactory("puMosaicoDigital");
        }
        return instancia;        
    }
}


Responder

11/05/2011

Davi Costa

Cara n tem como dar um System.out.println.. nesses atributos que vc desconfiam que estão nulos?
Já que não consegue debugar., pq o ieal seria debugar, como vc diz q a query está correta, pelo que o sql do console gera?.. é isso? pq se ele mostra a query no console, em.createQuery(comando) não está null que até a query ele executou, por isso gera sql no console.

Att Davi
Responder

11/05/2011

Pjava

Então, não sei o que houve, mas hoje eu executo a app e nada mais aparece no console, a não ser as querys de login. Essa aí não apareceu mais. Já rodei várias vezes e até mesmo reiniciei o eclipse e nada. Prefiro assim, aí sei que o em.createQuery() não está funcionando, pelo que parece. Para debugar eu debugo, mas quando chega na parte de criar o EntityManager ele fica pedindo o hibernate-entitymanager.jar. Mas eu já tenho ele no meu classpath. Já remivi ele, baixei outra versão e mesmo assim ele pede novamente. Não tenho muita afinidade com o debug do Eclipse não. Só sei do F5 e F6 para rodar de uma vez. Não sei como pular uma linha e ir para onde quero. Vou colocar um S.o.p para ver o printa no console.
Responder

11/05/2011

Pjava

Descobri o erro, mas preciso resolver e não sei. O erro está no HTTPSession em meu método. Comentei ele e passei o parâmtro na mão, aí funcionou. Coloquei uns S.o.p em vários lugares. Com a session, eu coloquei um S.o.p antes e e printou Entrando no método. E depoi mais nenhum S.o.p foi printado no console. Comentei o cara e aí todos foram printados. Isso quer dizer que ao executar o HttpSession, ele vai pro catch, chama o finally e o retur, consequentemente vem Null. Abaixo o código comentado. Vou executar ele em outro método(só ele), carregar uma variável e jogar no meu findAll() e ver o q acontece.

/*HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            LoginControle loginControle = (LoginControle)   session.getAttribute("LoginControle");
            Login login = loginControle.getLogin();*/
Responder

11/05/2011

Pjava

Isso não funciona realmente. Ou todo o método ou a forma de pegar o usuário. Ou uma ou outra está errada.
public int retornaLogado(){
        System.out.println("Entrando no HttpSession");
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        LoginControle loginControle = (LoginControle)   session.getAttribute("LoginControle");
        Login login = loginControle.getLogin();
        
        System.out.println("Novo valor de idpessoa: " + login.getPessoa().getIdPessoa());
        
        return login.getPessoa().getIdPessoa();
    }

Responder

11/05/2011

Davi Costa

cara seguinte se vc na hora que logou não colou oobjeto na session ele não vai conseguir recuperar com o get, obviamente se não existe lá.
Na ação de logar no sistema vc deve colocar:
session.setAttribute("LoginControle", seuObjeto);

Para aí sim num momento futuro vc recuperar com:

session.getAttribute("LoginControle");


Att Davi
Responder

11/05/2011

Pjava

Então, essa é a classe de login. Essa classe eu não a fiz, foi um colega aqui. O q tá passando aqui é q o diálogo tá ruim. Eu não estou num time, então ele faz alterações e me mata, pois não me avisa. Ferindo a regra básica do SCRUM, pois scrum é confiança na pessoa e nada mais, bem mas isto é outra coisa, nada a ver com o forum e vamos lá. Esse é o cara.
public class LoginControle {    
    private Login login = new Login();
    private boolean logado = false;
    public boolean isLogado() {
        return logado;
    }
    public void setLogado(boolean logado) {
        this.logado = logado;
    }
    public String entrar(){        
        Login loginValidado = login.validaLogin(getLogin()) ;
        String ret = null;        
        if(loginValidado == null){            
            ResourceBundle bundle = CapturaLocale.getBundleLocale();
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, 
                    bundle.getString("msgLoginSenhaInvalidos"), null);
            FacesContext.getCurrentInstance().addMessage(null, message);            
        }else{            
            setLogin(loginValidado);
            String tipoPessoa = loginValidado.getPessoa().getTipoPessoa().getValor();            
            if(tipoPessoa.equalsIgnoreCase(EnumTipoPessoa.P.getValor())){
                ret = "professor";
            }else if(tipoPessoa.equalsIgnoreCase(EnumTipoPessoa.A.getValor())){
                ret = "aluno";
            }else if(tipoPessoa.equalsIgnoreCase(EnumTipoPessoa.C.getValor())){
                ret = "coordenador";
            }else if(tipoPessoa.equalsIgnoreCase(EnumTipoPessoa.R.getValor())){
                ret = "administrador";
            }            
            HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            logado = true;
            session.setAttribute("autenticado", true);
        }        
        return ret;
    }    
    public String sair(){        
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        session.removeAttribute("autenticado");        
        setLogin(new Login());
        return "sair";
    }}

Responder

11/05/2011

Davi Costa

Pronto beleza na sua classe vc coloca :
session.getAttribute("autenticado");

Só que ele está colocando na session é true.. rsrs
ele deveria colocar o objeto Usuario do seu sistema, e caso o login falhe não coloca nada na session, para vc recuperaro usuario logado da app.

Att Davi
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar