[JSF] Duvida Recuperar Objeto

13 respostas
C

Bom Eu estou precisando recuperar um objeto na table, por exemplo tem lá a lista de usuario e eu kero editar um como eu faço pra conseguir selecionar cada um deles.

eu tinha um exemplo do curso mas n consegui fazer funcionar

public void Selecionar(ActionEvent event){
UIcomponent link = event.getComponent();
UIParameter param = link.findComponent("id");
Long id = param.getValue();

mas n acerto como faz…
Alguem pode dar uma maozinha :smiley: Valeo

13 Respostas

Y

No link de editar você adiciona um parametro.

Tente isso:

<h:commandLink actionListener="#{seuBean.Selecionar}">
    <f:param value="#{objeto.idObjeto}" name="id"/>
</h:commandLink>

[]´s

Daniel

C

Um tentei aki mas n sei c eh isso…

bom fiz o metodo de selecionar

public void Selecionar(ActionEvent event){   
		UIComponent link = event.getComponent();   
		UIParameter param = (UIParameter) link.findComponent("id");   
		Integer id = (Integer) param.getValue();  
		
		responsavel = dao.procurarPorId(id);
	}

ai no meu caso q to usando facelets ficaria assim???

<a jsfc="h:commandLink" value="(Excluir)" actionListener="#{responsavelFaces.Selecionar}"
                       action="#{responsavelFaces.deletarResponsavell}">
                  <f:param value="#{usuarioFace.usuario.id}" name="id" id="id"/>		
</a>

Obrigado :smiley:

G

Já pensou em usar richfaces?

usamos algo assim:

<a4j:commandLink value="#{action.txShortName}">
         <f:setPropertyActionListener value="#{action}" target="#{actionMBean.action}"/>
</a4j:commandLink>

actioMBean é um managed bean que tem um objeto Action na sua composição…

C

Eu vou usar Richfaces, mas preciso usar com Facelets…

da pra usar Facelets + Ajax?

C

Que azar num deu certo…

fiz assim

<td jsfc="h:column">
				<f:facet name="header">
					<h:outputText value="Excluir" />
				</f:facet>
			<a jsfc="h:commandLink" action="#{responsavelFaces.deletarResponsavel}" value="(Excluir)" actionListener="#{responsavelFaces.Selecionar}">
				<f:param value="#{responsavelFaces.responsavel.id}" name="id" id="id"/>
			</a>
			</td>
public String deletarResponsavel(){
		dao.apagar(responsavel);
		lista = null;
		return "refresh";
	}	
	public void Selecionar(ActionEvent event){   
		UIComponent link = event.getComponent();   
		UIParameter param = (UIParameter) link.findComponent("id");   
		Integer id = (Integer) param.getValue();  
		
		responsavel = dao.procurarPorId(id);
	}

Erro

Error reading 'nome' on type Unimed.Entity.Responsavel$$EnhancerByCGLIB$$afbc56bc

Alguem entende o por que nao da :X

G

opa, dá sim cara, inclusive o richfaces já vem com algumas tags de ajax.

Veja: http://livedemo.exadel.com/richfaces-demo/richfaces/actionparam.jsf

M

Mas o que está acontecendo? Não entendi!

Eu sei que existe um problema de conceito quando se usa um h:commandLink dentro de h:dataTable.
Para resolver isso de uma olhada link

Abraços

C
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [Unimed.Entity.Responsavel#0]
	at org.hibernate.impl.SessionFactoryImpl$1.handleEntityNotFound(SessionFactoryImpl.java:377)
	at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:79)
	at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:68)
	at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
	at org.hibernate.engine.StatefulPersistenceContext.unproxyAndReassociate(StatefulPersistenceContext.java:571)
	at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:68)
	at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:52)

o Problema axo q eh no metodo Selecionar n ta trazendo o objeto…

B

pessoal, não precisa ficar setando parametros em jsf toda vez que chama um action. ele já foi feito pra guardar o viewstate :slight_smile:

sugestão: pegue o objeto inteiro que representa a linha daquela tabela

Map<String, Object> contexto = FacesContext.getCurrentInstance().getExternalContext().getRequestMap(); selecionado = (ObjetoTabela) contexto.get("varTabela");

C

bob o q eu colocaria ali nakele parametro do get();???

B

po bixo, faz uma força ai… tá fácil!!!

é o mesmo valor colocado na propriedade var do seu dataTable.

K

bobmoe:
pessoal, não precisa ficar setando parametros em jsf toda vez que chama um action. ele já foi feito pra guardar o viewstate :slight_smile:

sugestão: pegue o objeto inteiro que representa a linha daquela tabela

Map<String, Object> contexto = FacesContext.getCurrentInstance().getExternalContext().getRequestMap(); selecionado = (ObjetoTabela) contexto.get("varTabela");

Cara, estou com um problema parecido, mas voltado para o jasperreports. Se puder ajudar, olha neste tópico:
http://www.guj.com.br/posts/list/211055.java
agradeço.

K
Pessoal, fiz um teste para para ver se minha ultima alteração estava pegando o id do objeto para enviar ao jasperreports e ficou assim:
public String imprimirRelatorio2(ActionEvent event) {

		// pegar objeto com actionEvent
		UIComponent link = event.getComponent();
		UIParameter parametro = (UIParameter) link.findComponent("printCod");
		Long id = (Long) parametro.getValue();

		// parametros
		Map param = new HashMap();
		param.put("codOg", id);
		System.out.println("codOg= " + id); //PARA VER SE REALMENTE PEGA O ID DO OBJETO

		saida = null;
		System.out.println("metodo de impressao");
		String jasper = getDiretorioReal("/jasper/orgaogestor2.jasper");
		Connection conexao = null;
		try {

			// Abro a conex&#65533;o com o banco que ser&#65533; passada para o JasperReports
			conexao = new Conexao().getConexao();
			JRResultSetDataSource jrds = new JRResultSetDataSource(
					getResultSet(conexao));

			// Mando o jasper gerar o relat&#65533;rio
			JasperPrint print = JasperFillManager.fillReport(jasper, param,
					jrds);

			// Gero o PDF
			preenchePdf(print);
			System.out.println("pdf gerado");

		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("erro: " + e);
		} finally {
			try {
				// // Sempre mando fechar a conex&#65533;o, mesmo que tenha dado erro
				if (conexao != null)
					conexao.close();
			} catch (Exception e) {

			}
		}

		return "exibeRelatorio";

	}
na pagina xhtml ficou assim:
&lt;h:commandLink value="PDF" id="pdf" actionListener="#{orgaogestorHandler.imprimirRelatorio2}"/&gt;
			&lt;f:param id="printCod" name="cod" value="#{f.cod_orgaogestor}"/&gt;
O resultado no console foi:
Hibernate: 
    select
...
codOg= 30
metodo de impressao
getDireitorioReal
conexao relatorio
getDireitorioReal
getContextPath
pdf gerado

Como pode ver, ele carrega o método, passa o parametro mas na prática, naum acontece nada... o relatorio naum é exibido, e na página acontece um refresh.
O que pode ser???

Agradeço.

Criado 2 de setembro de 2009
Ultima resposta 6 de jul. de 2010
Respostas 13
Participantes 6