Parametros na url - jsf

Pessoal,

estou tentando fazer uma agenda em jsf com as 4 operacoes básicas: incluir, buscar, excluir e alterar.

Construi uma tabela que mostra todos os campos da tabela e seus respectivos registros e na última coluna um link para excluir o registro correspondente pelo atributo “nome” do registro.

comando do metodo excluir no meu bean: stm.execute(“delete from pessoa where nome = '” + nome + “’”);

O problema é que nao estou sabendo como capturar esse atributo nome da tabela criada na página jsp e enviar ao método no bean.

estou tentando assim: <h:commandButton value=“excluir” action="#{agenda.excluir}" /> mas ele da a mensagem de erro:

‘#{agenda.apagar}’ Method not found: {cidade=brasilia, endereco=av. w3, nome=vanessa, telefone=3223-1181}.apagar()

pelo jeito ele pega todos os campos da tabela. Tentei o seguinte no meu bean:
String valor = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(“nome”); mas tambem nao deu.

Já pesquisei aki nos fóruns e no google mas sem sucesso na busca por uma solução.

Peço socorro aos mais experientes! Como faço isso???

Abraço

Posta seu Jsf com a montagem da tabela e seu ManagedBean que faz o controle dessa página.

Opa, na hora…

arquivo lista.jsp

&lt;/f:view&gt; &lt;h:form&gt; &lt;h3&gt;Listagem dos nomes&lt;/h3&gt; &lt;h:dataTable value="#{agenda.lista}" var="agenda" border="0" headerClass="cabecalho" rowClasses="linha1,linha2"&gt; &lt;h:column&gt; &lt;f:facet name="header"&gt;&lt;h:outputText value="Nome" /&gt;&lt;/f:facet&gt; &lt;h:outputText value="#{agenda.nome}"/&gt; &lt;/h:column&gt; &lt;h:column&gt; &lt;f:facet name="header"&gt;&lt;h:outputText value="Endereco" /&gt;&lt;/f:facet&gt; &lt;h:outputText value="#{agenda.endereco}"/&gt; &lt;/h:column&gt; &lt;h:column&gt; &lt;f:facet name="header"&gt;&lt;h:outputText value="Excluir" /&gt;&lt;/f:facet&gt; &lt;h:commandLink action="#{agenda.apagar}"&gt; &lt;h:graphicImage value="imagens/excluir.gif"/&gt; &lt;f:param name="nome" value="#{agenda.nome}"/&gt; &lt;/h:commandLink&gt; &lt;/h:column&gt; &lt;/h:dataTable&gt; &lt;/h:form&gt; &lt;/f:view&gt;

arquivo: AgendaDB.java

//imports

public class AgendaDB {	

	private String nome;
	private String endereco;
	
        // getters e setters

public Result getLista() throws SQLException {			
		try {
			stm = con.createStatement();
			rs = stm.executeQuery("Select * from pessoa order by nome");					
			
			return ResultSupport.toResult(rs);	

		} finally {
			rs.close();
			stm.close();
		}
		
	}

public String apagar() throws SQLException {
		String result = "erro";			
		try {
			stm = con.createStatement();
			stm.execute("delete from pessoa where nome = '" + nome + "'");
			stm.close();
			result = "ok";
		} catch (SQLException e) {
			System.err.println ("Erro: "+e);
			result = "erro";
		}
		return result;
      }

e o erro que sempre aparece ao clicar no link pra excluir é:

Caused by: org.apache.jasper.el.JspMethodNotFoundException: /lista.jsp(40,30) ‘#{agenda.apagar}’ Method not found: {endereco=teste02, nome=teste02}.apagar()

Obs: projeto desenvolvido baseando-se em um artigo aqui do GUJ mesmo: http://www.guj.com.br/java.tutorial.artigo.158.1.guj

vlw

Faz um debug e veja se ele está entrando no método apagar.
Veja exatamente a linha do erro.

Olá…

Consegui resolver o problema do erro JspMethodNotFoundException. Meu ManageBean estava mapeado como “agenda” e a tag <h:dataTable estava mapeada com o mesmo nome (agenda).

Agora com o debug, vejo que está entrando no método, mas a variavel da sentença SQL fica sempre como “” ou seja, não esta recebendo o valor do parametro vindo da página jsp.

public String apagar() throws SQLException {
		String result = "erro";			
		try {
			stm = con.createStatement();
			stm.executeUpdate("delete from pessoa where nome = '" + nome + "'");
			stm.close();
			result = "ok";
		} catch (SQLException e) {
			System.err.println ("Erro: "+e);
			result = "erro";
		}
		return result;
	}

e na página lista.jsf

<h:commandLink action="#{agenda.apagar}">  
    <h:graphicImage value="imagens/excluir.gif"/>  
    <f:param name="nome" value="#{currentRow.value['nome']}"/>
</h:commandLink>

Já tentei de várias formas (value="#{agenda.nome}"; value="#{dados.nome}" e não estou conseguindo…

Alguém sabe como fazer???

Vlw

Pessoal, sinto que estou bem próximo…

Descobri o seguinte: meu ManageBean esta mapeado como “agenda”, porém os registros estao mapeados dentro da tag <h:dataTable como “dados” (<h:dataTable value="#{agenda.lista}" var=“dados”…); assim quando eu passo o parametro “… <f:param name=“nome” value=”#{dados.nome}"/> …" com dados.nome, ele nao preenche os dados do ManageBean automaticamente pela propriedade nome (teria que ser “agenda.nome”) e por isso a propriedade “nome” sempre chega ao ManageBean vazia (" ") e este é o X da questão.

Como eu posso assimilar dados.nome (que é a variavél da dataTable) a agenda.nome (que é o que vai para o ManageBean)???

Consegui!!!

Após muitas e muitas horas de pesquisa; fica registrado para o caso de alguém precisar…

<f:setPropertyActionListener target="#{agenda.nome}" value="#{dados.nome}" />

Vlw’s