[Resolvido] Troca de listas entre beans

5 respostas
D

Pessoal,

Eu estou tentando com que uma classe bean utilize uma lista que foi previamente carregada em outra classe Bean.
Para isso, estou utilizando os seguintes métodos: FacesContext.getCurrentInstance().getExternalContext().getFlash().get(“lista”)); e FacesContext.getCurrentInstance().getExternalContext().getFlash().put(“lista”, this.listaExibicao); só que não está dando certo.

O bean que carrega a lista é o seguinte:

package br.pe.gov.ses.pme.mb;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;


import br.pe.gov.ses.pme.dao.DAO;
import br.pe.gov.ses.pme.dao.QuantitativoDAO;
import br.pe.gov.ses.pme.dao.QuantitativoExibicaoDAO;
import br.pe.gov.ses.pme.modelo.Especialidade;
import br.pe.gov.ses.pme.modelo.Hospital;
import br.pe.gov.ses.pme.modelo.Quantitativo;
import br.pe.gov.ses.pme.modelo.QuantitativoExibicao;

@ManagedBean
@ViewScoped
public class QuantitativoExibicaoBean implements Serializable{
	
	private QuantitativoExibicao quantitativoExibicao = new QuantitativoExibicao();
	
	private DAO<QuantitativoExibicao> dao = new DAO<QuantitativoExibicao>(QuantitativoExibicao.class);
	
	private DAO<Especialidade> daoEspecialidade = new DAO<Especialidade>(Especialidade.class);
	
	private List<QuantitativoExibicao> listaExibicao;
	
	private List<Especialidade> listaEspecialidade;
	
	private Date data;
	
	private int turno;
	
	private int show;
	
	@Inject
	private QuantitativoDAO quantitativoDAO;
	
	@Inject
	private QuantitativoExibicaoDAO quantExibicaoDAO;
	
	public QuantitativoExibicaoBean(){
		
	}
	
	@PostConstruct
	public void init(){
		
		this.listaExibicao = new ArrayList();
		
		this.setListaEspecialidade(this.daoEspecialidade.listarTodos());
		
		this.show = 0;
		//criarExibicao();
	}
	
	public QuantitativoExibicaoBean(QuantitativoExibicaoDAO exibDAO){
		this.quantExibicaoDAO = exibDAO;
	}
	
	/*
	 * Método que monta as informações para exibição 
	 */
	public String criarExibicao(){
		String url = "";
		boolean existePlantao = this.quantitativoDAO.existePlantao(this.data, this.turno);
		if(existePlantao){
			for(int i = 0; i < this.listaEspecialidade.size(); i++){
				Especialidade tempEspecialidade = this.listaEspecialidade.get(i);
				List<Quantitativo> tempListaQuantitativo = this.setarListaExibicao(tempEspecialidade, this.data, this.turno);
				QuantitativoExibicao tempExibicao = new QuantitativoExibicao();
				
				tempExibicao.setEspecialidade(tempEspecialidade);
				tempExibicao.setQuantitativo(tempListaQuantitativo);
				
				this.listaExibicao.add(tempExibicao);
			}
			this.show = 1;
			url = "ExibicaoQuantitativo.jsf?faces-redirect=true";
			
			FacesContext.getCurrentInstance().getExternalContext().getFlash().put("lista", this.listaExibicao);
			
			
		}else{
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Não há exibição para esse plantão", ""));
			url = "EscolhaExibicao.jsf?faces-redirect=true";
		}
		return url;
	}
		
		
	
	public List<Quantitativo> setarListaExibicao(Especialidade especialidade, Date data, int turno){
			
			List<Quantitativo> resultante = new ArrayList();
			List<Quantitativo> filtrado = this.quantitativoDAO.procurarQuantitativo(data, turno, especialidade);
			
			
			List<Quantitativo> restante = this.quantitativoDAO.setarHospitaisQuantitativo();
			int tamanho = filtrado.size() + restante.size();
			int indice = 0;
			resultante = filtrado;
			for(int i = filtrado.size(); i< tamanho; i++){
				resultante.add(i, restante.get(indice));
				indice++;
			}
			
		return resultante;
	}
	
	
	public QuantitativoExibicao getExibicaoQuantitativo() {
		return quantitativoExibicao;
	}

	public void setExibicaoQuantitativo(QuantitativoExibicao exibicaoQuantitativo) {
		this.quantitativoExibicao = exibicaoQuantitativo;
	}

	public List<QuantitativoExibicao> getListaExibicao() {
		return listaExibicao;
	}

	public void setListaExibicao(List<QuantitativoExibicao> lista) {
		this.listaExibicao = lista;
	}

	public DAO<QuantitativoExibicao> getDao() {
		return dao;
	}

	public void setDao(DAO<QuantitativoExibicao> dao) {
		this.dao = dao;
	}

	public QuantitativoExibicaoDAO getQuantExibicaoDAO() {
		return quantExibicaoDAO;
	}

	public void setQuantExibicaoDAO(QuantitativoExibicaoDAO quantExibicaoDAO) {
		this.quantExibicaoDAO = quantExibicaoDAO;
	}

	public List<Especialidade> getListaEspecialidade() {
		return listaEspecialidade;
	}

	public void setListaEspecialidade(List<Especialidade> listaEspecialidade) {
		this.listaEspecialidade = listaEspecialidade;
	}

	public DAO<Especialidade> getDaoEspecialidade() {
		return daoEspecialidade;
	}

	public void setDaoEspecialidade(DAO<Especialidade> daoEspecialidade) {
		this.daoEspecialidade = daoEspecialidade;
	}

	public QuantitativoDAO getQuantitativoDAO() {
		return quantitativoDAO;
	}

	public void setQuantitativoDAO(QuantitativoDAO quantitativoDAO) {
		this.quantitativoDAO = quantitativoDAO;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public int getTurno() {
		return turno;
	}

	public void setTurno(int turno) {
		this.turno = turno;
	}

	public int getShow() {
		return show;
	}

	public void setShow(int show) {
		this.show = show;
	}


	
}

E o bean que precisa ler a lista é o seguinte:

package br.pe.gov.ses.pme.mb;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import br.pe.gov.ses.pme.modelo.QuantitativoExibicao;

@ManagedBean
@ViewScoped
public class ExibicaoBean {

	private List<QuantitativoExibicao> listaExibicao;
	
	
	@PostConstruct
	public void init(){
		this.setListaExibicao((List<QuantitativoExibicao>) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("lista"));
		
	}


	public List<QuantitativoExibicao> getListaExibicao() {
		return listaExibicao;
	}


	public void setListaExibicao(List<QuantitativoExibicao> listaExibicao) {
		this.listaExibicao = listaExibicao;
	}
	
}

O problema é que a listaExibicao da classe ExibicaoBean não é carregada.
Alguém sabe como resolver isso?

5 Respostas

W

Amiga pode postar seu xhtml

D

Esse xhtml chama a função que deve gerar a lista:

<!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:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui"> 

<h:head></h:head> 
<body>
<ui:composition template="_templateSemMenu.xhtml" >
<ui:define name="corpo">

<style type="text/css">
	.ui-datatable .ui-datatable-data .vermelho td{
		background-color:#FF0000;
	}
	
	*{
		font-weight: bold; 
	}
	
	.especialidade{
		font-size: 24px;
	}
	
	.titulo{
		font-size: 30px;
	}
	.dados{
		font-size: 25px;
	}
</style>

<br></br>
<br></br>
<h:form id="formularioBusca">
	<p:growl id="growl" showDetail="true" sticky="true"></p:growl>
	<div align="center" >
	<p:outputPanel id="painel1">
	<h:panelGrid columns="2" cellpadding="2" cellspacing = "10" width="400" rendered = "#{quantitativoExibicaoBean.show == 0}">
		<h:outputLabel for="plantao" value="Exibir Quantitativo" />
		
		<p:calendar  id="popupButtonCal" showOn="button" value="#{quantitativoExibicaoBean.data}"></p:calendar>
		
		<h:outputLabel for="branco" value="" />
		
		<p:selectOneRadio id="options" value="#{quantitativoExibicaoBean.turno}" >
			<f:selectItem itemLabel="Diurno" itemValue="1" />  
          	<f:selectItem itemLabel="Noturno" itemValue="2" />   
		</p:selectOneRadio>
		
		<h:outputLabel for="branco2" value="" />
		
		<p:commandButton value="Exibir" action="#{quantitativoExibicaoBean.criarExibicao}" update= "growl  :formularioBusca:painel1" ></p:commandButton>
	
	</h:panelGrid>
	</p:outputPanel>
	</div> 

</h:form>


</ui:define>
</ui:composition>
</body>
</html>

Esse xhtml é o que deve ler a lista:

<!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:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui"> 

<h:head></h:head> 
<body> 
<ui:composition template="_templateSemMenu.xhtml">
<ui:define name="corpo">

<style type="text/css">
	.ui-datatable .ui-datatable-data .vermelho td{
		background-color:#FF0000;
	}
	
	*{
		font-weight: bold; 
	}
	
	.especialidade{
		font-size: 40px;
	}
	
	.titulo{
		font-size: 30px;
	}
	.dados{
		font-size: 25px;
	}
</style>


<h:form id="formularioExibicao" >
	<br></br>
	<br></br>
	<div align="center" >
	<p:outputPanel id="painel">
	<p:carousel id="smallCarousel" value="#{exibicaoBean.listaExibicao}" var="quantitativoExibicao"   
        itemStyleClass="especialidade" rows="1" effect="easeInStrong" circular="true" pageLinks="4" autoPlayInterval="10000">
       
       <p:panel id="panelEspecialidade">
       		<h:outputText value="#{quantitativoExibicao.especialidade.nome}" style="especialidade" />
       </p:panel>   
          
	   <p:dataTable id="tabelaQuantitativo" value="#{quantitativoExibicao.quantitativo}" var="quantitativo" rowStyleClass="#{quantitativo.quantidade le 0 ? 'vermelho' : null}">
	   		
	   		<p:column id="hospital">
	   			<f:facet name="header">  
                	Hospital  
           		</f:facet>
	   			<h:outputText value="#{quantitativo.hospital.nome}" />
	   		</p:column>
	   		
	   		<p:column id="quant">
	   			<f:facet name="header">  
                	Especialistas  
           		</f:facet>
	   			<h:outputText value="#{quantitativo.quantidade}" />
	   		</p:column>
	   		
	   		<p:column id="quantidade">
	   			<f:facet name="header">  
                	Encaminhamentos  
           		</f:facet>
	   			<h:outputText value="#{quantitativo.encaminhamentos}" />
	   		</p:column>
	   		
	   </p:dataTable>
	</p:carousel>
	</p:outputPanel>
	</div> 
</h:form>


</ui:define>
</ui:composition>
</body> 
</html>
W

Amiga pode ser que você não esteja passando a lista para o Flash, embora eu não tenha visto seu xhtml, a foma de se fazer é parecido com isso

<h:commandLink value="Valor" action="#{bean.entrar}" > <f:setPropertyActionListener target="#{flash.NomeDoSeuFlash}" value="#{suaLista}" /> </h:commandLink>

W

Outro problema em sua aplicação é que você não tem o padrão de uma FecesUtil, para isso você tera que criar o get e o set para seu Flash

    • assim.
public  Object getFlashParameter(String name) {
		return FacesContext.getCurrentInstance().getExternalContext().getFlash().get(name);
	}

	public void setFlashParameter(String name, Object value) {
		FacesContext.getCurrentInstance().getExternalContext().getFlash().put(name, value);
	}
D

Obrigada pela ajuda!
Eu acho que o que estava ocorrendo era algum problema com o servidor.
Depois de pará-lo e inicializá-lo algumas vezes, a aplicação funcionou corretamente.

Criado 3 de agosto de 2012
Ultima resposta 3 de ago. de 2012
Respostas 5
Participantes 2