Parâmetros em jsf e Primefaces?

Olá a todos!

Comecei com jsf e primefaces há uma semana e tenho muitas dúvidas. Uma delas é:

Se quando eu uso por exemplo um datatable e coloco em cada linha um link alterar e outro excluir, se eu preciso colocar no link algum parâmetro.

Exemplo. Eu tenho um datatable com dados do usuário.

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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:h="http://java.sun.com/jsf/html"
	  xmlns:f="http://java.sun.com/jsf/core"
	  xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Lista de Usu&aacute;rios</title>
<style> 
.ui-widget, 
.ui-widget .ui-widget { 
font-size: 12px !important; 
} 
</style> 
</h:head>
<h:body>
<ui:include src="menu.xhtml"/>
<br/>
<p:panel header="Lista de Usu&aacute;rios do Sistema">
<br/> 
<h:form prependId="false">  
  
    <p:dataTable id="dataTable" value="#{usuariosBean.lista}" var="usuario"  
                 paginator="true" rows="20"  
                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
                 rowsPerPageTemplate="5,10,15" style="text-align:center;">  
  
        <p:column style="width:120px;">  
            <f:facet name="header">  
                <h:outputText value="C&oacute;digo" />  
            </f:facet>  
            <h:outputText value="#{usuario.id}" />  
        </p:column>  
  
        <p:column style="width:500px;">  
            <f:facet name="header">  
                <h:outputText value="Nome" />  
            </f:facet>  
            <h:outputText value="#{usuario.nome}" />  
        </p:column>  
  
        <p:column style="width:250px;">  
            <f:facet name="header">  
                <h:outputText value="Status" />  
            </f:facet>  
            <h:outputText value="#{usuario.status}" />  
        </p:column>  
        
        <p:column style="width:250px;">  
            <f:facet name="header">  
                <h:outputText value="Data de cadastro" />  
            </f:facet>  
            <h:outputText value="#{usuario.dtCadastro}" />  
        </p:column>  
        
        <p:column style="width:40px;">  
            <f:facet name="header">  
                <h:outputText value="Editar" />  
            </f:facet>  
            <h:commandLink action="#" />  
        </p:column>
        <p:column style="width:40px;">  
            <f:facet name="header">  
                <h:outputText value="Excluir" />  
            </f:facet>  
            <h:commandLink action="#" />  
        </p:column>  
    </p:dataTable>  
  
</h:form> 
</p:panel>
</h:body>
</html>

E tenho o UsuarioBean:

package classe.controle.Beans;

import java.sql.SQLException;
import java.util.ArrayList;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import classe.modelo.dao.UsuarioDao;
import classe.modelo.vo.Usuario;

@ManagedBean(name = "usuarioBean")
@RequestScoped
public class UsuariosBean {
	private static Usuario usuario = new Usuario();
	private ArrayList<Usuario> lista;

	public void inserir() {
		UsuarioDao userdao = new UsuarioDao();
		try {
			userdao.inserir(usuario);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public ArrayList<Usuario> getLista() {
		lista = UsuarioDao.listar();
		return lista;

	}

	public void setUsuario(Usuario usuario) {
		UsuariosBean.usuario = usuario;
	}

	public Usuario getUsuario() {
		return usuario;
	}

}

Se tenho que passar o id do usuário para alterar ou excluir, como devo passar e como devo pegá-lo no bean?

Já olhei vários vídeos e tutoriais mas nada sanou minha dúvida.

Obrigado a todos!

Como você esta usando @RequestScope sim, você terá que enviar o id como hidden.

<h:inputHidden value="#{usuario.id}" />

e como eu recupero no usuarioBean para usar no método alterar ou excluir?

Os outros valores do usuario já estão preenchidos?

Se sim, o id tb estará.

OBS.:

No seu getUsuario faça:

[code]if(usuario == null){
usuario = new Usuario();
}

return usuario;[/code]

Para excluir tenho que procurar primeiro:

public Usuario procurar(int Id){ try { Usuario usuario = null; String sql="SELECT c.cad_id ,c.cad_nome ,c.cad_email ,c.cad_telefone ,c.cad_cnpjcpf , " + "c.cad_rg ,c.cad_rua ,c.cad_complemento ,c.cad_numero ,c.cad_bairro,c.cad_cep,c.cad_munid,c.cad_dtcadastro , " + "u.usu_id ,u.usu_login ,u.usu_senha ,u.usu_sts,m.mun_id,m.mun_descricao FROM cadastro c " + "INNER JOIN usuario u " + "ON " + "u.usu_id = c.cad_id " + "INNER JOIN municipio m " + "ON " + "m.mun_id = c.cad_munid " + "where u.usu_id = ? "; PreparedStatement consulta = conexao.prepareStatement(sql); consulta.setInt(1,Id); ResultSet resultado = consulta.executeQuery(); if(resultado.next()){ usuario = new Usuario(); usuario.setMunicipio(new Municipio()); usuario.setId(resultado.getInt("cad_id")); usuario.setNome(resultado.getString("cad_nome")); usuario.setEmail(resultado.getString("cad_email")); usuario.setTelefone(resultado.getString("cad_telefone")); usuario.setCnpjCpf(resultado.getString("cad_cnpjcpf")); usuario.setRg(resultado.getString("cad_rg")); usuario.setRua(resultado.getString("cad_rua")); usuario.setComplemento(resultado.getString("cad_complemento")); usuario.setNumero(resultado.getString("cad_numero")); usuario.setCep(resultado.getString("cad_cep")); usuario.setBairro(resultado.getString("cad_bairro")); usuario.setDtCadastro(resultado.getDate("cad_dtcadastro")); usuario.setId(resultado.getInt("usu_id")); usuario.setLogin(resultado.getString("usu_login")); usuario.setSenha(resultado.getString("usu_senha")); usuario.setStatus(resultado.getString("usu_sts")); usuario.getMunicipio().setId(resultado.getInt("mun_id")); usuario.getMunicipio().setDescricao(resultado.getString("mun_descricao")); } return usuario; } catch (Exception e) { e.printStackTrace(); return null; } }
E depois sim excluir:

public boolean excluir(Usuario usuario){ try { String sql = "DELETE FROM usuario where usu_id = ?;"+ "DELETE FROM cadastro where cad_id = ?"; PreparedStatement consulta = conexao.prepareStatement(sql); consulta.setInt(1, usuario.getId()); consulta.setInt(2, usuario.getId()); consulta.executeUpdate(); return true; } catch (Exception e) { e.printStackTrace(); return false; } }

Fiz o método excluir mas não sei se está correto:

public void excluir() throws SQLException { UsuarioDao excDao = new UsuarioDao(); Usuario usuario = excDao.procurar(getUsuario().getId()); boolean excluido = excDao.excluir(usuario); if(excluido != false){ System.out.println("Usuário excluido com sucesso!"); } }

Pq vc tem que procurar? Se você está recebendo o id certinho, basta largar o dedo no delete duma vez uai. ^^

De resto ta tudo tranquilo sim. [=

Ok. Você está certo já removi o procurar do método excluir.

Obrigado!

Mas como é mesmo que passo o parâmetro?

[quote=newuser]Ok. Você está certo já removi o procurar do método excluir.

Obrigado!

Mas como é mesmo que passo o parâmetro?[/quote]No botão que você for chamar o método faça o seguinte<p:commandButton value="Delete" > <f:setPropertyActionListener target="#{funcionarioCrudMB.funcionario}" value="#{funcionario}"/> </p:commandButton>
Não esquece de colocar seu action no botão. Ou então, se for utilizar, dialog de exibir a dialog. [=

<p:commandButton value="Delete"  >  
    <f:setPropertyActionListener target="#{funcionarioCrudMB.funcionario}" value="#{funcionario}"/>  
</p:commandButton>  

funcionarioCrudMB é o bean?

Fiz o seguinte:

<h:commandLink action="#{usuariosBean.excluir}" value="X"/> <f:setPropertyActionListener target="#{usuario.id}" value="#{usuario}"/>

Deu a seguinte mensagem de erro:

javax.faces.view.facelets.TagException: /listarUsuarios.xhtml @69,85 <f:setPropertyActionListener> Parent is not of type ActionSource, type is: org.primefaces.component.column.Column@b31b77

ao

no target coloca apenas usuario e não usuario.id

O erro continua.

E cadê a action/actionListener do botão? Eu faleiq precisava de um! =P

<p:commandButton value="Delete"  > 
<h:commandLink action="#{usuariosBean.excluir}" value="X"/>

Será que não é problema de biblioteca?