Curioso caso de primeira ação em página com Facelets e JSF 2

7 respostas
Takeshi91

Bom dia pessoal, gostaria de saber se já passaram pelo mesmo problema que estou passando e qual a solução que encontraram.

Tenho uma página de pesquisa e nela um botão, um campo de busca e uma tabela à ser preenchida conforme faço as pesquisas, até ai tudo bem.

Ao clicar no botão de pesquisa, ele só executa a mesma se eu clicar pela segunda vez, na primeira, nada acontece.

O mesmo vale para outros comandLinks que acessam métodos da minha ManagedBean.

7 Respostas

FernandoFranzini

Alguma coisa ta errada sim…posta o código para tentarmos ajudar…

Takeshi91

Obrigado pela rápida resposta!

Minha página:

<!-- Main Content -->
                <div id="audit_section" class="grid grid-w62-g16"> 

                    <div class="header-section"> 

                        <!-- Search Tab -->
                        <div id="search-app" class="cell cell-12" style="margin-bottom: 30px; margin-left: 36px; _margin-left: 18px;">   
                            <div class="box box-quick-dl" style="height: 120px;"> 
                                <div class="box-header-3 heading-padding-3" style="float: left; width: 400px; border-right: 1px solid #D7D7D7;"> 
                                    <span class="heading-5">Applications</span>
                                </div>
                                <div class="box-header-2 heading-padding-3" style="float: left; width: 400px;"> 
                                    <a href="#" class="heading-6" onclick="javascript:peopleSearch()">People</a> 
                                </div> 
                                <div class="box-inner"> 						
                                    <div class="search-input">	
                                        <h:inputText id="search-app-box" value="#{searchMB.appSearchField}" styleClass="search-input-txt" />
                                    </div>			            			
                                    <div class="cell cell-8" style="float: left; width: 100px; margin-left: 20px; margin-top: 20px; _margin-top: 10px;">
                                        <p:commandLink action="#{searchMB.actRetrieveApps()}" styleClass="btn btn-med" value="Search" update="tb" 
                                                       tabindex="1" global="true"/>
                                    </div>	    			            
                                    <!-- <div class="btn-search" style="padding-top:2px"><input type="submit" value="Search" /></div>-->						
                                </div> 
                            </div> 
                        </div>
                       <!-- End Search Tab -->

                        <!-- Table  -->	

                        <p:ajaxStatus style="width:16px;height:16px;">
                            <f:facet name="start">
                                <h:graphicImage value="/images/ajax_loading.gif" />
                            </f:facet>

                            <f:facet name="complete">
                                <h:outputText value="" />
                            </f:facet>
                        </p:ajaxStatus>


                        <div class="cell cell-11" 
                             style="max-height: 200px; min-height: 100px; overflow: scroll; min-width: 600px; overflow: -moz-scrollbars-vertical;
                             margin-bottom: 30px; text-align: left; font-size: 12px">
                            <h:dataTable value="#{searchMB.apps}" var="app" id="tb"
                                         styleClass="box box-quick-dl" style="border-bottom: none;"> 

                                <div class="box-myrequest" style="height: auto;">

                                    <h:column headerClass="table-heading-3">
                                        <div class="heading-cell-1">
                                            <f:facet name="header">Application Name</f:facet>
                                        </div>
                                        <div class="results-cell-1">
                                            <p:commandLink value="#{app.appName}" action="#{searchMB.actRetrieveAccs()}" ajax="true">
                                                <f:setPropertyActionListener value="#{app}"
                                                                             target="#{searchMB.selectedApp}" />
                                            </p:commandLink>
                                        </div>
                                    </h:column>

                                    <h:column headerClass="table-heading-3">
                                        <div class="heading-cell-2">
                                            <f:facet name="header">Date feed last uploaded</f:facet>
                                        </div>
                                        <div class="results-cell-2">
                                            Text
                                        </div>
                                    </h:column>

                                    <h:column headerClass="table-heading-3">
                                        <div class="heading-cell-2">
                                            <f:facet name="header">Date last certified</f:facet>
                                        </div>
                                        <div class="results-cell-2">
                                            Text
                                        </div>
                                    </h:column>

                                    <h:column headerClass="table-heading-3">
                                        <div class="heading-cell-2">
                                            <f:facet name="header">Certified Accounts</f:facet>
                                        </div>
                                        <div class="results-cell-2">
                                            Text
                                        </div>
                                    </h:column>

                                    <h:column headerClass="table-heading-3">
                                        <f:facet name="header">Request New Feed</f:facet>
                                        <div class="results-cell-3">
                                            <img src="images/email-feed-icon.jpg" style="padding: 5px 0px 0px 54px;" />
                                        </div>
                                    </h:column>
                                </div>
                            </h:dataTable>
                        </div>
                        <!-- End Table --> 
                    </div>
                    <div class="clear"></div>        
                </div>
                <!-- End Main Content -->

Minha bean (não coloquei os encapsuladores, dispensam comentários):

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.auditit.managedbeans;

import com.auditit.beans.Account;
import com.auditit.beans.Application;
import com.auditit.dao.AccountsDao;
import com.auditit.dao.ApplicationsDao;
import com.auditit.statics.UntouchableQueries;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

/**
 *
 * @author 857455
 */
@ManagedBean
@SessionScoped
public class searchMB implements Serializable {

    private String appSearchField = null;
    private String accSearchField = null;
    private List<Account> accs = null;
    private List<Application> apps = null;
    private Application selectedApp = null;

    public searchMB() throws SQLException {
        setAppSearchField("");
        setAccSearchField("");
        setSelectedApp(new Application());
        setAccs(new ArrayList<Account>());
        setApps(new ArrayList<Application>());
        actRetrieveApps();
    }
    //--------------------
    //      METHODS
    //--------------------
    public String actRetrieveAccs() throws SQLException {
        System.out.println("TESTE: " + getSelectedApp().getAppName());        
        setAccs(new AccountsDao().getUsersForApp(getSelectedApp().getAppName(), UntouchableQueries.USERS_WITH_CERT_IN_AN_APP));
        return "get_accs";
    }

    public void actRetrieveApps() throws SQLException {
        if (getAppSearchField().equals("") || getAppSearchField() == null) {
            setApps(new ApplicationsDao().retrieveApps("", UntouchableQueries.APPS_WITH_ACCOUNTS, false));
        } else {
            System.out.println("parametro: " + getAppSearchField());
            setApps(new ApplicationsDao().retrieveApps(getAppSearchField(), UntouchableQueries.SPECIFIED_APP_WITH_ACCOUNTS, true));
        }
    }
}
FernandoFranzini

Cade a tag FORM do JSF? sem h:form não funciona mesmo

Takeshi91

[EDITADO]

Coloquei outro form só que começa no topo desse trecho e termina no fim dele, e agora está funcionando normalmente, não entendi, mas tudo bem, relembrando que já havia outro que incorporada desde antes da h:head até o fim da h:body

FernandoFranzini

O métodos do managedBean não pode lançar SQLException…
O que a implementação do JSF vai fazer com isso?
Vc deve tratar e apresentar na GUI as devidas mensagens de erros…
Ja viu se não é isso…pode estar dando sql exception e o jsf não ta fazendo nada…

Takeshi91

FernandoFranzini:
O métodos do managedBean não pode lançar SQLException…
O que a implementação do JSF vai fazer com isso?
Vc deve tratar e apresentar na GUI as devidas mensagens de erros…
Ja viu se não é isso…pode estar dando sql exception e o jsf não ta fazendo nada…

Huum, não sabia que os métodos do managedBean não podem lançar SQL Exception.

tem razão, muito obrigado.

Não, não está dando SQL Exception, todos os métodos da camada de persistencia já foram testados e estão 100% corretos.

obrigado pela força! espero poder passar esse tipo de aprendizado para frente assim como fizeste.

Um grande abraço!

FernandoFranzini

Não é q não pode…um método lança o erro expressando q o chamador tem q tratar…no seu caso vc ta jogando na mão do JSF!! E o JSF não vai tratar isso…Na verdade é responsabilidade da sua aplicação tratar os erros e apresentar as devidas mensagens na GUI…
Agora sou outro problema não sei oq é não…na primeiro click ele não faz nada…no segundo ele disparar o java certinho?
Vc ta usando Faceletes com ui:composition?

Criado 9 de setembro de 2011
Ultima resposta 9 de set. de 2011
Respostas 7
Participantes 2