Dúvida quanto ao ManagedBean e o Modelo

20 respostas
P
No meu managedbean, eu faço a comunicação entre os facelets e os modelos. Então vem a dúvida, de qual melhor caminho a seguir. Veja abaixo o ManagedBean.
@ManagedBean(value="MostraEsc")
@SessionScoped

public class MostraEscolaAtiva {
   
    Escola escola;
   
    EscolaDaoImp edi = new EscolaDaoImp();
   
    public void handleToggle(ToggleEvent event) { 
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Fieldset Toggled", "Visibility:" + event.getVisibility());   
        FacesContext.getCurrentInstance().addMessage(null, msg); 
    }       
}
O que eu quero é criar um método que traga todas as escolas, dentro de uma condição do meu select. Esse select me trará o nome da escola e a sua direção, mas no meu XHTML eu coloco apenas o nome das escolas e em outra posição a direção da mesma. Então eu criei uma classe chamada EscolaImp. Conforme abaixo:
public class EscolaDaoImp implements EscolaDAO{

    @Override
    public Class<Escola> getEntityType() {
        return Escola.class;
    }
   
}

Ai eu pergunto. O método para trazer as escolas, deve estar implementado em EscolaImp, certo? O que eu coloco no meu ManagedBean? Só a chamada? Extender a classe EscolaImp e dar um new nela e chamar o método em questão ou não é bem assim?

20 Respostas

R

Se vc puder usar Spring fica ainda melhor:

@ManagedBean(value="MostraEsc")  
@SessionScoped  
  
public class MostraEscolaAtiva {  
     
    Escola escola;  
     @Resource
    EscolaDao dao;

public void buscarEscolas(){
   escolas  = dao.buscarEscolas();
}
caputojf1

Se, você estiver usando Spring você implementa em EscolaImpl e no MB…

@ManagedBean(value="MostraEsc")  
 @SessionScoped  
 @Controller  
 public class MostraEscolaAtiva {  
      
     Escola escola;  

     @Resource 
     EscolaDaoImp edi;  
      
     public void handleToggle(ToggleEvent event) {   
         FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Fieldset Toggled", "Visibility:" + event.getVisibility());     
         FacesContext.getCurrentInstance().addMessage(null, msg);   
     }         
 }

e utilizar sua impl normalmente.

P

O fato é que eu não consigo ntrazer escola nenhuma no meu XHTML. Lá no outputtext value = "#{MostraEsc.NomeMétodoTrazEscola}">; não vem nada nele. Entã, a questã é que falta também a conexão com o banco dados e nesses exemplos que passei não tem ele. Em que momento ou em em que classe eu faço a conexão? Na EscolaDaoImp? Ou como fazer. Eu tenho muita dúvida nesses passos. Preciso dar esse resultado até amanhã, ou seja, fazer listar as escolas no meu XHTML e fechar esse ciclo. Aí bate o desespero. Fiquei ontem todo domingo para resolver isso. Li muito, mas agora preciso por em prática e falta a mim alguns conceitos. Talvez eu não esteja conseguindo passar a minha dúvida, acho que esse é o problema. Não uso SPRING não, acho que vai complicar mais a minha dúvida.

P

Este é o select que deve trazer as escolas do professor logado.

select distinct p.nome as "Professor",p.sobrenome as "SobreNome",e.nome as "Escola",m.situacao as "Situação" from pessoa p inner join professor f on (p.idpessoa = f.idpessoa) inner join matricula m on (m.idprofessor = f.idprofessor) inner join escola e on (e.idescola = m.idescola) where m.situacao = 'A'
Onde eu coloco ele para listar as escolas?

caputojf1

Cara aí depende…
Que tipo de conexão você vai fazer…JDBC, vai utilizar Hibernate, Hibernate + JPA…

Você tem que criar um método que vai retornar o seu Objeto “Escola” ou uma lista de Escola(List).
Esse método vai ficar na sua impl.

P

Uso Hibernate/JPA. O meu método é mais ou menos esse, mas está dando erro no Return, pois ele tá pedindo para fazer um cast no Add cast to ‘query’

public List<Escola> findAll() { Query query = (Query) em.createQuery("select distinct p.nome ,p.sobrenome , " + "e.nome as , m.situacao " + "from " + "pessoa p inner join professor f on (p.idpessoa = f.idpessoa) " + "inner join matricula m on (m.idprofessor = f.idprofessor) " + "inner join escola e on (e.idescola = m.idescola)" + "where m.situacao = 'A'"); return query.getResultList(); }

R

Pelo contrário,usando Spring iria facilitar tua vida um bocado.

Recomendo que mais pra frente vc dê uma olhada.

R

pjava:
Uso Hibernate/JPA. O meu método é mais ou menos esse, mas está dando erro no Return, pois ele tá pedindo para fazer um cast no Add cast to ‘query’

public List<Escola> findAll() { Query query = (Query) em.createQuery("select distinct p.nome ,p.sobrenome , " + "e.nome as , m.situacao " + "from " + "pessoa p inner join professor f on (p.idpessoa = f.idpessoa) " + "inner join matricula m on (m.idprofessor = f.idprofessor) " + "inner join escola e on (e.idescola = m.idescola)" + "where m.situacao = 'A'"); return query.getResultList(); }

tenta dar um (List<Escola> ) query.getResultList();

caputojf1

Como está o import da sua Query??

import javax.persistence.Query;

Outra coisa…

return  (List<Escola>) query.getResultList();
caputojf1

e uma dica…

no seu atributo em…
não pegue direto o atributo da classe.

Implemente esse método e utilize para criar a query

protected EntityManager getEntityManager()
	{
		if (this.entityManager == null)
			throw new IllegalStateException("Erro");
		return this.entityManager;
	}


 public List<Escola> findAll() {  
           Query query =  getEntityManager().createQuery("select distinct p.nome ,p.sobrenome , " +  
                                                "e.nome as , m.situacao " +   
                                                "from " +  
                                                  "pessoa p inner join professor f on (p.idpessoa = f.idpessoa) " +  
                                                  "inner join matricula m on (m.idprofessor = f.idprofessor) " +  
                                                  "inner join escola e on (e.idescola = m.idescola)" +  
                                                  "where m.situacao = 'A'");  
           return (List<Escola>) query.getResultList();  
 }
P

Não funcionou. Continua com o erro. Ele pede o cast de qualquer forma. Será os imports?

caputojf1

faltou o set…rsrs

segue.

@PersistenceContext
	public void setEntityManager(EntityManager em) {
		this.entityManager = em;
	}
P

Cara, fica dando erro no entityManager. Coloquei com o ‘E’ maiúsculo e continua dando o mesmo erro, que não é possível resolver entityManager. Aí ele pede para criar uma constante e se eu crio, dá pau no query. Tá uma zona e ainda não consegui listar nada na minha página.

P
Ficou assim meu managedBean
@ManagedBean(value="MostraEsc")
@SessionScoped

public class MostraEscolaAtiva {
	
	private static final int List = 0;
	private static final int Escola = 0;
	private DataModel listaEscola;
	private EntityManager em; 
	
	public void handleToggle(ToggleEvent event) {  
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Fieldset Toggled", "Visibility:" + event.getVisibility());    
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }  	
	
	public void setListaEscola(DataModel listaEscola) {
		this.listaEscola = listaEscola;
	}

	public DataModel getListaEscola(){
		List&lt;Escola&gt; lista = new EscolaDaoImp().list();
		listaEscola = new ListDataModel(lista);
		return listaEscola;
	}
	public EntityManager getEm() {
		return em;
	}

	public void setEm(EntityManager em) {
		this.em = em;
	}

	public static int getList() {
		return List;
	}
	
   protected EntityManager getEntityManager()  
    {  
        if (this.em == null)  
            throw new IllegalStateException("Erro");  
        return this.em;  
    }  
      
   @PersistenceContext  
   public void setEntityManager(EntityManager em) {  
       this.em = em;  
   } 
      
    public List&lt;Escola&gt; findAll() {    
              Query query =  getEntityManager().createQuery("select distinct e.nome " +     
                                                            "from " +    
                                                            "pessoa p inner join professor f on (p.idpessoa = f.idpessoa) " +    
                                                            "inner join matricula m on (m.idprofessor = f.idprofessor) " +    
                                                            "inner join escola e on (e.idescola = m.idescola)" +    
                                                            "where m.situacao = 'A'");    
              return (List&lt;Escola&gt;) query.getResultList();    
    }  
}
É isso mesmo? Eu troquei o entityManager para[color=red] em[/color], pois esse é o atributo. Eu ainda não entendi o que tenho que fazer agora startar o PostgreSql e listar. Para listar é somente isso: value = #{MostraEsc.findAll}; É só isso que eu coloco nop meu XHTML? Pq isso eu fiz e nada aconteceu, acho que tem problema ainda no banco para startar ele pelo java e etc..
P

a opção de fazê-lo, como por exemplo o web.xml, hibernate.cfg.xml e etc… Não me aparece a opção Persistence.xml. Se for do zero como faço e onde coloco, se no WebContent, src e etc…?

caputojf1

Como assim erro para startar o PostGree??
Você está usando JPA, certo?
Onde está seu arquivo de Persistence.xml?

Se ele estiver configurado corretamente, quando você chamar sua impl ele já faz a conexão com o banco.

no xhtml , vc deve chamar seu #{managedBean.metodoQueRetornaSuaLista}

P

Onde se coloca o Persistence.xml? Na pasta WebContente ou na pasta src ou Web-Inf?

caputojf1

No meu projeto eu coloquei dentro de META-INF

P

Criei esse arquivo Persistence.xml e tá dando erro. Dá erro na primeira linha, do tipo:
The processing instruction target matching"[xX][mM][lL]" is not allowed

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"&gt; &lt;persistence-unit name="maindatabasePU" transaction-type="RESOURCE_LOCAL"&gt; &lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt; &lt;properties&gt; &lt;property name="hibernate.connection.driver_class" value="org.postgresql.Driver" /&gt; &lt;property name="hibernate.connection.username" value="postgres" /&gt; &lt;property name="hibernate.connection.password" value="123" /&gt; &lt;property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5435/Escola" /&gt; &lt;property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /&gt; &lt;property name="hibernate.show_sql" value="true" /&gt; &lt;/properties&gt; &lt;/persistence-unit&gt; &lt;/persistence&gt;

caputojf1
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
	<persistence-unit name="SUA_PERSISTENCIA_UNIT">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<properties>
			<property name="hibernate.archive.autodetection"               value="class, hbm" />
			<property name="hibernate.dialect"                             value="org.hibernate.dialect.Oracle10gDialect" />
			<property name="hibernate.connection.driver_class"             value="oracle.jdbc.driver.OracleDriver" />
			<property name="hibernate.connection.url"                      value="jdbc:oracle:thin:@xxxxx:1521:SEUBANCO"/>
			<property name="hibernate.default_schema"                      value="SEUESQUEMA"/>
			<property name="hibernate.connection.username"                 value="USER" />
			<property name="hibernate.connection.password"                 value="PSW" />
			<!--<property name="hibernate.transaction.factory_class"           value="org.hibernate.transaction.JTATransactionFactory"/>
			 <property name="hibernate.transaction.manager_lookup_class"    value="org.hibernate.transaction.WeblogicTransactionManagerLookup"/>  
			<property name="hibernate.transaction.flush_before_completion" value="true"/>
			<property name="hibernate.transaction.auto_close_session"      value="true"/>	-->
		</properties>
	</persistence-unit>	
</persistence>
Criado 2 de maio de 2011
Ultima resposta 2 de mai. de 2011
Respostas 20
Participantes 3