Obter id(no Bean) de um componente JSF

Galera, como eu faço para obter o id de um componente JSF?
Eu tenho um commandButton que no action chama um metodo la do meu bean…
no bean eu quero pegar o id do botão que submeteu… como faço isso?

Da uma olhada.

[code]

Nome:
Senha: [/code]

O q q tem? Isso ae é só codigo jsf e naum tem nada de mais nele…
Acho que naum expliquei direito, olha só:
eu tenho um

<h:commandbutton id="seiLaoq" action="meBean.calcula" value="blabla" />

Quando esse metodo calcula for chamado eu quero saber como eu obtenho o id “seiLaoq” do componente JSF que o chamou, entendeu? Isso no lado do java ja no bean, e naum nas tags jsf…
A ideia é toda vez que um metodo no bean for chamado, quero saber o id de quem o chamou, bom é isso, alguem tem alguma ideia?

Voce pode usar parametros:

<h:commandButton action="#{bean.calcula}" value="Calcula">
    <f:param name="id" value="seiLa" />
</h:commandButton>

E Recuperar no Bean Depois: (não sei se o nome dos metodos estão todos corretos)

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");

Fala cara, obrigado pela ajuda, mas eu fiz isso que tu falaste e ele imprimiu null
esse getRequestParameterMap().get(“id”) num seria aplicavel se eu tivesse na minha url algo assim:

http://localhost:8080/projeto/faces/index.jsp?id=isso

Pq para o commandbutton ele ta retonando null, vc conseguiu desse modo?

Verdade, andei pesquisando e verifiquei que o <h:commandButton> não suporta parametros :frowning:

se vc usar commandLink no lugar, o param vai funcionar.

Ví em um fórum que se vc quiser usar varios botões para um mesmo método, deveria colocá-los em um dataTable e tratar os eventos da mesma.

Fala cara, encontrei uma maneira mais fácil, fazer binding do commandButton para um HtmlCommandButton ae no bean eu tenho todos os atributos da minha tag, muito mais fácil, mas obrigado pela ajuda,
Samuel Félix

Sim, mas vc não pode fazer binding de dois botões para o mesmo atributo do backingBean, terá que fazer vários bindings pra vários atributos diferentes, e desssa forma ainda não saberia qual foi o botão clicado (ou então entendi errado o seu problema).

Não deu certo, estás correto! Tentei fazer binding para vários botões, no entanto não funcionou =(
agora voltando a sua sugestão, em utilizar commandLink, eu estou tendo problemas, olha só:
Eu to fazendo um forEach do JSTL para uma Collection q tem os meus albuns la…
eu to precisando obter esse id pq dentre outras coisas, eu preciso remover o album…
para isso usei o forEach para listar todos os albuns persistidos e depois queria pegar o id do que foi clicado…
eu achava que tinha resolvido com binding pq tinha testado só pra um =P
Mas o problema que existe no código a seguir é que ele não aceita expressões ${a.id}
ae eu não tenho como setar o id do componente, vc conseguiu entender o meu problema?
Pois é, ja tentei de tudo, varios componentes, nenhum deles aceita expressões, e…
eu não tenho como passar o id se não for usar ela, entendes?

Código que naum funciona

        <c:forEach items="${album.albuns}"  var="a" varStatus="status">
        		<div id="caixa">
        			<div id="caixatitulo">
        				<h:commandLink value="album.jsp" action="#{album.remover}">
        					<f:param name="id" value="${a.id}" ></f:param>
        				</h:commandLink>
        			</div>
        				Fotos: ${a.fotos} <BR>
        				
        		</div>
        </c:forEach>

Exceção

org.apache.jasper.JasperException: /albuns.jsp(69,13) According to TLD or attribute directive in tag file, attribute value does not accept any expressions
	org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
	org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
	org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148)
	org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:1124)
	org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:819)
	org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1507)
...

Sabes de algo que eu possa fazer?
Obrigado

Se vc estiver usando o JSF 1.2, pode colocar #{a.id} que eu acho q funciona, por causa da Unified EL.

Eu tive um problema parecido com o seu já, pra montar um menu, pra solucionar mais facilmente, eu gerei tudo dentro do managedBean, e depois fiz o binding em um panelGroup.

Outra opção, que acho q no seu caso será mais fácil, é usar o componente a4j:repeater, que funciona igual o foreach, mas usando Tags JSF :slight_smile:

tenta fazer com o a4j, que acho q vai funcionar.

Fala cara, um noticia boa e uma ruim…
a boa é q fazer expressão com #{a.asdf} funcionou… a ruim é q de novo o param é ta null…
conheces algum componente que possa funcionar? Se naum semana que vem tento usar o a4j:repeater que vc falou
bom, obrigado pela sua ajuda, to aprendendo bastante

Se está usando o commandLink, não pode chegar null, tem que chegar o parametro.

Tenta imprimir o Id e vê se ele está imprimindo direito, e verifique se o name ta igual o que vc está pegando.

Com param tem q funcionar sim, é o metodo que eu uso nas minhas tabelas aki. Dá uma olhada aí.

Eu acho melhor colocar o repeater mesmo, pq misturar JSF com JSTL não fica mto legal, e tem mta coisa q não funciona direito.

Flws.

Consegui :smiley:

Finalmente fazer o que vc queria, fica aqui a dica pra outros que também estão com o mesmo “problema”:

vc pode definir um listener, dessa forma:

<h:commandButton id="eu" actionListener="#{bean.mostraId}" value="Editar" />

E no managedBean:

	public void mostraId(ActionEvent e) {
		System.out.println(e.getComponent().getId());
	}

*Lembrando q o ActionEvent eh o do JSF, não o do AWT.

Ufa, acho q finalmente conseguimos resolver, e era muito simples :slight_smile:

rápido no gatilho. Não tinha lido o tópico todo e já estava respondendo… :wink:

É essa mesma a solução!