Dúvida com JSF

Bom dia,

Eu peguei a apostila da GUJ de JSF

http://www.guj.com.br/java.artigo.158.1.guj

e conseguir fazer todos os passos, porém o modelo Agenda estava muito bagunçado, o que eu fiz… :smiley:

1º Passei tudo para o hibernate (Continuo funcionando beleza)

2ª Fiz um AgendaControle e retirei os métodos inserir e buscar

ai que surgiu o problema não funciona…

vo colocar o codigo de tudo antes de implementar o AgendaControle

Agenda

package br.com.g1ti.agenda.modelo;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.HibernateException;

import br.com.g1ti.agenda.dao.Dao;
import br.com.g1ti.agenda.dao.DaoFactory;

@Entity
@Table(name="pessoa")
public class Agenda {
	@Id
	private String nome;
	private String endereco;
	private String cidade;
	private String telefone;
		
	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	
	public static final String FALHA = "failure";

	public static final String SUCESSO = "success";

	public String inserir() {

		String resultado;

		DaoFactory<Agenda> daoFactoryAgenda = new DaoFactory<Agenda>(
				Agenda.class);

		Dao<Agenda> agendaDao = daoFactoryAgenda.getDao();

		try {
			daoFactoryAgenda.beginTransaction();
			agendaDao.adiciona(this);
			daoFactoryAgenda.commit();
			resultado = SUCESSO;
		} catch (HibernateException e) {

			resultado = FALHA;
		}

		daoFactoryAgenda.close();

		return resultado;
	}

	public String buscar() {

		String resultado;

		DaoFactory<Agenda> daoFactoryAgenda = new DaoFactory<Agenda>(
				Agenda.class);

		Dao<Agenda> agendaDao = daoFactoryAgenda.getDao();

		try {

			Agenda rs = agendaDao.procura(this.getNome());

			this.setNome(rs.getNome());
			this.setEndereco(rs.getEndereco());
			this.setCidade(rs.getCidade());
			this.setTelefone(rs.getTelefone());

			resultado = SUCESSO;
		} catch (HibernateException e) {

			resultado = FALHA;
		}

		return resultado;
	}
	
}

faces-config

<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
                              "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
 <managed-bean>
  <managed-bean-name>agendaControle</managed-bean-name>
  <managed-bean-class>br.com.g1ti.agenda.controle.AgendaControle</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
 </managed-bean>
 <managed-bean>
  <managed-bean-name>agenda</managed-bean-name>
  <managed-bean-class>br.com.g1ti.agenda.modelo.Agenda</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
 </managed-bean>
 <navigation-rule>
  <from-view-id>/buscar.jsp</from-view-id>
  <navigation-case>
   <from-outcome>success</from-outcome>
   <to-view-id>/sucesso_busca.jsp</to-view-id>
  </navigation-case>
  <navigation-case>
   <from-outcome>failure</from-outcome>
   <to-view-id>/falha_busca.jsp</to-view-id>
  </navigation-case>
 </navigation-rule>
 <navigation-rule>
  <from-view-id>/inserir.jsp</from-view-id>
  <navigation-case>
   <from-outcome>success</from-outcome>
   <to-view-id>/sucesso_insercao.jsp</to-view-id>
  </navigation-case>
  <navigation-case>
   <from-outcome>failure</from-outcome>
   <to-view-id>/falha_insercao.jsp</to-view-id>
  </navigation-case>
 </navigation-rule>
</faces-config>

é… acho que falei muito e não expliquei muito bem…

quero saber se seria melhor separar do Modelo os métodos de acesso ao banco, no caso inserir e buscar ou se eu posso deixar lá mesmo… e se não…

como eu implementaria o AgendaControle… ou algo do gênero…

Obrigado.

amigo, tem um ZIP com todo o conteudo do livro JSP, Servlets, Java Server Faces, Hibernate, EJB 3 Persistence e AJAX aqui. É só baixar o arquivo e abrir o projeto JSFComDAO no netbeans. Acho que isso vai tirar todas as suas dúvidas, vale a pena dar uma olhada.

Abraço
Daniel

É bom tirar, com certeza. Não li o tutorial, mas certamente o autor o fez assim por razões de simplicidade e objetivo.
Um bom exemplo de uso desta camada é usar SLSB (Stateless Session Beans) como DAOs e backing beans de páginas JSF. Assim o seu backing bean recebe o DAO por injeção de dependência (@EJB), e redireciona para ele as chamadas para a camada de persistência, depois de fazer ele mesmo as validações e outros tratamentos da camada de apresentação.

Eu recomendo você deixar na classe Agenda apenas os atributos e os métodos getters e setters…
e criar outra classe AgendaController para fazer o controle dos dados…
em AgendaController um atributo Agenda e teria também os métodos buscar, inserir, remover, entre outros métodos referentes a Agenda.

Espero ter ajudado…
Att

Agradeço as recomendações…

Achei o zip… mas ele tá do mesmo jeito, ou seja tudo junto

fico desse jeito…

Agenda

package br.com.g1ti.agenda.modelo;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="pessoa")
public class Agenda {
	@Id
	private String nome;
	private String endereco;
	private String cidade;
	private String telefone;
			
	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	
	public static final String FALHA = "failure";

	public static final String SUCESSO = "success";

/*	public String inserir() {
			

		DaoFactory<Agenda> daoFactoryAgenda = new DaoFactory<Agenda>(
				Agenda.class);

		Dao<Agenda> agendaDao = daoFactoryAgenda.getDao();

		try {
			daoFactoryAgenda.beginTransaction();
			agendaDao.adiciona(this);
			daoFactoryAgenda.commit();
			resultado = SUCESSO;
		} catch (HibernateException e) {

			resultado = FALHA;
		}

		daoFactoryAgenda.close();

		return resultado;
	}

	public String buscar() {

		String resultado;

		DaoFactory<Agenda> daoFactoryAgenda = new DaoFactory<Agenda>(
				Agenda.class);

		Dao<Agenda> agendaDao = daoFactoryAgenda.getDao();

		try {

			Agenda rs = agendaDao.procura(this.getNome());

			this.setNome(rs.getNome());
			this.setEndereco(rs.getEndereco());
			this.setCidade(rs.getCidade());
			this.setTelefone(rs.getTelefone());

			resultado = SUCESSO;
		} catch (HibernateException e) {

			resultado = FALHA;
		}

		return resultado;
	}
	*/
}

AgendaControle

package br.com.g1ti.agenda.controle;

import org.hibernate.HibernateException;

import br.com.g1ti.agenda.dao.Dao;
import br.com.g1ti.agenda.dao.DaoFactory;
import br.com.g1ti.agenda.modelo.Agenda;

public class AgendaControle {

	private Agenda agenda;
	
	public static final String FALHA = "failure";

	public static final String SUCESSO = "success";
	
	public Agenda getAgenda(){
		return agenda;		
	}
	public String inserir() {

		String resultado;

		DaoFactory<Agenda> daoFactoryAgenda = new DaoFactory<Agenda>(
				Agenda.class);

		Dao<Agenda> agendaDao = daoFactoryAgenda.getDao();

		try {
			daoFactoryAgenda.beginTransaction();
			agendaDao.adiciona(agenda);
			daoFactoryAgenda.commit();
			resultado = SUCESSO;
		} catch (HibernateException e) {

			resultado = FALHA;
		}

		daoFactoryAgenda.close();

		return resultado;
	}

	public String buscar() {

		String resultado;

		DaoFactory<Agenda> daoFactoryAgenda = new DaoFactory<Agenda>(
				Agenda.class);

		Dao<Agenda> agendaDao = daoFactoryAgenda.getDao();

		try {

			Agenda rs = agendaDao.procura(agenda.getNome());

			agenda.setNome(rs.getNome());
			agenda.setEndereco(rs.getEndereco());
			agenda.setCidade(rs.getCidade());
			agenda.setTelefone(rs.getTelefone());

			resultado = SUCESSO;
		} catch (HibernateException e) {

			resultado = FALHA;
		}

		return resultado;
	}

}

o faces config eu deixei do mesmo jeito

inserir.jsp

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<html>
	<head>
		<title>Inserção</title>
	</head>
	<body>
		<f:view>
			<h:form>
				<h2>Inserção</h2>
				<h3>Entre com os dados abaixo:</h3>
				<table>
					<tr>
						<td>Nome</td>
						<td>
							<h:inputText value="#{agendaControle.agenda.nome}" />
						</td>
					</tr>
					<tr>
						<td>Endereço</td>
						<td>
							<h:inputText value="#{agendaControle.agenda.endereco}" />
						</td>						
					</tr>
					<tr>
						<td>Cidade</td>
						<td>
							<h:inputText value="#{agendaControle.agenda.cidade}" />
						</td>						
					</tr>
					<tr>
						<td>Telefone</td>
						<td>
							<h:inputText value="#{agendaControle.agenda.telefone}" />
						</td>						
					</tr>
				</table>
				<p>
					<h:commandButton value="Inserir" action="#{agendaControle.inserir}"/>
				</p>
				<h:outputLink value="index.jsf">
					<f:verbatim>Voltar</f:verbatim>
				</h:outputLink>						
			</h:form>
		</f:view>
	</body>	
</html>

deu o seguinte erro

exception

javax.servlet.ServletException: Error testing property 'nome' in bean of type null
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:209)

root cause

javax.faces.el.PropertyNotFoundException: Error testing property 'nome' in bean of type null

Alguém sabe o que aconteceu

olá,
não sei se é isso…
mas acho que pode ser o método setAgenda(Agenda a) { } que está faltando…
tenta adicionar esse método… teste e depois diz o resultado …

espero ter ajudado
att

Deu certo não … hehe mesmo erro ainda

O erro deve estar no seu faces-config.

No seu código tem o seguinte:

<managed-bean>   
  <managed-bean-name>agendaControle</managed-bean-name>   
  <managed-bean-class>br.com.g1ti.agenda.controle.AgendaControle</managed-bean-class>   
  <managed-bean-scope>request</managed-bean-scope>   
</managed-bean>   

altere o managed-bean-scope para session

<managed-bean>   
  <managed-bean-name>agenda</managed-bean-name>   
  <managed-bean-class>br.com.g1ti.agenda.modelo.Agenda</managed-bean-class>   
  <managed-bean-scope>request</managed-bean-scope>   
</managed-bean>   

remova isso do seu faces-config.

Depois que testar … diz aí se funcionou …

Att

E nas páginas JSF você não usa mais

#{agenda.nome}

use

#{agendaControle.agenda.nome}

Mesmo erro…