Como implementar managed-beans com JSF + DAO?

8 respostas
C

Em um contexto de qualquer aplicação simples JSF, teremos nossos managed-beans mapeados (seja em escopo de requisição ou sessão ou enfim).
No meu projeto, estou implementando o padrão DAO para acesso ao banco de dados, ou seja, para um bean Pessoa (que está mapeada como managed-bean no faces-config), tenho PessoaDAO.

A dúvida vem no momento de construir um data table usando um List: qual seria a melhor arquitetura/maneira/forma para proporcionar o retorno de um objeto colletion de managed-beans para uma página jsf?

A apostila que estava seguindo propõe criar um outro bean, chamado PessoaLista, que é basicamente uma classe que possui um List, e está mapeada como managed-bean, assim poderia ser referenciado na tela, e na declaração do construtor, poderia chamar método da DAO que pretendo usar para preencher esta lista, mas não acho isso nada elegante.

Outra ideia que tive era sobre mapear a própria classe DAO como um managed-bean (desconsiderando detalhes como qual seria o escopo), mas acho que poderia isso quebrar a implementação da arquitetura do padrão DAO (está implementado juntamente com o padrão factory) (ainda não tenho certeza sobre essa afirmação, não pensei tanto assim ainda rsrs).

Conclusão: Alguém sabe uma boa maneira de se arquitetar classes de projeto JSF + DAO?

Obrigado.

8 Respostas

C

Acabei de baixar um exemplo de projeto no qual usam dominios (pojos) E vision objects (managed-beans) e não são iguais… implementarei esta camada de visão a mais no meu projeto :slight_smile:

B

Cara,

A idéia de implementar o DAO como ManagedBean é péssima uahiuahuh

Mas vamos lá

Depender da complexidade de sua tela você poderia adicionar o DAO no seu ManagedBean da sua página JSF.

Na minha humilde opinião é desnecessário criar um ManagedBean apenas para oferecer uma collection para um datatable

L
chimufox:
A dúvida vem no momento de construir um data table usando um List: qual seria a melhor arquitetura/maneira/forma para proporcionar o retorno de um objeto colletion de managed-beans para uma página jsf?

Eu implemento a classe controler para cada tabela e crio um List tipado (List)

@ManagedBean(name = "entradaCargosBBean")
@ViewScoped
public class EntradaCargosBackingBean implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Cargo cargo = new Cargo();

public List<Cargo> getCargos() {
		InterfaceDAO<Cargo> cargoDAO = new HibernateDAO<Cargo>(Cargo.class,	FacesContextUtil.getRequestSession());
		return cargoDAO.getBeansByExample(this.getCargo());
	}

para o JSF passo assim:

<p:dataTable id="tabela" value="#{entradaCargosBBean.cargos}"
					var="cargo" binding="#{cargoBean.tabela}"
					emptyMessage="sem registros" scrollable="true" height="100" style="font-size:12px;" >
					
					<p:column headerText="Descrição" footerText="Descrição" style="width:150px;"
						filterMatchMode="contains" filterBy="#{cargo.descricao}" >
						<h:outputText value="#{cargo.descricao}" />
					</p:column>
					<p:column headerText="Salário" footerText="Salário"	style="width:100px;">
						<h:outputText value="#{cargo.salario}" >
							<f:convertNumber pattern="R$ #,##0.00" />
						</h:outputText>
					</p:column>
					<p:column headerText="Comissão" footerText="Comissão" style="width:100px;">
						<h:outputText value="#{cargo.salariocomissao}" >
							<f:convertNumber pattern="R$ #,##0.00" />
						</h:outputText>
					</p:column>
					<p:column style="width:100px">
						<p:commandButton image="ui-icon-pencil" title="Alterar"	action="#{cargoBean.alterar}" update="formPrincipal"/>
						<p:commandButton image="ui-icon-trash" title="Remover" oncomplete="confirmdlg.show()"> 
							<f:setPropertyActionListener value="#{cargo}" target="#{cargoBean.tipoCargoSelecionado}" />
						</p:commandButton>
					</p:column>
				</p:dataTable>
E

Chamar o DAO no get voce quebra com o sistema , o JSF para renderizar essa lista em seu ciclo de vida chama varias vezes o “get” do objeto .

Agora imagine que vc vai renderizar uma página, desta forma vc vai abrir e fechar varias conexões com o banco o que não é seu objetivo ;D

L

obrigado pela dica ErickMacedo, me ajudaria muito se apresentasse tb uma solução para isso…

E

Normal…

Exemplo :

Ao inves de vc chamar o DAO em um get do objeto vc criar um metodo por exemplo buscar e popula a lista :

pessoas = pessoaDAO.buscarTodos();

essa lista “pessoas” é a mesma lista que esta associada há uma data table

C

Obrigado a todos pelas respostas, como é minha primeira abordagem ao JSF, os posts estão me ajudando a explorar melhor esta arquitetura do framework… :smiley:

D

da pra fazer assim tbm:

public class EntradaCargosBackingBean implements Serializable{  

    private static final long serialVersionUID = 1L;  
    private Cargo cargo = new Cargo();  
    private List&lt;Cargo&gt; listaCargos;
  
public List&lt;Cargo&gt; getCargos() {  
     if(listaCargos==null){
        InterfaceDAO&lt;Cargo&gt; cargoDAO = new HibernateDAO&lt;Cargo&gt;(Cargo.class, FacesContextUtil.getRequestSession());  
        listaCargos = cargoDAO.getBeansByExample(this.getCargo());  
     }
     return listaCargos;
}
&lt;p:dataTable id="tabela" value="#{entradaCargosBBean.listaCargos}"  
                    var="cargo" binding="#{cargoBean.tabela}"  
                    emptyMessage="sem registros" scrollable="true" height="100" style="font-size:12px;" &gt;  
...

ai quando vc precisar que ele realmente busque novamente…
da um listaCargos=null… :wink:

assim ele não acaba acessando o banco toda hora…

Criado 18 de janeiro de 2012
Ultima resposta 15 de ago. de 2012
Respostas 8
Participantes 5