DataTable RichFaces com filtro nao altera

2 respostas
D

Boa Noite Pessoal, estou com um problema que não consigo solucionar ja pesquisei na net e nada, gostaria muito da ajuda de vcs
Tenho um DataTable do richFaces onde possuo uma lista de Fornecedores, com uma coluna para alteracão quando eu clicar, quando seleciono seto o parametro com o id
pegando no MB conforme abaixo

Data Table

<rich:dataTable value="#{fornecedorHandler.fornecedores}"
			var="f" rendered="#{not empty fornecedorHandler.fornecedores}" rows="5">
			<h:column>
				<f:facet name="header">
					<h:outputText value="Id" />
				</f:facet>
				<h:outputText value="#{f.id}" />
			</h:column>

			<h:column>
				<f:facet name="header">
					<h:outputText value="Nome" />
				</f:facet>
				<h:outputText value="#{f.nome}" />
			</h:column>

			<h:column>
				<f:facet name="header">
					<h:outputText value="Descricao" />
				</f:facet>
				<h:outputText value="#{f.descricao}" />
			</h:column>
			
			<h:column>
				<f:facet name="header">
					<h:outputText value="Alterar" />
				</f:facet>
				<h:commandLink actionListener="#{fornecedorHandler.escolheFornecedor}" immediate="true">
				<h:outputText value="(Alterar)"/>
				<f:param id="editId" name="id" value="#{f.id}"/>
				</h:commandLink>
			</h:column>
			
			
			<f:facet name="footer">
			<rich:datascroller/>	
			</f:facet>		
			</rich:dataTable>

ManagerBean que le a acão e get do DataTable

public void escolheFornecedor(ActionEvent event) {
		UIComponent link = event.getComponent();
		UIParameter param = (UIParameter) link.findComponent("editId");
		Long id = (Long) param.getValue();

		this.fornecedor = this.fornecedores.get(id.intValue() - 1);

	}

public List<Fornecedor> getFornecedores() {
		
		//System.out.println("Lendo fornecedores #" + fornecedores.size());
		fornecedores = this.dao.pesquisar(fornecedor);
		return fornecedores; //fornecedores;
	}

Quando busco todos os fornecedores no getFornecedores(), apos clicar em alterar ele executa o evento escolherFornecedor normalmalmente e consigo pegar o parametro,
Porem não quero trazer todos os fornecedores e possuo campos para filtrar a Lista de fornecedores, apos filtrar a lista, ai o link editar não funciona , apos clicar ele apaga os dados do DataTable,
como posso solucionar isso? uso o MB como Scopo de Request.Nem chega a entrar no evento escolherFornecedor só le o getFornecedor.
Segue o Codigo completo

MainPage

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@taglib uri="http://richfaces.org/rich" prefix="rich"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<f:view>
	<f:loadBundle basename="m" var="msgs" />
	<h:outputText value="#{msgs['bemvindo']}" />
	<h:outputText value="#{autenticator.login}" />
	
	<rich:tabPanel>
	<rich:tab label="Fornecedor">
		<h:form id="cadastro">
		<br />
		<h:outputText value="#{msgs['fornecedor-nome']}" /><br/>
		<h:inputText id="nome" required="true"
			value="#{fornecedorHandler.fornecedor.nome}">
			<f:validateLength minimum="5" />
		</h:inputText>

		<h:message for="nome" style="color:darkred" />
		<br />
		<br />
		<h:outputText value="#{msgs['fornecedor-descricao']}"></h:outputText>
		<br />
		<h:inputTextarea value="#{fornecedorHandler.fornecedor.descricao}" />
		<br />
		<h:commandButton value="Salvar" action="#{fornecedorHandler.salvar}"/>
		
		<h:commandButton value="Pesquisar" actionListener="#{fornecedorHandler.pesquisar}"/>
	</h:form>
	
	<rich:spacer height="10"/>
	<rich:separator height="1" lineType="dotted"/>
	<rich:spacer height="10"/>
	
	<jsp:include page="lista.jsp" />
	</rich:tab>
	
	<rich:tab label="Contas a Pagar">
	<jsp:include page="contas.jsp"/>
	
	</rich:tab>
	</rich:tabPanel>
	
	
</f:view>

</body>
</html>

Lista

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@taglib uri="http://richfaces.org/rich" prefix="rich"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<f:subview id="lista">
	<h:form>
		<rich:dataTable value="#{fornecedorHandler.fornecedores}"
			var="f" rendered="#{not empty fornecedorHandler.fornecedores}" rows="5">
			<h:column>
				<f:facet name="header">
					<h:outputText value="Id" />
				</f:facet>
				<h:outputText value="#{f.id}" />
			</h:column>

			<h:column>
				<f:facet name="header">
					<h:outputText value="Nome" />
				</f:facet>
				<h:outputText value="#{f.nome}" />
			</h:column>

			<h:column>
				<f:facet name="header">
					<h:outputText value="Descricao" />
				</f:facet>
				<h:outputText value="#{f.descricao}" />
			</h:column>
			
			<h:column>
				<f:facet name="header">
					<h:outputText value="Alterar" />
				</f:facet>
				<h:commandLink actionListener="#{fornecedorHandler.escolheFornecedor}" immediate="true">
				<h:outputText value="(Alterar)"/>
				<f:param id="editId" name="id" value="#{f.id}"/>
				</h:commandLink>
			</h:column>
			
			
			<f:facet name="footer">
			<rich:datascroller/>	
			</f:facet>		
			</rich:dataTable>
			

	</h:form>
</f:subview>
</body>
</html>

FornecedorHandler

package br.com.caelum.fj26;

import java.util.ArrayList;
import java.util.List;

import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.event.ActionEvent;

import org.hibernate.classic.Session;

import br.com.caelum.fj26.dao.Dao;
import br.com.caelum.fj26.util.HibernateUtil;


public class FornecedorHandler {
	private Fornecedor fornecedor = new Fornecedor();
	private List<Fornecedor> fornecedores = new ArrayList<Fornecedor>();
	//private long count = 0l;
	
	private Dao<Fornecedor> dao;
	
	public void setSessao(Session sessao){
		this.dao= new Dao<Fornecedor>(sessao,Fornecedor.class);
	}
 	
	public String salvar(){
		
		HibernateUtil util = new HibernateUtil();
	
		
		System.out.println("Adicionando"+fornecedor.getNome());
		this.dao.merge(fornecedor);
		//if(this.fornecedor.getId()==null){
		
		//this.fornecedor.setId(++count);
		//this.fornecedores.add(fornecedor);
		//}
		this.fornecedor= new Fornecedor();
		return "Sussesso"; 
	}

	public void escolheFornecedor(ActionEvent event) {
		UIComponent link = event.getComponent();
		UIParameter param = (UIParameter) link.findComponent("editId");
		Long id = (Long) param.getValue();

		this.fornecedor = this.fornecedores.get(id.intValue() - 1);

	}

	public List<Fornecedor> getFornecedores() {
		
		//System.out.println("Lendo fornecedores #" + fornecedores.size());
		fornecedores = this.dao.pesquisar(fornecedor);
		return fornecedores; //fornecedores;
	}

	public void pesquisar(ActionEvent event){
		fornecedores = this.dao.pesquisar(fornecedor);
		
	}
	
	
	public Fornecedor getFornecedor() {
		return fornecedor;
	}

	public void setFornecedor(Fornecedor fornecedor) {
		this.fornecedor = fornecedor;
	}

}

FAces

<?xml version="1.0" encoding="UTF-8"?>

<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
	version="1.2">

	<application>
		<message-bundle>m</message-bundle>
		<resource-bundle>
			<base-name>m</base-name>
			<var>msgs</var>
		</resource-bundle>
		
		<locale-config>
		<default-locale>pt_BR</default-locale>
		<supported-locale>en</supported-locale>
		<supported-locale>de</supported-locale>
		</locale-config>
		
	</application>

	<managed-bean>
		<managed-bean-name>autenticator</managed-bean-name>
		<managed-bean-class>br.com.caelum.fj26.LoginHandler</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
	<managed-bean>
		<managed-bean-name>fornecedorHandler</managed-bean-name>
		<managed-bean-class>br.com.caelum.fj26.FornecedorHandler</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
		<managed-property>
			<property-name>sessao</property-name>
			<value>#{requestScope.sessao}</value>
		</managed-property>
			
	</managed-bean>
	<managed-bean>
		<managed-bean-name>contaPagarHandler</managed-bean-name>
		<managed-bean-class>br.com.caelum.fj26.ContaPagarHandler</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>


	<navigation-rule>
		<from-view-id>/olajsf.jsp</from-view-id>
		<navigation-case>
			<from-outcome>sucesso</from-outcome>
			<to-view-id>/mainpage.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>
</faces-config>
Todos os exemplos que fiz foi com o DataTable com todos os registros tipo dao.list(), ai funciona sem problemas mas filtrandocom parametros nos estou conseguindo, nao aparece nehum errro, se alguem puder me da uma luz, ou que ja possua algo funcionado e puder me ajudar eu agradeço, lembrando que estou esando scopo request, como session funciona, porem não é recomendado...

Obrigado

2 Respostas

D

Bom dia, Então consegui achar uma solução, não sei se é a mais correta porem foi a unica que solucionou meu problema,
como o Scopo era request após refrash da tela o metodo getFornecedores trazia vazio devido ao scopo, nao entrando no metodo para alteracao
entao coloquei na jsp mainpage:

<t:saveState value="#{fornecedorHandler.fornecedores}"/>

onde mantem por um tempo maior que request minha lista, fazendo com que eu consiga pegar o valor do objeto clicado…

daviddjp

Essa solução é a mais recomendada mesmo. A não ser que vc use JSF 2.0

Abraço.

Criado 7 de julho de 2010
Ultima resposta 8 de jul. de 2010
Respostas 2
Participantes 2