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

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="(99)9999-9999"
							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();
		}
	}

}

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!

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;
.
.
.
}

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.

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:

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…

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 =\

  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…

é 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???