Entao pessoal, finalmente apareceu uma boa oportunidade e eu quero muito essa vaga..
Ontem eu fiz uma prova escrita e consegui passar.. e hoje é o dia da prova pratica..
Que vai consistir na criação de um CRUD utilizando JSF 1.2 e algum outro framework à nossa escolha.. escolhi utilizar o JPA. OK
Mas ele disse tambem que a utilização de design patterns e boas práticas seriam bem avaliados.. entao eu criei um projeto aqui e queria saber da opiniao de vcs.
Organização do Projeto:
[img]http://img515.imageshack.us/img515/8418/projetoqx.png[/img]
queria que vocês avaliassem o meu SINGLETON:
package br.com.ceuma.persistence;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class EntityManagerFactorySingleton {
private static final EntityManagerFactorySingleton singleton = new EntityManagerFactorySingleton();
private static EntityManagerFactory fabrica = null;
private final String unidadeDePesistencia;
private EntityManagerFactorySingleton() {
this.unidadeDePesistencia = new Configuracoes().getConfigution("unidade_de_persistencia");
System.out.println("Criando Entity");
}
public static EntityManagerFactorySingleton getInstance(){
return singleton;
}
public EntityManager getManager(){
try {
if(fabrica == null){
fabrica = Persistence.createEntityManagerFactory(this.unidadeDePesistencia);
return fabrica.createEntityManager();
} else {
return fabrica.createEntityManager();
}
} catch (Exception e) {
System.err.println("ERRO: " + e.getMessage());
return null;
}
}
}
essa classe é responsavel por criar EntityManagers.. ela utiliza uma outra classe utilitaria.. para ler um arquivo properties.. para preencher o metodo
Persistence.createEntityManagerFactory();
Eu creio que isso seja uma boa prática, particularmente nao acho interessante colocar esse tipo de informação no codigo diretamente.
package br.com.ceuma.persistence;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Configuracoes {
private InputStream stream;
public Configuracoes() {
stream = this.getClass().getResourceAsStream("config.properties");
}
public String getConfigution(String configucao){
Properties props = new Properties();
try {
props.load(stream);
return props.getProperty(configucao);
} catch (IOException e) {
System.err.println("ERRO NA LEITURA DO ARQUIVO DE CONFIGURAÇÃO) " + e.getMessage());
return null;
}
}
}
e agora o meu DAO
package br.com.ceuma.dao;
public interface DAO<T> {
void save(T t);
void remove(T t);
T find(Long id);
void update(T t);
}
meu BackingBean ja mapeado
package br.com.ceuma.model;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="tb_contato")
public class Contato {
@Id @GeneratedValue
private Long id;
private String nome;
@Column(unique=true)
private String email;
private String endereco;
@Column(name="data_nascimento")
private Date dataNascimento;
// getters & setters
a classe que implementa o DAO
package br.com.ceuma.dao;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import br.com.ceuma.model.Contato;
import br.com.ceuma.persistence.EntityManagerFactorySingleton;
public class ContatoDAO implements DAO<Contato> {
private EntityManager manager;
public ContatoDAO() {
this.manager = EntityManagerFactorySingleton.getInstance().getManager();
}
public void save(Contato t) {
EntityTransaction transacao = this.manager.getTransaction();
transacao.begin();
try {
this.manager.persist(t);
transacao.commit();
} catch (Exception e) {
System.err.println("ERRO AO SALVAR O OBJETO: " + t + "\n" + e.getMessage());
transacao.rollback();
} finally {
this.manager.close();
}
}
public void remove(Contato t) {
EntityTransaction transacao = this.manager.getTransaction();
transacao.begin();
try {
this.manager.remove(t);
transacao.commit();
} catch (Exception e) {
System.err.println("ERRO AO REMOVER O OBJETO: " + t + "\n" + e.getMessage());
transacao.rollback();
} finally {
this.manager.close();
}
}
public Contato find(Long id) {
EntityTransaction transacao = this.manager.getTransaction();
transacao.begin();
try {
Contato contato = this.manager.find(Contato.class,id);
transacao.commit();
return contato;
} catch (NoResultException e) {
System.err.println("Sem resultados para a consulta: " + e.getMessage() );
transacao.rollback();
return null;
} finally {
this.manager.close();
}
}
public void update(Contato t) {
EntityTransaction transacao = this.manager.getTransaction();
transacao.begin();
try {
this.manager.merge(t);
transacao.commit();
} catch (PersistenceException e) {
System.err.println("Erro ao atualizar o objeto: " + e.getMessage() );
transacao.rollback();
} finally {
this.manager.close();
}
}
}
organização das classes e outros arquivos:
[img]https://lh5.googleusercontent.com/-24NPAebizpA/T_Lv_XVpLCI/AAAAAAAADsM/IEzbxWtWoWM/s464/2.jpg[/img]
e agora a parte WEB.. eu escolhi utilizar o facelets tbm.. pq acho que ele é importante pra organização do trabalho.. acho bem 'elegante.'
segue o meu template:
<!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">
<head>
<link rel="stylesheet" href="css/estilo.css" type="text/css"/>
<title>Teste do UNICEUMA</title>
</head>
<body>
<div id="all">
<!-- FRAGMENTO DO TOPO -->
<div id="topo">
<ui:insert name="topo">
<ui:include src="/fragmentos/topo.xhtml" />
</ui:insert>
</div>
<!-- FRAGMENTO DO MENU -->
<div id="menu">
<ui:insert name="menu">
<ui:include src="/fragmentos/menu.xhtml" />
</ui:insert>
</div>
<!-- COTEUDO PRINCIPAL -->
<div id="principal">
<ui:insert name="principal">
</ui:insert>
</div>
<!-- FRAGMENTO DO RODAPE -->
<div id="rodape">
<ui:insert name="rodape">
<ui:include src="/fragmentos/rodape.xhtml" />
</ui:insert>
</div>
</div>
</body>
</html>
entao.. queria saber o que vocês acharam.. o que vcs acham que eu poderia fazer pra melhorar..
como estao minhas 'boas praticas'.. e se vcs puderem me ajudar a deixar esse projeto ai o mais OO possivel, seria magnifico tbm.
desde ja agradeco MESMO..
edit: pessoal, irei comentar todo o codigo ainda..
ai como tive que desfazer algumas coisas isso levou muito tempo… infelizmente foi assim…