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…
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.
yorgan
Janeiro 23, 2008, 10:34am
#2
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}