AoolicationScoped ou SessionScoped JSF (RESOLVIDO)

1 resposta
programaçãojsfjava
H

Gente Ajuda aeeee.
Tenho uma tabela de estabeleciementos quando clico no botao dentro da tabela ele mostra um dialog com os dados do estabelecimento selecionado. Soque ao mostrar o DIALOG com sessionscoped o id da linha selecionada na tabela desaparece (chamei o atributo de estabelecimentoselecionado). logo apos de mostrar os dados no dialog. mas eu precisava que esse valor se mantivesse sempre nessa sessao.

Bem consegui resolver o problema modificando de session scoped para application scoped mas ai tive um outro problema ao fazer logout na aplicacao e fazendo login novamente com um usuairo diferente ele mostra os dados do primeiro usuario logado.

## JSF

    <?xml version="1.0" encoding="UTF-8" ?>
<!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"
	xmlns:fn="http://java.sun.com/jsp/jstl/functions">

<ui:composition template="_template.xhtml">
	<ui:define name="titulo">
		Visualizar Estabelecimentos
	</ui:define>

	<ui:define name="conteudo">
		<h:form id="formulario">
			<p:growl id="msgs" showDetail="true" autoUpdate="true" />

			<p:fieldset legend="Visualizar Estabelecimentos">
				<p:dataTable id="basicDT" var="estabelecimento"
					value="#{estabelecimentoBean.estabelecimentosModel}"
					editable="true" paginator="true" rows="10">

					<p:ajax event="rowEdit" listener="#{estabelecimentoBean.onRowEdit}"
						update=":formulario:msgs" />
					<p:ajax event="rowEditCancel"
						listener="#{estabelecimentoBean.onRowCancel}"
						update=":formulario:msgs" />

					<p:column headerText="Nome"
						sortBy="#{estabelecimento.nomeEstabelecimento}"
						filterBy="#{estabelecimento.nomeEstabelecimento}">
						<p:cellEditor>
							<f:facet name="output">
								<h:outputText value="#{estabelecimento.nomeEstabelecimento}" />
							</f:facet>
							<f:facet name="input">
								<p:inputText value="#{estabelecimento.nomeEstabelecimento}"
									style="width:76%" immediate="true"
									validatorMessage="O nome nao pode ser superior a 40 caracteres"
									required="true">
									<f:validateLength maximum="40" />
									<f:ajax event="blur" />
								</p:inputText>
							</f:facet>
						</p:cellEditor>
					</p:column>

					<p:column headerText="Avenida"
						sortBy="#{estabelecimento.local.avenida}"
						filterBy="#{estabelecimento.local.avenida}">
						<p:cellEditor>
							<f:facet name="output">
								<h:outputText value="#{estabelecimento.local.avenida}" />
							</f:facet>
							<f:facet name="input">
								<p:inputText value="#{estabelecimento.local.avenida}"
									style="width:76%" label="Descricao" immediate="true" />
							</f:facet>
						</p:cellEditor>
					</p:column>

					<p:column headerText="Telefone"
						sortBy="#{estabelecimento.contacto.telefone}"
						filterBy="#{estabelecimento.contacto.telefone}">
						<p:cellEditor>
							<f:facet name="output">
								<h:outputText value="#{estabelecimento.contacto.telefone}" />
							</f:facet>
							<f:facet name="input">
								<p:inputText value="#{estabelecimento.contacto.telefone}"
									style="width:76%" label="Descricao" immediate="true" />
							</f:facet>
						</p:cellEditor>
					</p:column>

					<p:column headerText="Celular"
						sortBy="#{estabelecimento.contacto.celular_principal}"
						filterBy="#{estabelecimento.contacto.celular_principal}">
						<p:cellEditor>
							<f:facet name="output">
								<h:outputText
									value="#{estabelecimento.contacto.celular_principal}" />
							</f:facet>
							<f:facet name="input">
								<p:inputText
									value="#{estabelecimento.contacto.celular_principal}"
									style="width:76%" label="Descricao" immediate="true" />
							</f:facet>
						</p:cellEditor>
					</p:column>

					<p:column headerText="Email"
						sortBy="#{estabelecimento.contacto.email}"
						filterBy="#{estabelecimento.contacto.email}">
						<p:cellEditor>
							<f:facet name="output">
								<h:outputText value="#{estabelecimento.contacto.email}" />
							</f:facet>
							<f:facet name="input">
								<p:inputText value="#{estabelecimento.contacto.email}"
									style="width:76%" label="Descricao" immediate="true" />
							</f:facet>
						</p:cellEditor>
					</p:column>

					<p:column style="width:32px">
						<p:commandButton
							update="formulario"
							oncomplete="PF('estabelecimentoDialog').show()" 
							icon="ui-icon-search" title="Visualizar">
							<f:setPropertyActionListener value="#{estabelecimento}"
								target="#{estabelecimentoBean.estabelecimentoSelecionado}" />
						</p:commandButton>
					</p:column>

					<p:column style="width:32px">
						<p:rowEditor editTitle="Editar" />
					</p:column>
				</p:dataTable>


				<p:dialog header="Estabelecimento Info"
					widgetVar="estabelecimentoDialog" modal="true" showEffect="fade"
					hideEffect="fade" resizable="true" fitViewport="true" responsive="true" position="center">
					<p:outputPanel id="estabelecimentoDetail">

						<p:panelGrid columns="1" style="margin: 0 auto;"
							rendered="#{not empty estabelecimentoBean.estabelecimentoSelecionados}"
							columnClasses="label,value">
							<p:imageSwitch effect="wipe" widgetVar="switcher"
								id="manuelSwitcher" slideshowAuto="false">
								<ui:repeat value="#{eventoBean.listaImagens}" var="image"
									id="manuelSwitcherImages">
									<p:graphicImage value="#{eventoBean.image}" height="250"
										width="550" style="horizontal-align: center;">
										<f:param name="id" value="#{image.id}" />
									</p:graphicImage>
								</ui:repeat>
							</p:imageSwitch>
						</p:panelGrid>

						<p:panelGrid columns="2" style="margin: 0 auto;"
							rendered="#{not empty estabelecimentoBean.estabelecimentoSelecionados}"
							columnClasses="label,value">
							<p:commandButton type="button"
								onclick="PF('switcher').previous();"
								icon="ui-icon-circle-triangle-w" id="prev" title="Voltar" />
							<p:commandButton type="button" onclick="PF('switcher').next();"
								icon="ui-icon-circle-triangle-e" id="next" title="Proximo" />
						</p:panelGrid>

						<p:panelGrid columns="4"
							rendered="#{not empty estabelecimentoBean.estabelecimentoSelecionados}"
							columnClasses="label,value" style="width: 100%;">

							<h:outputText value="Nome:" style="font-weight:bold" />
							<h:outputText
								value="#{estabelecimentoBean.estabelecimentoSelecionado.nomeEstabelecimento}" />
							<h:inputHidden width="1" />
							<h:inputHidden width="1" />

							<h:outputText value="Avenida" style="font-weight:bold" />
							<h:outputText
								value="#{estabelecimentoBean.estabelecimentoSelecionado.local.avenida}" />
							<h:outputText value="Número" style="font-weight:bold" />
							<h:outputText
								value="#{estabelecimentoBean.estabelecimentoSelecionado.local.numero}" />

							<h:outputText value="Telefone" style="font-weight:bold" />
							<h:outputText
								value="#{estabelecimentoBean.estabelecimentoSelecionado.contacto.telefone}" />
							<h:inputHidden width="1" />
							<h:inputHidden width="1" />

							<h:outputText value="Celular" style="font-weight:bold" />
							<h:outputText
								value="#{estabelecimentoBean.estabelecimentoSelecionado.contacto.celular_principal}" />
							<h:inputHidden width="1" />
							<h:inputHidden width="1" />

							<h:outputText value="E-mail" style="font-weight:bold" />
							<h:outputText
								value="#{estabelecimentoBean.estabelecimentoSelecionado.contacto.email}" />
							<h:inputHidden width="1" />
							<h:inputHidden width="1" />

							<h:outputText value="Inicio de actividade:"
								style="font-weight:bold" />
							<h:outputText
								value="#{estabelecimentoBean.estabelecimentoSelecionado.dataEhoradeOperacaoInicio.time}">
								<f:convertDateTime pattern="dd/MM/yyyy HH:mm"
									timeZone="Africa/Harare" />
							</h:outputText>

							<h:outputText value="Final das actividades:"
								style="font-weight:bold" />
							<h:outputText
								value="#{estabelecimentoBean.estabelecimentoSelecionado.dataEhoradeOperacaoFim.time}">
								<f:convertDateTime pattern="dd/MM/yyyy HH:mm"
									timeZone="Africa/Harare" />
							</h:outputText>
						</p:panelGrid>

						<p:panelGrid id="estabelecimentoDetail1" columns="1"
							rendered="#{not empty estabelecimentoBean.estabelecimentoSelecionados}"
							columnClasses="label,value" style="width: 100%;">
							<p:inputTextarea
								value="#{estabelecimentoBean.estabelecimentoSelecionado.descricaoEstabelecimento}"
								cols="72" rows="4" readonly="true" title="Descrição do evento" />

							<p:fileUpload
								fileUploadListener="#{estabelecimentoBean.handleFileUpload}"
								mode="advanced" label="Escolher" uploadLabel="Carregar"
								multiple="true" cancelLabel="Cancelar" dragDropSupport="true"
								sizeLimit="10000000" allowTypes="/(\.|\/)(gif|jpe?g|png)$/" />
						</p:panelGrid>
					</p:outputPanel>
				</p:dialog>

			</p:fieldset>

		</h:form>
	</ui:define>
</ui:composition>

</html>

## Bean

    package mz.co.mpteventos.springsecurity.bean;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseId;

import org.apache.commons.io.IOUtils;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.RowEditEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

import mz.co.mpteventos.springsecurity.dao.DAO;
import mz.co.mpteventos.springsecurity.model.Contacto;
import mz.co.mpteventos.springsecurity.model.Estabelecimento;
import mz.co.mpteventos.springsecurity.model.EstabelecimentoDataModel;
import mz.co.mpteventos.springsecurity.model.Evento;
import mz.co.mpteventos.springsecurity.model.Imagem;
import mz.co.mpteventos.springsecurity.model.Local;

@ManagedBean
@ApplicationScoped
public class EstabelecimentoBean {

	private Estabelecimento estabelecimento = new Estabelecimento();
	private Estabelecimento estabelecimentoSelecionado;

	private List<Estabelecimento> listaEstabelecimentosFiltradosPeloNome;
	private List<Estabelecimento> estabelecimentoSelecionados;
	private EstabelecimentoDataModel estabelecimentosModel;
	private List<Local> listaLocais;
	private List<Contacto> listaContactos;
	private List<Evento> listaeventos;
	private Imagem imagem;

	public EstabelecimentoBean() {
		listaEstabelecimentosFiltradosPeloNome = new DAO<Estabelecimento>(Estabelecimento.class)
				.filtrarEstabelecimentoPeloNome(pegarUsuarioDaSessao());
		estabelecimentoSelecionados = new DAO<Estabelecimento>(Estabelecimento.class)
				.filtrarEstabelecimentoPeloNome(pegarUsuarioDaSessao());
		listaLocais = new DAO<Local>(Local.class).listaTodos();
		listaContactos = new DAO<Contacto>(Contacto.class).listaTodos();
		listaeventos = new DAO<Evento>(Evento.class).listaTodos();
		estabelecimentosModel = new EstabelecimentoDataModel(listaEstabelecimentosFiltradosPeloNome);
	}
	
	public void handleFileUpload(FileUploadEvent event) throws IOException {

		try {

			this.imagem = new Imagem();

			InputStream is = event.getFile().getInputstream();

			// código usando Apache Commons IO
			byte[] bytes = IOUtils.toByteArray(is);
			this.imagem.setArquivo(bytes);
			this.imagem.setNomeArquivo(event.getFile().getFileName());
			this.imagem.setEstabelecimento(getEstabelecimentoSelecionado());
			
			new DAO<Imagem>(Imagem.class).adiciona(this.imagem);
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
					event.getFile().getFileName() + " is uploaded.", null);
			FacesContext.getCurrentInstance().addMessage(null, message);

		} catch (Exception e) { // TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public StreamedContent getImage() throws IOException {
        FacesContext context = FacesContext.getCurrentInstance();

        if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
            // So, we're rendering the HTML. Return a stub StreamedContent so that it will generate right URL.
            return new DefaultStreamedContent();
        } else {
            // So, browser is requesting the image. Return a real StreamedContent with the image bytes.
            String imageId = context.getExternalContext().getRequestParameterMap().get("id");
            Imagem image = new DAO<Imagem>(Imagem.class).buscaPorId((Integer.valueOf(imageId)));
            
            return new DefaultStreamedContent(new ByteArrayInputStream(image.getArquivo()));
        }
    }
	  
	private String pegarUsuarioDaSessao() {
		Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
		String currentPrincipalName = authentication.getName();
		return currentPrincipalName.toString();
	}

	public void onRowEdit(RowEditEvent event) {
		Estabelecimento estabelecimento = (Estabelecimento) event.getObject();
		new DAO<Estabelecimento>(Estabelecimento.class).atualiza(estabelecimento);
		FacesMessage msg = new FacesMessage("Estabelecimento Editado",
				((Estabelecimento) event.getObject()).getNomeEstabelecimento());
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public void onRowCancel(RowEditEvent event) {
		FacesMessage msg = new FacesMessage("Edit Cancelled",
				((Estabelecimento) event.getObject()).getNomeEstabelecimento());
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	// getters & setters
	public List<Estabelecimento> getEstabelecimentoSelecionados() {
		return estabelecimentoSelecionados;
	}

	public void setEstabelecimentoSelecionados(List<Estabelecimento> estabelecimentoSelecionados) {
		this.estabelecimentoSelecionados = estabelecimentoSelecionados;
	}

	public Estabelecimento getEstabelecimentoSelecionado() {
		return estabelecimentoSelecionado;
	}

	public void setEstabelecimentoSelecionado(Estabelecimento estabelecimentoSelecionado) {
		this.estabelecimentoSelecionado = estabelecimentoSelecionado;
	}

	public Estabelecimento getEstabelecimento() {
		return estabelecimento;
	}

	public void setEstabelecimento(Estabelecimento estabelecimento) {
		this.estabelecimento = estabelecimento;
	}

	public List<Local> getListaLocais() {
		return listaLocais;
	}

	public void setListaLocais(List<Local> listaLocais) {
		this.listaLocais = listaLocais;
	}

	public List<Contacto> getListaContactos() {
		return listaContactos;
	}

	public void setListaContactos(List<Contacto> listaContactos) {
		this.listaContactos = listaContactos;
	}

	public List<Evento> getListaeventos() {
		return listaeventos;
	}

	public void setListaeventos(List<Evento> listaeventos) {
		this.listaeventos = listaeventos;
	}

	public List<Estabelecimento> getListaEstabelecimentosFiltradosPeloNome() {
		return listaEstabelecimentosFiltradosPeloNome;
	}

	public void setListaEstabelecimentosFiltradosPeloNome(
			List<Estabelecimento> listaEstabelecimentosFiltradosPeloNome) {
		this.listaEstabelecimentosFiltradosPeloNome = listaEstabelecimentosFiltradosPeloNome;
	}

	public EstabelecimentoDataModel getEstabelecimentosModel() {
		return estabelecimentosModel;
	}

	public void setEstabelecimentosModel(EstabelecimentoDataModel estabelecimentosModel) {
		this.estabelecimentosModel = estabelecimentosModel;
	}

	public Imagem getImagem() {
		return imagem;
	}

	public void setImagem(Imagem imagem) {
		this.imagem = imagem;
	}

}

## Modelo

    package mz.co.mpteventos.springsecurity.model;

import java.util.Calendar;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Estabelecimento {
	@Id
	@GeneratedValue
	private Integer id;

	private String nomeEstabelecimento;
	private String descricaoEstabelecimento;

	@Temporal(TemporalType.TIMESTAMP)
	private Calendar dataEhoradeOperacaoInicio = Calendar.getInstance();

	@Temporal(TemporalType.TIMESTAMP)
	private Calendar dataEhoradeOperacaoFim = Calendar.getInstance();

	@OneToOne
	private Contacto contacto;

	@OneToOne
	private Local local;

	@ManyToOne
	private Conta conta;
	
	@OneToMany
	private List<Imagem> imagem;

	// getters & setters

	public Contacto getContacto() {
		return contacto;
	}

	public void setContacto(Contacto contacto) {
		this.contacto = contacto;
	}

	public Integer getId() {
		return id;
	}

	public String getNomeEstabelecimento() {
		return nomeEstabelecimento;
	}

	public void setNomeEstabelecimento(String nomeEstabelecimento) {
		this.nomeEstabelecimento = nomeEstabelecimento;
	}

	public Local getLocal() {
		return local;
	}

	public void setLocal(Local local) {
		this.local = local;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getDescricaoEstabelecimento() {
		return descricaoEstabelecimento;
	}

	public void setDescricaoEstabelecimento(String descricaoEstabelecimento) {
		this.descricaoEstabelecimento = descricaoEstabelecimento;
	}

	public Calendar getDataEhoradeOperacaoInicio() {
		return dataEhoradeOperacaoInicio;
	}

	public void setDataEhoradeOperacaoInicio(Calendar dataEhoradeOperacaoInicio) {
		this.dataEhoradeOperacaoInicio = dataEhoradeOperacaoInicio;
	}

	public Calendar getDataEhoradeOperacaoFim() {
		return dataEhoradeOperacaoFim;
	}

	public void setDataEhoradeOperacaoFim(Calendar dataEhoradeOperacaoFim) {
		this.dataEhoradeOperacaoFim = dataEhoradeOperacaoFim;
	}

	public Conta getConta() {
		return conta;
	}

	public void setConta(Conta conta) {
		this.conta = conta;
	}

	public List<Imagem> getImagem() {
		return imagem;
	}

	public void setImagem(List<Imagem> imagem) {
		this.imagem = imagem;
	}
	
}

IMAGEM

1 Resposta

H

Gente arranjei a solucao depois de duas semanas a tentar. E minutos depois de postar isso consegui ahaha aengracado.

Bem a solucao foi simples por acaso. no meu xhtml eu fazia o update de todo formulario no commad button apaguei o update="::formulairo:msgs" e resolvi o problema.

Criado 12 de julho de 2017
Ultima resposta 12 de jul. de 2017
Respostas 1
Participantes 1