Ao Davi mas outros podem postar também
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.
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
Curtidas 0
Respostas
Robson Teixeira
10/05/2011
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.
GOSTEI 0
Davi Costa
10/05/2011
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
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
GOSTEI 0
Pjava
10/05/2011
Mas dá erro. Essa é a classe LoginDAO
LoginDAO usuario = (LoginDAO) getSession().getAttribute("usuarioLogado");
Agora a outra linha dá erro
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
GOSTEI 0
Davi Costa
10/05/2011
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
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
GOSTEI 0
Pjava
10/05/2011
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;
}
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;
}
GOSTEI 0
Pjava
10/05/2011
Aqui tá vindo NULL, pois eu debuguei e foi isso q encontrei.
Assim chamo o em
Query query = em.createQuery(comando); listEscola = query.getResultList();
Assim chamo o em
private EntityManager em = EntityManagerFactorySingleton.getInstance().createEntityManager();
GOSTEI 0
Davi Costa
10/05/2011
Mais especificamente oquê está vindo?
O atributo da httpSession ou a consulta do banco?
Att Davi
O atributo da httpSession ou a consulta do banco?
Att Davi
GOSTEI 0
Pjava
10/05/2011
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; } }
GOSTEI 0
Davi Costa
10/05/2011
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
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
GOSTEI 0
Pjava
10/05/2011
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.
GOSTEI 0
Pjava
10/05/2011
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();*/
/*HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
LoginControle loginControle = (LoginControle) session.getAttribute("LoginControle");
Login login = loginControle.getLogin();*/
GOSTEI 0
Pjava
10/05/2011
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(); }
GOSTEI 0
Davi Costa
10/05/2011
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
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
GOSTEI 0
Pjava
10/05/2011
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"; }}
GOSTEI 0
Davi Costa
10/05/2011
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
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
GOSTEI 0
Pjava
10/05/2011
Nesse caso, o meu objeto é o login e pegar o getidlogin() acho, certo?
GOSTEI 0
Davi Costa
10/05/2011
No seu caso o objeto é o login né... depois de fazer um getAtribute, vc trabalha com o seu objeto normalmente.
Mas lembrando, o parametro que vai em getAtributte deve bater com o que foi colocado no login, e eledeve colocar o objeto recuperado do banco login e não um boolean.
Att Davi
Mas lembrando, o parametro que vai em getAtributte deve bater com o que foi colocado no login, e eledeve colocar o objeto recuperado do banco login e não um boolean.
Att Davi
GOSTEI 0
Pjava
10/05/2011
Realmente eu não consegui fazer funccionar e paguei por isso. Mas tudo bem, não posso desistir. O projeto começou errado, com diretrizes erradas também. banco de dados mau modelados, não que isso foi a gota para mim. O que faltou para mim, foi experiencia com Java, coisa que eu não tenho. Essa foi minha primeira experiencia.Continuo em casa. Trouxe o projeto pra casa e agora vou tentar fazer funcionar e aprender em cima do que errei. Eu agradeço muito a vocês, muito mesmo.
GOSTEI 0
Dyego Carmo
10/05/2011
Envie o codigo fonteao meu email e eu vou te ajudar a resolver...
Valeu !
Valeu !
GOSTEI 0