Como passar o objeto selecionado em um <rich:dataTable> para sessão? [RESOLVIDO]

7 respostas
gtludwig

pessoal,

tenho em uma página uma implementação do rich:dataTable como mostra a figura anexa (não a consegui postar em qualquer host de imagens online por uma política de acessos aqui da empresa).

Nela tenho três a4j:commandLink, onde quero usar o objeto, editar informações dele ou apagar o registro respectivamente. Para a função de usar o objeto, implementei o a4j:commandLink assim:

<a4j:commandLink value="#{bundle['equipment.use']}" actionListener="#{anamanEquipmentMB.forwardEquip}" />

e o método forwardEquip, no managed bean assim:

public void forwardEquip(ActionEvent event) { System.out.println(event.getSource().getClass()); selectedEquipId = getEquipId(); System.out.println("selectedEquipId: " + selectedEquipId); }

Quero que ao clicar nesse link a variável selectedEquipId receba o id do equipamento. Como faço isso?

Obrigado,
Gustavo

7 Respostas

thimor

tem duas maneiras.

1 - Primeira
Voce monta a tabela a partir de um datamodel.

private DataModel objetosTabela;

public DataModel getObjetosTabela() {
    return objetosTabela = new ListDataModel("lista de objetos");
}

private Objeto getObjetoAlterarConsultarExcluir() {
    Objeto temp = (Objeto) objetosTabela.getRowData();
    return temp;
}

public void forwardEquip(ActionEvent event) {  
       System.out.println(event.getSource().getClass());
       Objeto o = getObjetoAlterarConsultarExcluir();
       selectedEquipId = o.getEquipId();  
       System.out.println("selectedEquipId: " + selectedEquipId);
}

sua tabela deve ficar assim:

<rich:dataTable var="objeto" value="#{bean.objetostabela}">
    ...
</rich:dataTable>

2 - Segunda
Voce passa a variavel como parametro. Utilizando o seu codigo firacia assim:

<a4j:commandLink value="#{bundle['equipment.use']}" actionListener="#{anamanEquipmentMB.forwardEquip}">
     <f:para name="selectedEquipId" value="#{objeto.equipID}"/>
</a4j:commandLink>

ai no managed bean vc coloca seu codigo assim

public void forwardEquip(ActionEvent event) {  
       System.out.println(event.getSource().getClass());
       String equipID  = getRequestParameter("selectEquipId"); //esse é o name que vc colocou la no parametro.
       selectedEquipId = Integer.parserInt(equipID);  
       System.out.println("selectedEquipId: " + selectedEquipId);
}  

private String getRequestParameter(String key) {
    return FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(key);
}
gtludwig

opa!

Gostei da opção do dataModel (até por que não consegui implementar a outra ainda! hehe!)… O Eclipse gerou o seguinte código do dataModel, mas não entendi o que significam os métodos overriden. Tens algum exemplo de utilização que podes me passar?

[EDIT] Remoção do código código da inteface [/EDIT]

thimor

voce gerol o new datamodel() como ele eh a interface ele gera estes metodos para voce implementar. vc tem q fazer como eu coloquei no meu codigo.

equips = new ListDataModel("lista que voce pega do banco de dados pode ser ArrayList ou List"):
gtludwig

Agora, ao popular os campos da tabela, vêm os métodos do DataModel e não do objeto Equipment... Não tá faltando um cast para (AnamanEquipment) em algum lugar?

Lista de equipamentos
private List<AnamanEquipment> equipments;

public List<AnamanEquipment> getEquipments() {
		equipments = new ArrayList<AnamanEquipment>();
		List<AnamanEquipment> equipList = aes.getEquipmentListByIdRegister(getRegisterId());
		for (AnamanEquipment equipment : equipList) {
			equipments.add(equipment);
		}
		return equipments;
}

public void setEquipments(List<AnamanEquipment> equipments) {
		this.equipments = equipments;
}
DataModel equips:
private DataModel equips;

public DataModel getEquips() {
		return equips = new ListDataModel(equipments);
}

public void setEquips(DataModel equips) {
		this.equips = equips;
}
dataTable da página:
<rich:dataTable
	var="equip"
	value="#{anamanEquipmentMB.equips}"
	>
	<rich:column>
		<f:facet name="header">
			<h:outputLabel value="id" />
		</f:facet>
		<h:outputText id="equipId" value="#{equip.___}" />
	</rich:column>
...
</rich:dataTable>
thimor

entao quando voce colocar na DataTable o var vai ser = ao seu objeto AnamanEquipment. Entao vc vai colocar os campos que voce criou nele.

value="#{equip.equipID}"
gtludwig

hmm, eu achava que eu já teria acesso direto aos atributos do objeto (id, nome, etc.) no autocomplete Control + Spacebar…

[edit] … mas o que importa é que funcionou! obrigadão!! [/edit]

thimor

gtludwig:
hmm, eu achava que eu já teria acesso direto aos atributos do objeto (id, nome, etc.) no autocomplete Control + Spacebar…

[edit] … mas o que importa é que funcionou! obrigadão!! [/edit]

Quando se trata de data table vc nao consegue acessar os atributos direto nao. tem q ser na mao mesmo.
OK! Disponha.

Criado 11 de novembro de 2009
Ultima resposta 11 de nov. de 2009
Respostas 7
Participantes 2