JSF - Action CommandButton e CommandLink não funciona

Boa tarde galera

Estou trabalhando em um projeto usando JSF + Facelets + Hibernate e estou com problemas numa action de um commandbutton/commandlink. Ele simplesmente não funciona! Eu clico da um reload na pagina e não faz nada.

Segue os códigos:

Index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
    <f:subview>
    <body>

        <ui:composition template="./../../templateEmb.xhtml">
            <ui:define name="content">
                <h:form>
                    <h:dataTable id="dtab" value="#{embarcadorMB.list}" var="item" border="1">

                            <h:column>
                                <f:facet name="header">
                                    <h:outputText value="Id"></h:outputText>
                                </f:facet>
                                <h:outputText style="" value="#{item.identifier}"></h:outputText>
                            </h:column>

                            <h:column>
                                <f:facet name="header">
                                    <h:outputText value="Peso Total"></h:outputText>
                                </f:facet>
                                <h:outputText style="" value="#{item.carga.peso}"></h:outputText>
                            </h:column>

                            <h:column>
                                <f:facet name="header">
                                    <h:outputText value="Actions"></h:outputText>
                                </f:facet>
                                <h:commandButton action="#{embarcadorMB.setSessao}" type="submit" value="Edit">
                                    <f:param name="solitIdentifier" value="#{item.identifier}"></f:param>
                                </h:commandButton>
                            </h:column>

                        </h:dataTable>
                    </h:form>
                <br />
              <br />
            </ui:define>
        </ui:composition>
    </body>
    </f:subview>
</html>

faces-config.xml (trechos)

<managed-bean>
        <managed-bean-name>embarcadorMB</managed-bean-name>
        <managed-bean-class>com.rplogistics.EmbarcadorMB</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

<navigation-case>
            <from-outcome>solitDetails</from-outcome>
            <to-view-id>/embarcador/solicitacao/details.jsf</to-view-id>
            <redirect />
</navigation-case>

EmbarcadorMB.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.rplogistics;

import com.rplogistics.dao.EmbarcadorDAO;
import com.rplogistics.entities.Embarcador;
import com.rplogistics.entities.Solicitacao;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

/**
 *
 * @author Leonardo
 */
public class EmbarcadorMB {

    public EmbarcadorMB()
    {
        this.emb = null;
    }

    private Embarcador emb;
    private int idSolit;
    private List<Solicitacao> list;

    /**
     * @return the emb
     */
    public Embarcador getEmb() {

        if(emb == null )
        {
            LoginMB loginI = (LoginMB) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("userLogged");
            EmbarcadorDAO dao = new EmbarcadorDAO();
            this.emb = dao.getEmbarcadorID(loginI.getIdCliente());
        }

        return emb;
    }

    public List<Solicitacao> getList()
    {
        if(list == null)
        {
            list = getEmb().getSolicitacoes();
        }

        return list;
    }

    /**
     * @param emb the emb to set
     */
    public void setEmb(Embarcador emb) {
        this.emb = emb;
    }

    public String setSessao()
    {
        SolicitacaoMB solitmb = (SolicitacaoMB) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("solicitacaoManagedBean");
        HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        
        idSolit = Integer.parseInt((req.getParameter("solitIdentifier")));
        
        return solitmb.setSession(idSolit);
    }

}

Debugando meu projeto, vi que ele nem chega a entrar no método setSessao().

Alguem tem alguma ideia do que pode ser este problema??

brigadão pela força desde ja! =]

troca o type por id

<h:commandButton action="#{embarcadorMB.setSessao}" id="submit" value="Edit"> 

flw!

não resolveu :confused:

estou com um problema semelhante, integrei o Spring, só que os Action e ActionListener do JSF não estão funcionando

parte do jsf

<h:commandLink value="Value 1" action="#{beanTest.listTest}" /><br />
<h:commandLink value="Value 2" actionListener="#{beanTest.listTestAction}" /><br />
<h:commandLink value="Value 3" action="sucesso" />

parte do beanTest

	public String listTest() {
		try {
			preencheLista();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "sucesso";
	}
	public void listTestAction(ActionEvent acao) {
		try {
			preencheLista();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

não funciona, quando eu clico no link, ele faz um refresh na página e não executa o método,

se eu fizer:

<h:outputText value="#{beanTest.temp}" />
public String getTemp() {
	return "String de teste.";
}

isso funciona, mas o Action e o ActionListener não.

alguem saberia o que pode estar acontecendo?

É preciso que o método setSessao retorne “solitDetails” para que a pagina /embarcador/solicitacao/details.jsf seja chamada …

como vc nao especificou outro caso … qualquer outra coisa que o metodo setSessao retornar … vai redirecionar para a propria pagina

sei que meio idiota … mas no momento não me ocorre outra ideia …

verifique se ActionEvent está sendo importado do pacote : import javax.faces.event.ActionEvent;

as vezes vc tah importando action event de outro pacote … já aconteceu comigo ahuahu

[quote=grsouza]estou com um problema semelhante, integrei o Spring, só que os Action e ActionListener do JSF não estão funcionando

parte do jsf

<h:commandLink value="Value 1" action="#{beanTest.listTest}" /><br />
<h:commandLink value="Value 2" actionListener="#{beanTest.listTestAction}" /><br />
<h:commandLink value="Value 3" action="sucesso" />

parte do beanTest

	public String listTest() {
		try {
			preencheLista();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "sucesso";
	}
	public void listTestAction(ActionEvent acao) {
		try {
			preencheLista();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

não funciona, quando eu clico no link, ele faz um refresh na página e não executa o método,

se eu fizer:

<h:outputText value="#{beanTest.temp}" />
public String getTemp() {
	return "String de teste.";
}

isso funciona, mas o Action e o ActionListener não.

alguem saberia o que pode estar acontecendo?[/quote]

import javax.faces.event.ActionEvent;

já tinha visto esta ‘possibilidade’ em outros foruns/tópicos :?

to ficando p*** com isso, funciona toda minha integração do Spring+JSF menos os actions/actionsEvent do JSF …

[quote=javando]É preciso que o método setSessao retorne “solitDetails” para que a pagina /embarcador/solicitacao/details.jsf seja chamada …

como vc nao especificou outro caso … qualquer outra coisa que o metodo setSessao retornar … vai redirecionar para a propria pagina [/quote]

Ainda não funcionando :S ja tentei chumbar um retorno (o método só retorna a string) e mesmo assim não vai. :S

no meu caso o método da action/actionlistener nem é chamado, eu já usei um debug e até um System.out.println eu já coloquei :oops: mas nem entra no método, ai ele não tem o retorno e só da um refresh na página :frowning:

Exatamente!

a navigation-case está dentro de uma navigarion role?

ai vai o exemplo:

<navigation-rule>
	<display-name>index</display-name>
	<from-view-id>/index.jsp</from-view-id>
	<navigation-case>
		<from-outcome>jao</from-outcome>
		<to-view-id>/livros2.jsp</to-view-id>
	</navigation-case>
</navigation-role>

se tiver correto quanto a isso

tenta trocar a extensão do from-view-id pra .jsp e tenta trocar o to-view-id pra jsp … só pra tirar a zica ahuahua

	<navigation-rule>
		<from-view-id>/principal.jsp</from-view-id>
		<navigation-case>
			<from-action>#{beanTest.listTest}</from-action>
			<from-outcome>sucesso</from-outcome>
			<to-view-id>/test.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>
	public String listTest() {
		try {
			preenche();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "sucesso";
	}

o problema não é no faces-config, navigation … porque se fosse ele iria dispararia algum erro ou ao menos entraria no método do bean
o problema é que quando fazemos um <h:commandLink value=“link” action=“beanTest.listTest”> ele não dispara a função no bean.
não sei se consegui ser claro o suficiente agora … ?

lgtelles

consegui resolver o problema!!!
no meu caso era alguma incompatibilidade de bibliotecas, troquei a jsf-api.jar e jsf-impl.jar e começou a funcionar!

no link abaixo (4shared) coloquei o meu projeto teste de integração e todas as libs que eu usei
obs.: ta bem simples isso, o action dele só monta uma lista estatica e tem um bean mapeado pelo spring no jsf.
www.4shared.com/file/138304797/3de12041/SpringJSFWeb_20091007.html

da uma olhada ve se isso vai te ajudar
abc

To baixando aqui o seu projeto pra pegar as libs!
depois eu posto aqui se funcionou ou não!

se não funcionar vou tentar baixar o JBoss Seam que pelo jetio também resolve através de uma Annotation @Scope =scope.Conversation algo assim huahea
como eu tava tentando usar o JSF puro estou evitando ao maximo adotar outras libs mas pelo jeito não terei escapatória

não funcionou :confused:

aqui funcionou, então deve ser alguma coisa do teu Tomcat
experimenta pegar o tomcat 6.0.18 … é o que eu to usando, eu uso o Spring Tools Suite (Eclipse do SpringFramework)
ve se não ta dando conflito de libs da tua app com as libs do tomcat

Galera,

Estou com um problema muito semelhante e até o momento nenhuma das soluções dadas acima resolveu o meu caso…

Na verdade nesse mesmo “projeto” estou com 2 problemas, o primeiro é que o botão que faz a busca funciona somente o combo do cliente, quando o combo do país está na tela também, o botão não da ação, somente um refresh na tela (sem entrar no método)
O Segundo problema é na hora de voltar para a tela inicial. Ele entra no método, mas não volta para a página que está descrita no faces-config… ele também só da um refresh na tela.

Segue os codigos…
Handler

	public List getComboCustomer() throws ApplicationException {

		SelectItem selectItem;
		List comboCustomer = new ArrayList();

		List customerList = facade.listAllCustomers();

		selectItem = new SelectItem("", "Selecione");
		comboCustomer.add(selectItem);

		try {
			for (int i = 0; i < customerList.size(); i++) {

			CustomerTO customer = (CustomerTO) customerList.get(i);
			selectItem = new SelectItem(customer.getCliCodigoCliente(),customer.getCliHolding());
			comboCustomer.add(selectItem);
	
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return comboCustomer;
	}

	public List getComboCountry() throws ApplicationException{
		
		SelectItem select;
		List comboCountry = new ArrayList();
		
		List countryList = facade.listAllCountryByLocale(resources.getCurrentLocale());
		select = new SelectItem("", "Selecione");
		comboCountry.add(select);
		
		try {
			for (int i = 0; i < countryList.size(); i++) {
				CountryTO country = (CountryTO) countryList.get(i);
				
				select = new SelectItem(new Integer(country.getId().getIdCountry()), country.getDsPais());
				comboCountry.add(select);
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return comboCountry;

		
	}

	public String orderDeleteList(){

		this.setListTable(getOrderList()); //Recupera e retorn a lista...
		return "orderDeleteList";
		
	}

faces-config


	<managed-bean>
		<managed-bean-name>orderDeleteHandler</managed-bean-name>
		<managed-bean-class>br.com.tpd.ccgg.infosite.orderdelete.handler.OrderDeleteHandler</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>

	  <from-view-id>/pages/delOrder.jsp</from-view-id>
	  
	  <navigation-case> 
	    <from-outcome>orderDeleteList</from-outcome> 
	    <to-view-id>/pages/delOrder.jsp</to-view-id>
	  </navigation-case>
	  <navigation-case>
	    <from-outcome>backHome</from-outcome>
	    <to-view-id>/pages/delOrder.jsp</to-view-id>
	  </navigation-case>

viewOrderDet.jsp
Tela que somente não retorna para o início

		<h:commandButton id="toBack" value="#{msgs.back}" action="#{orderDeleteHandler.toBackHome}" styleClass="botGreen">
		</h:commandButton>

OrderDeleteHandler

	public String toBackHome(){
		
		return "backHome";
	}

delOrder.jsp

		<tr>
			<td class="label"><h:outputText value="#{msgs.client}" />:</td>
			<td>
				<h:selectOneMenu id="selectCustomer" styleClass="select" value="#{orderDeleteHandler.filterTO.customer.cliCodigoCliente}">
					<f:selectItems value="#{orderDeleteHandler.comboCustomer}" />
				</h:selectOneMenu>			
			</td>
			<td class="label"><h:outputText value="#{msgs.country}" /></td>
			<td class="label">
				<h:selectOneMenu id="idPais" styleClass="select" value="#{orderDeleteHandler.filterTO.country.id.idCountry}">
					<f:selectItems value="#{orderDeleteHandler.comboCountry}" />
				</h:selectOneMenu>	
			</td>
		</tr>

		<h:commandButton id="button1" value="#{msgs.search}" action="#{orderDeleteHandler.orderDeleteList}" styleClass="botGreen">
		</h:commandButton>

Se alguém puder ajudar ou souber o que é …

Encontrado o problema…

[code] List countryList = facade.listAllCountryByLocale(resources.getCurrentLocale());
// select = new SelectItem("", “Selecione”);
//Troquer por… Ele não aparece como erro, mas não consegue executar…
select = new SelectItem(new Integer(0), “Selecione”);
comboCountry.add(select);

 try {  
     for (int i = 0; i < countryList.size(); i++) {  
         CountryTO country = (CountryTO) countryList.get(i);  
           
         select = new SelectItem(new Integer(country.getId().getIdCountry()), country.getDsPais());  
         comboCountry.add(select);  
           
     }  
 } catch (Exception e) {  
     e.printStackTrace();  
 }  [/code]

Coloca na tua página <h:messages showDetail=“true” showSummary=“true” /> está estourando algum erro e não tem como o jsf mostrar

:wink:

Valeu a dica Thiago

Em relação ao erro do botão voltar a tela inicial, resolvi “forçando” a ida na ação do botão voltar, fiz assim no metodo…

		FacesContext context = FacesContext.getCurrentInstance();
		context.getCurrentInstance().getViewRoot().setViewId("/pages/delOrder.jsp");