sábado, 19 de abril de 2008

Tagged under:

JavaBahia no FISL - 2o Dia

No meu segundo dia de FISL, destaque para a palestra que seria do Simon Phipps, chefe do escritório open source da Sun, entitulada Adoption-Led: The Trend that is driving Free Software in open source communities. Seria porque de última hora Simon teve um problema no dente e não pôde viajar. Ainda assim, teve a gentileza de gravar um vídeo que foi exibido logo no início, justificando sua ausência, fazendo uma breve introdução sobre o tema e apresentando sua substituta, Jean Elliot, diretora sênior da divisão de marketing de produtos Java. No filme, Phipps explicou a transição dos modelos de negócio baseados em vendas de licenças de software para a oferta de serviços agregados, como suporte, correção de bugs, atualizações rápidas e um plano de serviços. É isso que ele chama de Adoption-Led Business Model.

Na sequencia, Jean fez um histórico sobre a transição que a Sun vem promovendo/sofrendo: de uma empresa fechada, e no passado criticada pela comunidade de SL, até a abertura do código dos seus principais produtos (Java, OpenSolaris, NetBeans, por exemplo) mandendo um canal constante de comunicação com as pessoas. Vale o grifo pela importância dada a esse "componente" às vezes deixado em segundo plano em detrimento à tecnologia. Com seu toque feminino, Jean foi mostrando as lições que a Sun vem aprendendo ao longo desses anos, destacando que "Coisas maravilhosas podem acontecer quando as pessoas se comunicam". Durante a jornada é preciso coragem, conhecimento, compaixão, paciência, perseverança, tempo e humor. A Sun sabe que a estrada é longa e não tem certezas sobre tudo, mas acredita estar no caminho certo.

Outra palestra interessante foi Apache Harmony : Building open-source Java from the Ground Up, de Geir Magnusson. O Harmony é um projeto da Apache Software Foundation criado antes do anúncio do OpenJDK, a implementação livre do Java. Geir falou sobre o projeto, sua situação atual (99,06% do Java 5 já funciona) e as principais dificuldades. Garantir que a implementação da Apache é realmente Java significa investir muito em automatização de testes e submeter o código ao Test Compatibility Kit (TCK). Enfim, quem ganha é o desenvolvedor, que poderá em breve escolher a implementação Java livre de sua preferência. Na saída da palestra, encontrei Gregg Sporar (que esteve conosco no I Simpósio Java do Sertão) e Gary Thompson, que está demonstrando o robô trackbot no stand da Sun. Após almoçarmos juntos, Gary me mostrou como funciona o "bichinho" e a API de programação do Sun Spot. Clique aqui se quiser saber mais.



Também vi a experiência da Dataprev com SL e comunidades, uma comparação do software proprietário com a dependência causada pelo tabaco e um painel falando sobre a divisão do espectro de rádio-frequencia brasileiro. Foi um dia de bastante informação e aprendizado, ufa!

(Enquanto digitava esse post, assisti 2 palestras do FISL por vídeo stream. É só identificar o número da sala na programação do evento e acessar a TV Software Livre.)

sexta-feira, 18 de abril de 2008

Tagged under:

JavaBahia no FISL 9.0 - 1o Dia

O maior evento do mundo do software livre acontece pelo 9o ano consecutivo no Brasil, em Porto Alegre. O Fórum Internacional de Software Livre 2008 reúne desenvolvedores, administradores de rede, afixionados por tecnologias, comunidades de usuários, gestores, políticos e, sim, programadores Java. Neste ano resolvir mandar posts diários sobre o que tenho visto de mais interessante, mas não espere só coisas ligadas a Java. Ultimamente tenho procurando muito mais entender o funcionamento do mundo do SL do que assuntos puramente técnicos. Bom... lá vai!

Gostei bastante da palestra Creación colaborativa de Empresas - Cooperativismo y Software Libre, ministrada pelo argentino Leandro Monk. contando sua experiência como fundador de uma cooperativa de trabalho em SL. Monk focou em aspectos interessantes como os princípios de adesão aberta e voluntária, controle de democrático e participação econômica dos sócios, autonomia e independência, e cooperação entre cooperativas. Como obstáculos, apontou e a falta de confiança e compromisso de sócios, juntamente com a burocracia governamental. As cooperativas de SL aparecem como alternativas ao modelo não tradicionais de trabalho. Na Bahia a Colivre é pioneira e pode te ajudar a entender melhor como esse mundo funciona.

Quanto a Java, tive boas conversas com profissionais da Sun, que só fortalecem a parceria com o JavaBahia. Também estive com Manoel Pimentel, do NetBeans User Group Brazil, que já passa dos 400 membros com menos de 1 ano e meio. No final da tarde fui convidado a apresentar o IRPF Java durante 1/2 hora para o Rich Sands, Community Marketing Manager do Java SE. Interessado nos desafios encontrados pela equipe de desenvolvimento e nas características técnicas da aplicação, Rich ficou impressionado com os números: Mais de 17 milhões de downloads e 8 milhões de declarações transmitidas (e o prazo para entrega sem multa ainda é no final de abril!).

Outra palestra que prometia uma boa discussão era a Artistas e Programadores: Como Interfaces de Usuarios Impactam o Movimento de Software Livre, conduzida pelos irmãos Ean e Erick Schuessler (da Brainfood). A idéia era debater, com mais alguns convidados, como designers e programadores poderiam se aproximar mais para criar aplicações de melhor usabilidade. Outra questão seria como envolver designers nos eventos e comunidades de SL. Do meio pro fim, perdeu-se um pouco o fio da meada, descambado para discutir coisas como "O Inkscape e o GIMP substituem o CorelDraw e o Photoshop" ou "existem opções livres para os softwares de design gráfico". Vou tentar conversar um pouco com eles para compreender melhor suas idéias, mas fiquei com a sensação de que o tema central deve ser retomado e debatido inclusive nas universidades.

Ao final do dia, o diretor-presidente do Serpro, Marcos Mazoni, apresentou a Política de SL do Serpro. Mesmo sendo funcionário da empresa, é sempre bom ouvir o quanto o Serpro e o governo Brasileiro estão atuando nessa questão. Ouvi repercussões positivas sobre sua fala. Podemos esperar cada vez mais participação ativa de funcionários públicos nas comunidades de usuários, bem como um aumento na contribuição entre empresas de governo, disponibilizando o código das suas soluções para a sociedade.

No post do 2o dia vou tentar colocar algumas fotos (dá uma Googlada) e falar mais um pouco de Java. Nada como participar pessoalmente, mas vou tentando dar uma idéia de como estão as coisas por aqui...

quinta-feira, 17 de abril de 2008

Tagged under: ,

Desenvolvendo uma aplicação web de forma fácil e prática – 4ª parte

Para você que está chegando agora a este blog, saiba que estamos construindo uma aplicação web em uma seqüência de postagens (parte 1, parte 2 e parte 3) e, neste momento, construiremos o componente Web (veja arquitetura definida na parte 1) que irá “apresentar” o nosso sistema ao usuário.

Vá no menu Arquivo (File), Novo Projeto (New Project). Escolha a categoria Web e o tipo de projeto Aplicação Web (Web Application); clique no botão Avançar (Next). Dê o nome JavaBahiaWeb para o projeto, escolha a localização dele no seu computador e clique no botão Avançar (Next). Você agora terá que escolher o Servidor (Server) em que funcionará o sistema. Como o nosso sistema é simples, ele deverá funcionar em um container web simples como o Tomcat. Se não houver nenhum servidor listado nesta tela, você terá que adicioná-lo clicando no botão Adicionar (Add). No campo Caminho do Contexto (Context Path) escreva '/javabahia' (não esqueça da barra) e clique no botão Avançar (Next). Finalmente, marque o framework Visual Web JavaServer Faces, escreva no campo Pacote Java Padrão (Default Java Package) o valor 'javabahia.web' (não esqueça o ponto), e clique no botão Finalizar (Finish). O Netbeans abrirá para você o código da primeira página criada: Page1.jsp.

Clique com o botão direito do mouse no projeto recém criado, e escolha Propriedades (Properties). Selecione a categoria (categories) Bibliotecas (Libraries); clique no botão Adicionar Biblioteca (Add Library). Escolha a biblioteca que criamos na parte 2 (Hibernate) e clique em OK. Clique no botão Adicionar Projeto (Add Project), escolha o projeto JavaBahiaApp e clique no botão Adicionar JAR do Projeto(Add Project JAR Files). Por fim, clique no botão OK da janela de propriedades do projeto.

Neste post, iremos criar a tela de autenticação do usuário para acessar o sistema. Para isso, vamos renomear a página que foi automaticamente criada – Page1.jsp – para PageLogin.jsp. Clique com o botão direito do mouse em cima do arquivo Page1.jsp, clique em Refatorar (Refactor), depois em Renomear (Rename). Digite o novo nome no campo Novo Nome (New Name) e depois clique em Refatorar (Refactor).

Agora, crie a tela conforme a imagem abaixo, e configurando as propriedades dos componentes da tela de acordo com a tabela a seguir.


-------------------------------------------------------------------------------------
Tipo ! Id ! Propriedades ! Observações
GridPanel ! panelCampos ! {columns:2} ! ---
TextField ! txtLogin ! --- ! Coloque dentro de panelCampos.
Label ! lblLogin ! {for:txtLogin, text:Login} ! Coloque dentro de panelCampos.
PasswordField ! txtSenha ! --- ! Coloque dentro de panelCampos.
Label ! lblSenha ! {for:txtSenha, text:Senha} ! Coloque dentro de panelCampos.
GridPanel ! panelBotoes ! {columns:2} ! ---
Button ! btnAcessar ! {text:Acessar} ! Coloque dentro de panelBotoes.
Button ! btnLimpar ! {text:Limpar} ! Coloque dentro de panelBotoes.
MessageGroup ! grpMsg ! --- ! ---
-------------------------------------------------------------------------------------

Procure no pacote 'javabahia.web' a classe SessionBean1.java, e abra-a no editor de código do Netbeans. Digite, bem abaixo da seção Definição de Componentes Gerenciados (Managed Component Definitions), a seguinte linha:

private Usuario usuarioLogado;

Clique com o botão direito do mouse no código e clique em Corrigir Imports (Fix Imports) para o Netbeans fazer a importação da classe javabahia.entidade.Usuario. Clique novamente com o botão direito e escolha Refatorar (Refactor), Encapsular Campos (Encapsulate Fields). Marque para criar o get e o set, e clique em Refatorar (Refactor).

Agora, procure no pacote 'javabahia.web' a classe RequestBean1.java, e abra-a no editor de código do Netbeans. Digite, bem abaixo da seção Definição de Componentes Gerenciados (Managed Component Definitions), a seguinte linha:

private Usuario usuario;

Clique com o botão direito do mouse no código e clique em Corrigir Imports (Fix Imports) para o Netbeans fazer a importação da classe javabahia.entidade.Usuario. Clique novamente com o botão direito e escolha Refatorar (Refactor), Encapsular Campos (Encapsulate Fields). Marque para criar o get e o set, e clique em Refatorar (Refactor).

Digite, dentro do método init(), bem abaixo da seção Inicialização de Componentes Gerenciados (Managed Component Initialization), a seguinte linha:

setUsuario(new Usuario());

Volte à página PageLogin.jsp, com o editor visual aberto (design). Clique com o botão direito do mouse em cima do campo de texto txtLogin, e clique em Associar a Dado (Bind To Data). Clique na aba Associar a um Objeto (Bind to an Object), e selecione a propriedade login do objeto Usuario que está dentro do objeto RequestBean1. Clique em OK para finalizar a associação.

Clique com o botão direito do mouse em cima do campo de texto txtSenha, e clique em Associar a Dado (Bind To Data). Clique na aba Associar a um Objeto (Bind to an Object), e selecione a propriedade senha do objeto Usuario que está dentro do objeto RequestBean1. Clique em OK para finalizar a associação.

Clique com o botão direito do mouse em cima do projeto JavaBahiaWeb, e selecione Novo (New), Página JSF da Web Visual (Visual Web JSF Page). Digite PagePrincipal no campo Nome do Arquivo (File Name) e clique em Finalizar (Finish). Abra o arquivo faces-config.xml na seção Arquivos de Configuração (Configuration Files) e o Netbeans lhe exibirá as páginas até o momento criadas. Clique em cima de btnAcessar, dentro de PageLogin.jsp, e arraste o mouse até PagePrincipal.jsp, soltando-o. Clique em cima da linha desenhada para selecioná-la, pressione as teclas Control+R, e renomeie case1 para acessoLiberado, conforme mostra a figura abaixo.

Falta ainda criar o evento que será disparado quando o usuário clicar no botão para entrar no sistema. Clique com o botão direito do mouse em cima do botão btnAcessar e clique em Manipulador do Evento da Ação (Edit Action Event Handler). O Netbeans abrirá automaticamente o editor de código, posicionando o cursor dentro de um método recém-criado. Esse método executará o que deverá ser feito para processar a ação do usuário. Digite o seguinte código:

public String btnAcessar_action() {
JavaBahiaFacade facade = new JavaBahiaFacade();
Usuario uReq = getRequestBean1().getUsuario();
Usuario usuario = facade.obterUsuarioPorLoginSenha(uReq.getLogin(), uReq.getSenha()); if (usuario != null) {
getSessionBean1().setUsuarioLogado(usuario);
} else {
error("Não foi possível encontrar o usuário a partir do login/senha informado(s).");
}
return "acessoLiberado";
}

Volte ao editor visual da página PageLogin.jsp (clique no botão Design no topo da janela de código), clique com o botão direito do mouse em cima do botão btnLimpar e clique em Manipulador do Evento da Ação (Edit Action Event Handler). Digite o seguinte código:

public String btnLimpar_action() {
getRequestBean1().setUsuario(new Usuario());
return null;
}

Antes de acessarmos a nossa aplicação, teremos que inserir um registro na tabela Usuario do banco de dados.

INSERT INTO usuario VALUES('teste','teste','Usuário de Teste','teste@javabahia.dev.java.net');

Para os usuários mais avançados, já podem executar esse código, usando o Tomcat, e testar a autenticação. Aos usuários iniciantes, tenham um pouco de calma pois está chegando o grande final. No próximo post, mostrarei como executar esse código e terminaremos de construir nossa aplicação, criando as telas de interface para as entidades Empresa e Contrato. Até lá!

segunda-feira, 14 de abril de 2008

Tagged under: , ,

Tem Java no Sertão!

O SertãoJUG iniciou oficialmente suas atividades em grande estilo: O I Simpósio Java do Sertão foi um sucesso de público e organização! O JavaBahia está orgulhoso em ser parceiro de um grupo de pessoas tão interessado e competente, que se esmerou em cuidar do evento em seus mínimos (mas não menos importantes) detalhes.

Particularmente, foi um dos melhores eventos que já participei. Infelizmente não pudemos estar desde o início, pois Bruno Souza e Gregg Sporar chegaram no sábado de manhã. Na ida de Salvador para Feira, tivemos (eu e Carlos "Bob" Alberto - JavaBahia, Bruno Souza e Gregg Sporar - Sun, e Daniel deOliveira - DFJUG) um papo riquíssimo e animado sobre Fábricas de Software e o cenário brasileiro de TIC. Ao chegar, Bruno e Daniel começaram a tirar fotos sem parar. Algumas podem ser vistas em javabahia.fotopages.com.

Durante o evento, ficamos impressionados com o nível de interesse da platéia. Num dia ensolarado de sábado, a maioria marcou presença até o final. E ainda tiveram a chance de tirar algumas fotos com os palestrantes, ganhar um Pen-drive do NetBeans, uma revista Mundo Java ou um outro brinde qualquer.

Na pessoa de Aécio Júnior, parabenizamos todos os membros do SertãoJUG. Agradecimentos especiais à CPM Braxis, UEFS, DFJUG, Sun e à Vegah Traduções, amigos e parceiros de tantas jornadas.

Agora, já ficamos pensando em qual será (e quando) o próximo evento...
Posted by Picasa

quarta-feira, 9 de abril de 2008

Tagged under: ,

Desenvolvendo uma aplicação web de forma fácil e prática – 3ª parte

Continuando os posts anteriores (parte 1 e parte 2), iremos, nesta terceira parte, inicialmente, criar as classes de persistência, popularmente conhecidas como classes DAO (Data Access Objects).

Clique com o botão direito no nosso projeto, e escolha a opção Novo (New), Classe Java (Java Class). Na caixa de diálogo que se abre, nomeie a classe (Class Name) como UsuarioDao e escreva no campo Pacote (Package), o valor 'javabahia.dao'; clique no botão Finalizar (Finish).

O Netbeans abrirá o editor de código para a classe recém-criada. Digite o código mostrado a seguir:

***


public class UsuarioDao {

private EntityManager em;

public UsuarioDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Usuario usuario) {
em.getTransaction().begin(); // abre uma transação

try {
usuario = em.merge(usuario); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(usuario); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Usuario usuario) {
em.getTransaction().begin(); // abre uma transação

try {
usuario = em.merge(usuario); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(usuario); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Usuario usuario) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Usuario ref = em.find(Usuario.class, usuario.getLogin());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select u from Usuario u");
return qry.getResultList();
}

public Usuario obterPorChave(String login) {
Query qry = em.createQuery("select u from Usuario u where u.login = :param1");
qry.setParameter("param1", login);
return (Usuario) qry.getSingleResult();
}

public Usuario obterPorLoginSenha(String login, String senha) {
Query qry = em.createQuery("select u from Usuario u where u.login = :param1 and u.senha = :param2");
qry.setParameter("param1", login);
qry.setParameter("param2", senha);
return (Usuario) qry.getSingleResult();
}
}


***

Vamos às explicações sobre alguns trechos de código.

private EntityManager em;
// (...)
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();

Essa é a forma como obtemos uma instância da classe EntityManager, responsável pelas operações de persistência dos objetos. As entidades persistentes são associadas a um contexto de persistência (a classe Persistence) e precisam de um provedor de persistência para mostrar como as “coisas” funcionam. As configurações utilizadas pelo provedor de persistência são descritas no arquivo persistence.xml, dentro da pasta META-INF, e nomeadas por uma unidade de persistência (persistence unit).

em.getTransaction().begin();
// (...)
em.getTransaction().commit();
// (...)
em.getTransaction().rollback();

Estas linhas de código servem para, respectivamente, abrir uma transação, finalizar uma transação, e desfazer uma transação.

usuario = em.merge(usuario);

O método merge() coloca o objeto no estado gerenciado pelo contexto de persistência e o insere, ou atualiza-o, no banco de dados. Ele sempre devolve o objeto atualizado pelo banco de dados.

Usuario ref = em.find(Usuario.class, usuario.getLogin());
em.remove(ref);

O método remove() retira o objeto da gerência do contexto de persistência, o que levará o Hibernate a excluí-lo do banco de dados. Antes de remover o objeto, precisamos atualizar a referência do objeto; senão, uma exceção será lançada pelo EntityManager.

Agora, crie também os arquivos EmpresaDao, ContratoDao, e ContratadaDao, lembrando de colocá-los no mesmo pacote 'javabahia.dao'.

***


public class EmpresaDao {

private EntityManager em;

public EmpresaDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Empresa empresa) {
em.getTransaction().begin(); // abre uma transação

try {
empresa = em.merge(empresa); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(empresa); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Empresa empresa) {
em.getTransaction().begin(); // abre uma transação

try {
empresa = em.merge(empresa); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(empresa); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Empresa empresa) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Empresa ref = em.find(Empresa.class, empresa.getCnpj());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select e from Empresa e");
return qry.getResultList();
}

public Empresa obterPorChave(String cnpj) {
Query qry = em.createQuery("select e from Empresa e where e.cnpj = :param1");
qry.setParameter("param1", cnpj);
return (Empresa) qry.getSingleResult();
}
}


***


public class ContratoDao {

private EntityManager em;

public ContratoDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Contrato contrato) {
em.getTransaction().begin(); // abre uma transação

try {
contrato = em.merge(contrato); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contrato); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Contrato contrato) {
em.getTransaction().begin(); // abre uma transação

try {
contrato = em.merge(contrato); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contrato); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Contrato contrato) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Contrato ref = em.find(Contrato.class, contrato.getNumero());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select c from Contrato c");
return qry.getResultList();
}

public Contrato obterPorChave(Integer numero) {
Query qry = em.createQuery("select c from Contrato c where c.numero = :param1");
qry.setParameter("param1", numero);
return (Contrato) qry.getSingleResult();
}
}


***


public class ContratadaDao {

private EntityManager em;

public ContratadaDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Contratada contratada) {
em.getTransaction().begin(); // abre uma transação

try {
contratada = em.merge(contratada); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contratada); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Contratada contratada) {
em.getTransaction().begin(); // abre uma transação

try {
contratada = em.merge(contratada); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contratada); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Contratada contratada) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Contratada ref = em.find(Contratada.class, contratada.getContratadaPK());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select c from Contratada c");
return qry.getResultList();
}

public Contratada obterPorChave(ContratadaPK pk) {
Query qry = em.createQuery("select c from Contratada c where c.contratadaPK.cnpjempresa = :param1 and c.contratadaPK.numerocontrato = :param2");
qry.setParameter("param1", pk.getCnpjempresa());
qry.setParameter("param2", pk.getNumerocontrato());
return (Contratada) qry.getSingleResult();
}

public List obterPorNumeroContrato(Integer numeroContrato) {
Query qry = em.createQuery("select c from Contratada c where c.contratadaPK.numerocontrato = :param1");
qry.setParameter("param1", numeroContrato);
return qry.getResultList();
}

public List obterPorCnpjEmpresa(String cnpjEmpresa) {
Query qry = em.createQuery("select c from Contratada c where c.cnpjempresa = :param1");
qry.setParameter("param1", cnpjEmpresa);
return qry.getResultList();
}
}


***

Criadas as classes de persistência, vamos agora criar a classe que irá encapsular todo esse subsistema: o Façade. Clique com o botão direito no nosso projeto, e escolha a opção Novo (New), Classe Java (Java Class). Na caixa de diálogo que se abre, nomeie a classe (Class Name) como JavaBahiaFacade e escreva no campo Pacote (Package), o valor 'javabahia'; clique no botão Finalizar (Finish). O Netbeans abrirá o editor de código para a classe recém-criada. Digite o código como é mostrado a seguir:

***


public class JavaBahiaFacade {

   
public JavaBahiaFacade() {
   
}

   
public Usuario obterUsuarioPorLoginSenha(String login, String senha) {
       
UsuarioDao dao = new UsuarioDao();
       
Usuario obj = dao.obterPorLoginSenha(login, senha);
       
dao.close();
       
return obj;
   
}

   
public Usuario obterUsuarioPorLogin(String login) {
       
UsuarioDao dao = new UsuarioDao();
       
Usuario obj = dao.obterPorChave(login);
       
dao.close();
       
return obj;
   
}

   
public List obterTodosUsuarios() {
       
UsuarioDao dao = new UsuarioDao();
       
List lista = dao.obterTodos();
       
dao.close();
       
return lista;
   
}

   
public void inserirUsuario(Usuario usuario) {
       
UsuarioDao dao = new UsuarioDao();
       
dao.inserir(usuario);
       
dao.close();
   
}

   
public void atualizarUsuario(Usuario usuario) {
       
UsuarioDao dao = new UsuarioDao();
       
dao.atualizar(usuario);
       
dao.close();
   
}

   
public void excluirUsuario(Usuario usuario) {
       
UsuarioDao dao = new UsuarioDao();
       
dao.excluir(usuario);
       
dao.close();
   
}

   
public Empresa obterEmpresaPorCnpj(String cnpj) {
       
EmpresaDao dao = new EmpresaDao();
       
Empresa obj = dao.obterPorChave(cnpj);
       
dao.close();
       
return obj;
   
}

   
public List obterTodasEmpresas() {
       
EmpresaDao dao = new EmpresaDao();
       
List lista = dao.obterTodos();
       
dao.close();
       
return lista;
   
}

   
public void inserirEmpresa(Empresa empresa) {
       
EmpresaDao dao = new EmpresaDao();
       
dao.inserir(empresa);
       
dao.close();
   
}

   
public void atualizarEmpresa(Empresa empresa) {
       
EmpresaDao dao = new EmpresaDao();
       
dao.atualizar(empresa);
       
dao.close();
   
}

   
public void excluirEmpresa(Empresa empresa) {
       
EmpresaDao dao = new EmpresaDao();
       
dao.excluir(empresa);
       
dao.close();
   
}

   
public Contrato obterContratoPorNumero(Integer numero) {
       
ContratoDao dao = new ContratoDao();
       
Contrato obj = dao.obterPorChave(numero);
       
dao.close();
       
return obj;
   
}

   
public List obterTodosContratos() {
       
ContratoDao dao = new ContratoDao();
       
List lista = dao.obterTodos();
       
dao.close();
       
return lista;
   
}

   
public void inserirContrato(Contrato contrato) {
       
ContratoDao dao = new ContratoDao();
       
dao.inserir(contrato);
       
dao.close();
   
}

   
public void atualizarContrato(Contrato contrato) {
       
ContratoDao dao = new ContratoDao();
       
dao.atualizar(contrato);
       
dao.close();
   
}

   
public void excluirContrato(Contrato contrato) {
       
ContratoDao dao = new ContratoDao();
       
dao.excluir(contrato);
       
dao.close();
   
}

   
public Contratada obterContratadaPorContratoEmpresa(Integer numeroContrato, String cnpjEmpresa) {
       
ContratadaDao dao = new ContratadaDao();
       
ContratadaPK chave = new ContratadaPK();
       
chave.setNumerocontrato(numeroContrato);
       
chave.setCnpjempresa(cnpjEmpresa);
       
Contratada obj = dao.obterPorChave(chave);
       
dao.close();
       
return obj;
   
}

   
public List obterTodasContratadasPorContrato(Integer numeroContrato) {
       
ContratadaDao dao = new ContratadaDao();
       
List lista = dao.obterPorNumeroContrato(numeroContrato);
       
dao.close();
       
return lista;
   
}

   
public List obterTodasContratadasPorEmpresa(String cnpjEmpresa) {
       
ContratadaDao dao = new ContratadaDao();
       
List lista = dao.obterPorCnpjEmpresa(cnpjEmpresa);
       
dao.close();
       
return lista;
   
}

   
public void inserirContratada(Contratada contratada) {
       
ContratadaDao dao = new ContratadaDao();
       
dao.inserir(contratada);
       
dao.close();
   
}

   
public void atualizarContratada(Contratada contratada) {
       
ContratadaDao dao = new ContratadaDao();
       
dao.atualizar(contratada);
       
dao.close();
   
}

   
public void excluirContratada(Contratada contratada) {
       
ContratadaDao dao = new ContratadaDao();
       
dao.excluir(contratada);
       
dao.close();
   
}
}


***

Com isso, finalizamos o nosso componente Aplicação. Agora nos resta construir o componente Web, o qual será a nossa interface com o exemplo que estamos desenvolvendo. Isso ficará para o próximo post. Até lá!

PS: Os arquivos .java foram disponibilizados no serviço 4Shared mas foram apagados após um tempo de inatividade de minha conta. Por isso, colei o código das classes no meio do texto desse post e retirei os links originais.

domingo, 6 de abril de 2008

Tagged under: ,

Desenvolvendo uma aplicação web de forma fácil e prática – 2ª parte

Continuando o post anterior, vamos agora à fase de modelagem do banco de dados. Eu usarei o banco MySQL 5, mas você pode usar qualquer outro que seja relacional. Crie um banco (ou esquema) chamado 'javabahia' e, em seguida, crie as tabelas abaixo listadas, adaptando-as para o banco de dados que tiver sido escolhido.

CREATE TABLE usuario (
login varchar(14) NOT NULL,
senha varchar(40) NOT NULL,
nome varchar(60) NOT NULL,
email varchar(100) default NULL,
PRIMARY KEY (login)
);
CREATE TABLE empresa (
cnpj varchar(14) NOT NULL,
nome varchar(60) NOT NULL,
email varchar(100) default NULL,
PRIMARY KEY (cnpj)
);
CREATE TABLE contrato (
numero int(10) unsigned NOT NULL auto_increment,
objeto varchar(100) NOT NULL,
dataassinatura date NOT NULL,
prazovigencia int(10) unsigned NOT NULL,
cadastrante varchar(14) NOT NULL,
PRIMARY KEY (numero)
);
CREATE TABLE contratada (
numerocontrato int(10) unsigned NOT NULL,
cnpjempresa varchar(14) NOT NULL,
codigobanco int(10) unsigned NOT NULL,
agencia varchar(5) NOT NULL,
conta varchar(10) NOT NULL,
PRIMARY KEY (numerocontrato,cnpjempresa)
);
ALTER TABLE contrato ADD CONSTRAINT fk_contrato_usuario FOREIGN KEY fk_contrato_usuario (cadastrante) REFERENCES usuario (login) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE contratada ADD CONSTRAINT fk_contratada_contrato FOREIGN KEY fk_contratada_contrato (numerocontrato) REFERENCES contrato (numero) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE contratada ADD CONSTRAINT fk_contratada_empresa FOREIGN KEY fk_contratada_empresa (cnpjempresa) REFERENCES empresa (cnpj) ON DELETE NO ACTION ON UPDATE NO ACTION;


Agora, vamos adicionar as bibliotecas de classes do Hibernate à IDE Netbeans 6. Vá ao site http://www.hibernate.org/ e baixe os pacotes Hibernate Core e Hibernate Entity Manager, da versão 3. Separe, em uma pasta do seu computador, os seguintes arquivos para serem referenciados posteriormente pelo Netbeans:

hibernate3.jar
hibernate-entitymanager.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
ant-1.6.5.jar
ant-antlr-1.6.5.jar
antlr-2.7.6.jar
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
commons-collections-2.1.1.jar
commons-logging-1.0.4.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
ejb3-persistence.jar
javassist.jar
jboss-archive-browsing.jar
jta.jar


No Netbeans, clique no menu Ferramentas (Tools), Bibliotecas (Libraries). Clique no botão Nova Biblioteca (New Library), digite Hibernate como o nome da biblioteca, e escolha, como o Tipo da Biblioteca (Library Type), Bibliotecas de Classes (Class Libraries). Clique no botão Adicionar JAR (Add Jar/Folder) e aponte para os arquivos que você havia separado anteriormente. Clique em OK para fechar a caixa de diálogo.


Screenshot 1
Ainda é necessário adicionar o driver JDBC do banco de dados escolhido. Pegue o arquivo .jar do driver JDBC do seu banco de dados e separe-o em uma pasta do seu computador. Faça o mesmo processo que fizemos para registrar a biblioteca do Hibernate, colocando o nome do seu banco como o nome da biblioteca. No caso do MySQL, o Netbeans já traz o driver JDBC para esse banco.

Agora poderemos criar o nosso projeto para o componente Aplicação. Vá no menu Arquivo (File), Novo Projeto (New Project). Escolha a categoria Java e o tipo de projeto Biblioteca de Classes Java (Java Class Library); clique no botão Avançar (Next). Dê o nome JavaBahiaApp para o projeto, escolha a localização dele no seu computador e clique no botão Finalizar (Finish).

Clique com o botão direito no projeto recém-criado, e escolha a opção Novo (New), Classes de Entidade do Banco de Dados (Entity Classes from Database). Na caixa de diálogo que se abre, escolha Nova Conexão de Banco de Dados (New Database Connection) na lista de seleção Conexão de Banco de Dados (Database Connection). Escolha na lista Nome (Name) o driver do seu banco de dados, e preencha os demais campos para apontar para o banco que criamos anteriormente. Marque para Lembrar Senha (Remember Password) e clique no botão OK, duas vezes.

O Netbeans listará as tabelas do banco de dados à esquerda. Clique no botão Adicionar Tudo (Add All) e depois no botão Avançar (Next).

Screenshot 2
Escreva no campo Pacote (Package), o valor 'javabahia.entidade', e clique no botão Unidade de Persistência (Persistence Unity). Deixe o nome sugerido pelo Netbeans e escolha Hibernate na lista Biblioteca de Persistência (Persistence Library). Escolha a Estratégia de Geração de Tabelas (Table Generation Strategy) Nenhuma (None), pois já criamos as tabelas anteriormente. Clique no botão Criar (Create).

Screenshost 3
Quando o Netbeans retornar para a caixa de diálogo principal, desmarque a opção Gerar Anotações de Consulta Nomeada para Campos Persistentes (Generate Named Query Annotations for Persistence Fields), e clique no botão Finalizar (Finish). Você deverá estar com o seu projeto como mostra a figura a seguir.

Screenshot 4
Abra as classes para olhar o código que foi gerado pelo Netbeans. As classes Entidades foram geradas a partir das tabelas do banco de dados, e ficaram quase iguais ao nosso modelo de classes de domínio. Não mexeremos nelas nesse momento, para que possamos mostrar os próximos passos. Sugiro a você, leitor, que estude as anotações (annotations) da JPA que foram introduzidas em nossas classes Entidades para aprofundar seus conhecimentos; elas são auto-explicáveis. Leia estes posts sobre JPA (aqui e aqui) do nosso amigo Ramon Lopes, pois eles podem ser úteis.

No próximo post veremos a criação das demais classes do componente Aplicação. Até lá!

sexta-feira, 4 de abril de 2008

Tagged under: ,

Desenvolvendo uma aplicação web de forma fácil e prática – 1ª parte

Tempos atrás, desenvolver uma aplicação web com Java requeria muito esforço e tempo para programar várias linhas de código só para ter uma simples tela funcionando.

Primeiro, usávamos apenas servlets e, logo depois, vieram os JSP's e as taglibs. Posteriormente, o uso de frameworks popularizou-se e muitos passaram a usar o Struts, o mais popular framework MVC. Ultimamente, cada vez mais programadores têm usado o framework JSF, criado a partir de uma especificação da Sun para que o desenvolvimento web se torne mais parecido com o desenvolvimento de uma aplicação desktop.

Para persistir os objetos em um banco de dados relacional, antes, construíamos as cláusulas SQL e executávamos-as usando o JDBC. Com o tempo, passamos a usar o Hibernate, um framework que traduz os objetos para o mundo relacional, e vice versa. Hoje, temos a especificação JPA (Java Persistence API), nascido como fruto desse framework de sucesso, que facilitou mais ainda o trabalho de codificação da persistência dos objetos.

Irei começar a mostrar com este post, uma "receita de bolo" para fazer uma aplicação web de forma fácil e prática, usando o JSF, o Hibernate, e a IDE Netbeans 6. Para isso, vamos entender primeiramente como será a arquitetura de nossa aplicação. Estruturamos a aplicação em dois componentes principais: Web e Aplicação.

Arquitetura do Sistema
O componente Aplicação é a nossa aplicação de fato, o seu núcleo. Ele contém as entidades de nosso domínio, as regras de negócio do contexto, os objetos de persistência, e um objeto centralizador que irá encapsular toda a nossa aplicação (façade).

O componente Web é a nossa interface web da aplicação. Ele contém as páginas JSP, com seus respectivos objetos Page Beans associados, os beans de request e session, e os objetos provedores para as grids de tela. A maior vantagem de separarmos a interface do núcleo da aplicação é a de posteriormente mudarmos a “cara” da aplicação para uma interface desktop, ou outra qualquer.

Para esse exemplo, vamos estabelecer agora o contexto de nosso domínio. Nossa aplicação simulará um simples sistema de contratos, no qual um usuário autentica-se no sistema e cadastra contratos efetuados com outras empresas. Para efeitos didáticos, vamos ignorar muita coisa que deveria ser pensada num contexto desse tipo (multas contratuais, por exemplo), e apenas nos prender ao diagrama de classes de domínio abaixo.

Diagrama de classes de domínio
Observando o diagrama de classes, vemos que todo Contrato possui um Usuário cadastrante e uma Empresa contratada. A partir da relação entre um Contrato e uma Empresa, nasce a classe Contratada, que possui informações bancárias para pagamento daquele contrato; outro contrato com a mesma empresa poderá ser pago em uma conta bancária diferente.

Nos próximos posts, veremos os passos para a construção de nossa aplicação. Acompanhem!