Cache do JSF (Objeto em memória ao inserir)

8 respostas
F

Tenho uma aplicação jsf utilizando primefaces em que um formulario é preenchido e submetido e gravado com sucesso
Se o formulário for acessado novamente, ele já vem preenchido com os dados do último cadastrado, quando deveria estar em branco.

Alguem poderia me ajudar…

É um cadastro de Usuários para Logar no Sistema… segue o código

package br.unemat.bbg.controller;

import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import br.unemat.bbg.dao.DAO;
import br.unemat.bbg.dao.UsuarioDAO;
import br.unemat.bbg.model.Usuario;

@ManagedBean
@SessionScoped
@SuppressWarnings({ "unchecked", "rawtypes" })
public class UsuarioController {

	private Usuario usuario;

	private DataModel listaUsuarios;

	public DataModel getListarUsuarios() {
		List<Usuario> lista = new UsuarioDAO().list();
		listaUsuarios = new ListDataModel(lista);
		return listaUsuarios;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public void prepararAdicionarUsuario(ActionEvent actionEvent) {		
		usuario = new Usuario();
	}

	public void prepararAlterarUsuario(ActionEvent actionEvent) {
		usuario = (Usuario) (listaUsuarios.getRowData());
	}

	public String excluirUsuario() {
		Usuario usuarioTemp = (Usuario) (listaUsuarios.getRowData());
		DAO dao = new UsuarioDAO();
		dao.remove(usuarioTemp);
		return "/pages/cadastros/usuario.jsf";
	}

	public void adicionarUsuario(ActionEvent actionEvent) {
		DAO dao = new UsuarioDAO();
		dao.save(usuario);
		usuario = null;
	}

	public void alterarUsuario(ActionEvent actionEvent) {
		DAO dao = new UsuarioDAO();
		dao.update(usuario);
	}

}

e a pagina xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.prime.com.tr/ui">


<h:head>
	<f:loadBundle var="msgs" basename="messages" />
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title><h:outputText value="#{msgs.SistemaLabelEstagio}" /></title>
	<link type="text/css" rel="stylesheet" href="/css/estilo.css" />
</h:head>
<h:body>
	<div id="main">

		<f:view>

			<p:layout fullPage="true">

				<!-- Topo -->

				<p:layoutUnit position="top" height="102" collapsible="true">
					<div
						style="font-family: Tahoma; text-align: right; font-size: 16pt">
						<h3>
							<h:outputText value="Gerenciador de Usuários" />
							<!--  &nbsp; &nbsp; &nbsp;-->
						</h3>
						<h:panelGrid>
						</h:panelGrid>

					</div>
				</p:layoutUnit>


				<!-- Lado Esquerdo -->

				<p:layoutUnit position="left" width="150" header="Atividades"
					resizable="true" collapsible="true">
					<h:form prependId="false">
						<center>
							<br />
							<p:commandButton value="Novo" style="width:100%"
								actionListener="#{usuarioController.prepararAdicionarUsuario}"
								update="infosLivro" oncomplete="dlg_GerenciadorUsuario.show()"
								image="ui-icon-circle-plus" />

							<p:commandButton image="ui-icon-help" value="Ajuda"
								onclick="dlg_Ajuda.show();" type="button" style="width:100%" />


							<br /> <br />
							<h:commandLink title="Voltar " action="home" immediate="true">
								<h:graphicImage value="/images/voltar.png" />
							</h:commandLink>

						</center>
					</h:form>
				</p:layoutUnit>


				<!-- Centro -->

				<p:layoutUnit position="center">
					<br />
					<h:form prependId="false">
						<p:dataTable id="tabela" var="usuario"
							value="#{usuarioController.listarUsuarios}" paginator="true"
							rows="5">
							<p:column>
								<f:facet name="header">
									<h:outputText value="Código" />
								</f:facet>
								<h:outputText value="#{usuario.id}" />
							</p:column>
							<p:column>
								<f:facet name="header">
									<h:outputText value="Nome" />
								</f:facet>
								<h:outputText value="#{usuario.nome}" />
							</p:column>
							<p:column>
								<f:facet name="header">
									<h:outputText value="Login" />
								</f:facet>
								<h:outputText value="#{usuario.login}" />
							</p:column>
							<p:column>
								<f:facet name="header">
									<h:outputText value="E-mail" />
								</f:facet>
								<h:outputText value="#{usuario.email}" />
							</p:column>
							<p:column>
								<f:facet name="header">
									<h:outputText value="Telefone" />
								</f:facet>
								<h:outputText value="#{usuario.telefone}" />
							</p:column>
							<p:column>
								<f:facet name="header">
									<h:outputText value="Bloqueado" />
								</f:facet>
								<h:outputText value="#{usuario.bloqueado}" />
							</p:column>
							<p:column width="20%">
								<f:facet name="header">
									<h:outputText value="Alterar" />
								</f:facet>
								<p:commandButton
									actionListener="#{usuarioController.prepararAlterarUsuario}"
									value="Alterar" update="infoUsuario"
									oncomplete="dlg_GerenciadorUsuario.show()"
									image="ui-icon ui-icon-edit">
								</p:commandButton>
								<p:graphicImage value="/images/edit.gif" />
							</p:column>
							<p:column>
								<f:facet name="header">
									<h:outputText value="Excluir" />
								</f:facet>
								<h:commandLink action="#{usuarioController.excluirUsuario}"
									value="Excluir" />
							</p:column>
						</p:dataTable>


						<h:panelGrid columns="2">
							<p:panel header="Exportar Dados">
								<h:commandLink title="PDF">
									<h:graphicImage value="/images/pdf2.png" />
									<p:dataExporter type="pdf" target="tabela" fileName="usuarios" />
								</h:commandLink>
								<h:commandLink title="Excel">
									<h:graphicImage value="/images/excel.png" />
									<p:dataExporter type="xls" target="tabela" fileName="usuarios" />
								</h:commandLink>
							</p:panel>
						</h:panelGrid>

					</h:form>

				</p:layoutUnit>

			</p:layout>


			<!-- Caixas de Dialogos -->

			<p:dialog header=".: Sistema - Ajuda :. " widgetVar="dlg_Ajuda"
				showEffect="bounce" hideEffect="explode" height="400" width="600">
				<h:outputText value="This dialog has cool effects." />
			</p:dialog>

			<p:dialog header="Cadastro de Usuário"
				widgetVar="dlg_GerenciadorUsuario" resizable="false" modal="true"
				showEffect="bounce" hideEffect="explode" width="500">
				<h:form prependId="false">
					<h:panelGrid id="infoUsuario" columns="1"
						style="margin-bottom:10px">

						<h:outputLabel for="nome" value="Nome:" />
						<p:inputText id="nome" value="#{usuarioController.usuario.nome}"
							required="true" />

						<h:outputLabel for="login" value="Login:" />
						<p:inputText id="login" value="#{usuarioController.usuario.login}" />

						<h:outputLabel for="senha" value="Senha:" />
						<p:growl id="msgs" showDetail="true" />
						<p:password id="senha" value="#{usuarioController.usuario.senha}"
							promptLabel="Digite uma senha" weakLabel="Senha Fraca"
							goodLabel="Senha Razoável" strongLabel="Senha Forte" />

						<h:outputLabel for="email" value="E-mail:" />
						<p:inputText id="email" value="#{usuarioController.usuario.email}" />

						<h:outputLabel for="telefone" value="Telefone:" />
						<p:inputMask id="telefone" mask="([telefone removido]"
							value="#{usuarioController.usuario.telefone}" />

						<h:outputLabel for="bloqueado" value="Bloqueado:" />
						<h:selectOneMenu id="bloqueado"
							value="#{usuarioController.usuario.bloqueado}">
							<f:selectItem itemLabel="Sim" itemValue="S" />
							<f:selectItem itemLabel="Não" itemValue="N" />
						</h:selectOneMenu>

						<p:commandButton update="tabela"
							oncomplete="dlg_GerenciadorUsuario.hide();"
							actionListener="#{usuarioController.adicionarUsuario}"
							value="Salvar" image="ui-icon-disk" />
						<p:commandButton update="tabela"
							oncomplete="dlg_GerenciadorUsuario.hide();"
							actionListener="#{usuarioController.alterarUsuario}"
							value="Alterar" image="ui-icon-document" />

					</h:panelGrid>
				</h:form>
			</p:dialog>

		</f:view>
	</div>
</h:body>

</html>

UsuarioDAO.java

package br.unemat.bbg.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.unemat.bbg.model.Usuario;
import br.unemat.bbg.util.HibernateUtil;

public class UsuarioDAO implements DAO<Usuario> {

	@Override
	public void save(Usuario usuario) throws DAOException {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction t = session.beginTransaction();
		try {
			session.save(usuario);
			t.commit();
			usuario = null;
		} catch (Exception e) {
			throw new DAOException(e.getMessage());
		} finally {
			session.close();
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Usuario> list() {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction t = session.beginTransaction();
		try {
			List<Usuario> lista = session.createQuery("from Usuario").list();
			t.commit();
			return lista;
		} catch (Exception e) {
			throw new DAOException(e.getMessage());
		} finally {
			session.close();
		}
	}

	@Override
	public void remove(Usuario usuario) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction t = session.beginTransaction();
		try {
			session.delete(usuario);
			t.commit();
		} catch (Exception e) {
			throw new DAOException(e.getMessage());
		} finally {
			session.close();
		}
	}

	@Override
	public void update(Usuario usuario) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction t = session.beginTransaction();
		try {
			session.update(usuario);
			t.commit();
		} catch (Exception e) {
			throw new DAOException(e.getMessage());
		} finally {
			session.close();
		}
	}

}

8 Respostas

D

o problema eh o sessionscooped. ele sempre vai gravar na tela pois esta na sessao… vc pode fazer com que aponte para outro usuario, dai nao iria ficar gravado.
cheers!

A

Como o desk falou, você está utilizando sessionScoped, para conseguir limpar os campos, simplesmente crie um método limpar() e adicione após a inserção do objeto.

public void limpar(){
  usuario = null;
.
.
.
}
F

Não é problema de cache…é problema de escopo…
De um lida nos escopos existentes e veja que vc esta usando um que esta deixando da forma que vc não gostaria.

F

sim, estou o session scope msm
escopo de sessão

mas pergunto, não é o certo usar sessao?
pelo q vi em algumas video aulas, em um cadastro usavam sessão…

olha o meu:

<managed-bean-name>usuarioController</managed-bean-name>
		<managed-bean-class>br.unemat.bbg.controller.UsuarioController</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>

e tbm como ja havia perguntado, ja me deram dicas pra colocar:

usuario = null
usuario = new Usuario();

ou seja, ja estou fazendo isso em:

@Override  
    public void save(Usuario usuario) throws DAOException {  
        Session session = HibernateUtil.getSessionFactory().openSession();  
        Transaction t = session.beginTransaction();  
        try {  
            session.save(usuario);  
            t.commit();  
            usuario = null;  
        } catch (Exception e) {  
            throw new DAOException(e.getMessage());  
        } finally {  
            session.close();  
        }  
    }
public void adicionarUsuario(ActionEvent actionEvent) {  
        DAO dao = new UsuarioDAO();  
        dao.save(usuario);  
        usuario = null;  
    }

e agora, me ajuda ai, please… :shock:

F

Coloca request no lugar do session que ja resolve a situação no seu faces.xml…
Mas a questão é que vc ta perdido nas questões dos escopos…se não parar para estudar a coisa não vai dar certo…e vc não vai muito longe.
Como de costume vc concerteza vai entregar um produto bem ruim…

F

ow fernando meu chara…
fiz oq falou…

coloquei request no faces-config.xml, veja

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xi="http://www.w3.org/2001/XInclude"
 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_2_0.xsd">
 <managed-bean>
  <managed-bean-name>usuarioController</managed-bean-name>
  <managed-bean-class>br.unemat.bbg.controller.UsuarioController</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
 </managed-bean>
 <navigation-rule>
  <from-view-id>/pages/cadastros/usuario.xhtml</from-view-id>
  <navigation-case>
   <from-outcome>home</from-outcome>
   <to-view-id>/pages/home.jsf</to-view-id>
  </navigation-case>
 </navigation-rule>
 <lifecycle>
  <phase-listener id="nocache">br.unemat.bbg.util.CacheControlPhaseListener</phase-listener>
 </lifecycle>
</faces-config>

e tbm retirei as notações da classe

//@ManagedBean
//@SessionScoped

so que, continua do mesmo jeito, única coisa que ocorre é que: o que eu cadastro não grava no BD

clico no botão Novo e ja vem preenchido os campos =\

F
  1. Vc não precisa declara no faces.xml se ja esta usando anotação…tira a declaração no xml e usa anotação.
    Usa @RequestScope!

  2. Vc ta pegando o ponteiro da sua coleção…nehum escopo vai resolver isso, uma vez que o objeto acaba no final da execuçao sempre apontando para 1 elemento da coleção.

usuario = (Usuario) (listaUsuarios.getRowData()); Vc tem colocar os valores no objeto do request.

Usuario temp = (Usuario) (listaUsuarios.getRowData());

E depois copiar cada propriedade…

usuario.setId(temp.getId()); usuario.setNome(temp.getNome()); .....

To vendo que vc ta se aventurando na brincadeira…é melhor vc parar tudo para estudar JSF…pq assim não vai chegar muito longe…

F

é kra…
vo ter q parar pra estudar msm…
ta foda… nao deu nao…

ruim é q ñ tenho tempo, tenho q terminar logo, é estagio… :shock:

vc ñ tem um tuto seu ai ou video aula pra eu seguir???

Criado 1 de setembro de 2011
Ultima resposta 1 de set. de 2011
Respostas 8
Participantes 4