[JSF] Meu get executa duas vezes, como resolver?

5 respostas
F

Olá!!
Pessoal, estou tentando fazer uma consulta SIMPLES no banco de dados. mas estou me deparando com um problema muito chato!

Eu quero fazer uma consulta simples no banco de dados, do tipo “select atributos from tabela where codigo = x”

tenho um metodo Get que faz isso, e busca o codigo que alguem digitar

MASS

o get faz isso duas vezes, e na segunda vez, o codigo esta ZERADO

conclusão:
Na tela nao aparece resultado algum, pois o codigo pesquisado acabou sendo o codigo zero.

alguem sabe porque isso acontece e como resolver este problema??

desde ja, obrigado!!!

5 Respostas

luciano2

Cara,

Já tive um problema com isso e era porque a página tava sendo submetida no onclick e no onSubmit tava executando a mesma função.

W

Cara, posta seu código ai, mas me parece que é mais um caso deste aqui : http://www.guj.com.br/posts/list/207165.java#1054230

F

Vou postar alguns trechos do meu codigo!

Aqui é a tela:

<f:view>
    <h1>Banda Encontrada com sucesso</h1>
    <h:form>
        <h:dataTable value="#{banda.banda}" var="banda" border="2">
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Cód" />
                </f:facet>
                <h:inputText value="#{banda.codigo}" />
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Nome" />
                </f:facet>
                <h:inputText value="#{banda.nome}" />
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Estilo" />
                </f:facet>
                <h:selectOneMenu value="#{banda.estilo.codigo}">
                        <f:selectItem itemLabel="Selecione um estilo" itemValue="0" />
                        <f:selectItems value="#{banda.estilos}" />  
                    </h:selectOneMenu>
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Integrantes" />
                </f:facet>
                <h:inputText value="#{banda.integrantes}" />
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Site Oficial" />
                </f:facet>
                <h:inputText value="#{banda.siteOficial}" />
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Excluir/Alterar Banda" />
                </f:facet>
               <h:commandButton value="Excluir" action="#{banda.exclui}"></h:commandButton>
               <h:commandButton value="Alterar" action="#{banda.altera}"></h:commandButton>
            </h:column>
        </h:dataTable>
    </h:form>
    <br>
    <a href="index.jsp">Voltar ao menu</a>
</f:view>
A minha get que está repitindo duas vezes!
public Banda getBanda(){
        
        BandaDao bandaDao = new BandaDao();
        Banda banda = new Banda();
        banda = bandaDao.getByCodigo(banda.getCodigo()); 
        return banda;
    }
Metodo com resultado para navigation rule
public String buscaPorCodigo(){
    
         result="naoEncontrado";
         BandaDao bandaDao = new BandaDao();
             if(bandaDao.getByCodigo(codigo)!= null)
                 result = "encontrado";
     return result;
 }
o metodo DAO eu tenho quaser certeza que esta certo, mas ai vai ele:
public Banda getByCodigo(int codigo) {
        Connection c = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Banda banda = new Banda();

        try {
            c = ConnectionFactory.getInstance().getConnection();
            StringBuilder sb = new StringBuilder();
            sb.append("select codigo\n");
            sb.append("     , nome\n");
            sb.append("     , codigoEstilo\n");
            sb.append("     , integrantes\n");
            sb.append("     , siteOficial\n");
            sb.append("  from banda\n");
            sb.append(" where codigo = ?");
            ps = c.prepareStatement(sb.toString());
            ps.setInt(1, codigo);
            rs = ps.executeQuery();
            banda = null;
            if (rs.next()) {
                banda = new Banda();
                banda.setCodigo(rs.getInt("codigo"));
                banda.setNome(rs.getString("nome"));
                EstiloDao estiloDao = new EstiloDao();
                banda.setEstilo(estiloDao.getByCodigo(rs.getInt("codigoEstilo")));
                banda.setIntegrantes(rs.getInt("integrantes"));
                banda.setSiteOficial(rs.getString("siteOficial"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

            try {
                if (ps != null) {
                    ps.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

            try {
                if (c != null) {
                    c.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return banda;
    }
W

Exato, agora leia o tópico que te passei. Lá está a resposta para o que você precisa.

A solução é criar um método que vai ser chamado por uma action lá da página

B

FullBend:
Vou postar alguns trechos do meu codigo!

Aqui é a tela:


Não se usa tabela só para exibir sempre um item (ali era pra ser uma lista)… mas tudo bem isso não algo funcional :wink:

isso é comportamento do jsf, portanto, seja com 1 ou 10 gets referenciados na tela, sempre vão acontecer duas chamadas para cada um.

linha 3: pra q essa instancia de Banda se o dao vai retornar outro objeto por cima?
linha 4: se vc acabou de instanciar Banda ao não carregar qualquer propriedade o parametro dessa busca sempre vai estar vazio.

deveria ser algo assim:

public Banda getBanda(){ return new BandaDao().getByCodigo(banda.getCodigo()); //esse parametro de busca estaria no seu action (e não apenas existindo dentor do método) e teria sido carregado anteriormente de alguma forma (uma busca por exemplo). }

Criado 27 de maio de 2010
Ultima resposta 27 de mai. de 2010
Respostas 5
Participantes 4