Passar parametros para construtor do ManagedBean

9 respostas
mateusviccari

Boa tarde, estou iniciando o desenvolvimento de um template de CRUD em JSF.
Nessa aplicação vai existir várias telas de crud, minha idéia é fazer com que todas essas páginas usem o mesmo managed bean, pra isso o managedBean deve receber alguns parametros, como o tipo da classe que a tela trabalha, as colunas da tabela de pesquisa, etc…
A idéia é usar esses parametros pra inicializar os componentes do crud.
Porém como todos sabem, o managedbean é construído automaticamente pelos frameworks que itilizamos pra programar em java web.

Tem como fazer isso que eu quero?

9 Respostas

Hebert_Coelho

Até hoje não ouvi falar de algo tão genérico assim como você quer.

Já teve essa discussão aqui mas não se chegou a nenhuma resposta ou solução concreta.

jeffev

Você pode trabalhar com um bean genérico onde todos os outros bean irão implementar ele.

Acho que não seria uma boa trabalhar somente com 1 único bean.

mateusviccari

É possível fazer herança de managedBean?

Hebert_Coelho

mateusviccari:
É possível fazer herança de managedBean?
Sim. Mas não o tipo de herança que pessoas que querem um CRUD genérico funcione.
Não adianta na super classe colocar List<?> valores ou List. Não vai funcionar.

mateusviccari

Alguma outra idéia pra mim fazer isso ? Lá no swing era fácil de fazer, mas swing ta morrendo…

Hebert_Coelho

mateusviccari:
Alguma outra idéia pra mim fazer isso ? Lá no swing era fácil de fazer, mas swing ta morrendo…
Novamente, até agora não.

mateusviccari

Tive uma idéia aqui que parece que da certo.
Eu crio o managedBean principal, que seria o template, e nele eu tenho uma instancia de uma classe Configuracoes. Nessa classe é que eu defini o comportamento dos itens do template, por ex.: Gravar, consultar, excluir…
E possuo um outro managedBean, de requestScoped, pra cada tipo de classe que vai ser usada no template, esse managedBean tem a função getConfiguracoes, que retorna a configuração previamente definida, e seto ele na classe template através de um comando.
Aí a primeira coisa que faço quando tenho uma pagina que vai usar o template é transmitir essa configuração do managedBean requestScoped pra variavel configuracoes do template, e o resto faço a partir dessas configurações…

Não sei se expliquei direito mas se alguem quiser fazer algo parecido responde aqui e trocamos uma idéia.

Hebert_Coelho

mateusviccari:
Tive uma idéia aqui que parece que da certo.
Eu crio o managedBean principal, que seria o template, e nele eu tenho uma instancia de uma classe Configuracoes. Nessa classe é que eu defini o comportamento dos itens do template, por ex.: Gravar, consultar, excluir…
E possuo um outro managedBean, de requestScoped, pra cada tipo de classe que vai ser usada no template, esse managedBean tem a função getConfiguracoes, que retorna a configuração previamente definida, e seto ele na classe template através de um comando.
Aí a primeira coisa que faço quando tenho uma pagina que vai usar o template é transmitir essa configuração do managedBean requestScoped pra variavel configuracoes do template, e o resto faço a partir dessas configurações…

Não sei se expliquei direito mas se alguem quiser fazer algo parecido responde aqui e trocamos uma idéia.

Beleza, o que você definiu é o mesmo que já foi dito acima. O “ideal” de um CRUD genérico é isso que você falou.

Agora faz um teste. Tente criar um MB genérico e tente fazer um datatable apontando para uma lista.

OBS.: é possível criar diversas funções em comum dentro os MBs, mas nunca vi alguém conseguir um CRUD completo. Se você conseguir, eu vou mostrar esse post para todos os outros posts criados sobre esse assunto. [=

mateusviccari
O que eu fiz foi o seguinte:
<p:tab title="Consulta" titleStyle="font-size: small;">
                    <p:dataTable style="font-size: small" id="tabelaConsulta" var="obj" value="#{managedBeanTemplate.objetos()}" paginator="true" rows="10">
                        <ui:insert name="tabelaConsulta"/>
                    </p:dataTable>
                </p:tab>
No meu managed bean o objetos esta assim
public ArrayList objetos(){
        return configuracoes.objetos();
    }
E a minha classe configurações é uma classe abstrata, aí eu implemento essa classe em varios managedBeans do tipo requestScoped, só pra carregar as configurações, como no exemplo:
@ManagedBean(name="managedBeanUnidade")
@RequestScoped
public class ManagedBeanUnidade extends Configuracoes implements Serializable {

    @Override
    public ArrayList objetos() {
        try {
            PreparedStatement pst = ConnectDb.getConnection().prepareStatement("select * from Unidade");
            ArrayList al = JdbcUtil.convertResultSetIntoList(Unidade.class, pst.executeQuery());
            return al;
        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<Unidade>();
        } finally {
            ConnectDb.closeCurrentConnection();
        }
    }
    
    public Configuracoes getConfiguracoes(){
        return new ManagedBeanUnidade();
    }
    
}
Aí depois disso, na tela de cada crud é so transferir a configuração desse managedBean request pro managedBean do template, dessa forma que eu fiz ja ta funcionando a DataTable:
<ui:composition template="/template/template.xhtml">
        
        <ui:define name="carregarConfiguracoes">
            #{managedBeanTemplate.setConfiguracoes(managedBeanUnidade.configuracoes)}
        </ui:define>
        
        <ui:define name="tabelaConsulta">
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Sigla" />
                </f:facet>
                <h:outputText value="#{obj.unida5descr}" />
            </p:column>
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Descrição" />
                </f:facet>
                <h:outputText value="#{obj.unida15descr}" />
            </p:column>
        </ui:define>
    </ui:composition>
Por enquanto está sendo feita a inclusão manual das colunas, mas pretendo fazer algo pra ele fazer isso automaticamente, usando esse esquema da transferencia de configurações.
Criado 29 de outubro de 2012
Ultima resposta 29 de out. de 2012
Respostas 9
Participantes 3