segunda-feira, 2 de maio de 2011

Listagem de dados com Struts2 e Hibernate em Netbeans

Olá, Inicia-se hoje uma série de tutoriais (começando por esse) de como fazer o elementar (CRUD) usando Struts2 com Hibernate em uma aplicação web. Usaremos como IDE o Netbeans com o plugin do Struts2. Para acompanhar esse tutorial, é recomendado que tenha lido o post anterior introdutório ao assunto.

Criando o banco de dados
No exemplo usamos PostgreSQL. A estrutura do banco de dados é a seguinte.
Banco: todolist
CREATE TABLE todolist
(
   id serial, 
   descricao character varying(200), 
   feito character(1), 
   CONSTRAINT pk_todolist PRIMARY KEY (id)
) 
WITH (
  OIDS = FALSE
)
;

insert into todolist (descricao,feito) values ('Fazer o pos no foojava.blogspo.com','S');
insert into todolist (descricao,feito) values ('Terminar a leitura do livro the long tail','N');
insert into todolist (descricao,feito) values ('Fazer artigo da prática de e-commerce','N');
insert into todolist (descricao,feito) values ('Terminar os layouts do sistema da COTRIMAIO','N');
insert into todolist (descricao,feito) values ('Estudar para prova de adm mercadológica','N');
insert into todolist (descricao,feito) values ('Estudar para prova de Redes e sist. distribuídos','N');




Criando o projeto
Na nossa IDE, criamos um projeto web, vou chamar de todolist.

Vamos lá! file > New project.

 Chamei de todolist, salvando no meu home, diretório padrão.

Agora, escolha o Apache Tomcat (se aparecer mais algum na lista). O resto dessa tela aceite as sugestões da IDE.

Aqui, você marca o Struts2, e desmarca para ele criar o arquivo de exemplo do struts2. Nesta mesma figura tem mais um item para marcar, seguimos abaixo.

Marque o Hibernate, mas não dê finish ainda, vamos aproveitar para fazer já a conexão  com o banco de dados. No combo destacado abaixo, crie uma nova conexão.

Aqui escolhi conectar com PostgreSQL, informo usuário, senha, banco ... Quando dou ok, devo selecionar qual schema (próxima tela), se as informações dessa tela conectaram no banco.

 Escolha o schema public. Agora sim, ok.

E Finish!

A essa altura o NetBeans incluiu as bibliotecas necessárias, fez uma configuração básica já do struts, hibernate o do web.xml (que define o projeto web).

Abaixo você pode ver a web.xml, que define quem é a página inicial quando esse projeto for rodado.



Definindo a Model

Projeto criado, hora de fazer a classe que fará o mapeamento do banco de dados. Essa classe será usada pelo hibernate, portanto, depois você terá que adicionar as anotations.

Crie um novo pacote, chame-o de model.




Dentro da model, clique com o direito e crie um novo "HibernateUtil", mudei apenas  o nome do arquivo em relação ao que a IDE me sugeriu.

Na tela anterior a IDE vai gerar um arquivo (HibernateUtil.java), ele está certo, não tem que mudar nada.

Agora dentro do pacote model, você precisa fazer a classe que mapeia o seu banco. Então, dentro da model, crie uma nova classe java. O nome dela é o nome da tabela no banco que essa classe vai representar, apenas com o primeiro caracter em maiúsculo.

Na tela abaixo, criei os atributos (linhas 13, 14 e 15), cliquei com o direito em "refactory" e depois em "Encapsulate fields", marquei que ele deveria gerar os geters e os seters de todos os atributos e sem comentários. Pronto! Gerou o código que você vê abaixo.

Bom, agora nessa mesma classe, temos que identificar para o Hibernate que isso representa uma tabela.  Então adicione as anotações das linhas 18, 19, 21 e 22.

Quando fizer isso vai a IDE vai ficar te apontando warnings, ctrl+enter em cima do warning (em cima do @Id por exemplo, @table) e faça os imports, todos do pacote javax. Não pegue os do hibernate.

Veja o código final da classe model na figura seguinte.



Criando a DAO (Data Access Object)
O nosso objeto de acesso a dados, nada mais é do aque algo que usa a model, e em cima disso cria as SQL's que deverão ser rodadas no banco para a aplicação trazer os dados/ fazer as ações que precisa.

Crie um novo pacote, chame-o de dao.

 Dentro do dao, crie uma classe chamada TodolistDAO.
 

Como esse exemplo é só uma listagem, não precisamos dos métodos para inserir, deletar, update, buscar dados de só um registro (para trazer para edição), então implementamos apenas o médoto de listagem de dados.

O que temos no código abaixo. Bom primeio criamos um atributo chamado session, essa session na verdade representa a conexão com o BD (linha 19).

Então, no construtor da classe (linhas 21, 22 e 23) dizemos que a session manda abrir uma sessão (conexão) que quem define é o HibernateUtils que criamos antes.

E depois, nas linhas 24 em diante, implementamos o método que retorna uma lista de dados. Veja que a gente não escreve SQL nenhuma, o hibernate faz isso.

* Os imports dessa classe sim, são do hibernate (org.hibernate) e não do javax.

Nos próximos post's mudaremos essa classe da dao para implementar as demais operaçãos.



Implementando a Action (controller)
A action não é bem um controller, mas ela tem ligação direta (da a resposta) para uma ação do usuário (que mais tarde será mapeada no struts.xml), então dava para dizer que o struts.xml + a action é o que a gente normalmente implementa em um controller.

Crie um pacote chamado action. E dentro dele a classe seguinte:


Aqui da mesma forma, criei o atributo na linha 17, depois deu refactor > encapsulate fields, e então implementei o código das linhas 27-30.

Explicando, essa propriedade é o valor que vai ser passado para view depois, portanto lá (na view) haverá um objeto chamado "todolist", porque assim o fizemos na linha 17 deste arquivo.

Aqui precisamos dar import na classe correspondente da dao e do model.

Perceba que o que você vai pagar na view é o que é setado (assessor set), no caso na minha linha 28, onde ele recebe a execução do método que implementamos na dao antes.

Mas e o get (assessor get)? Faça-o! O struts precisa disso.

O return de "SUCESSO" será usado depois no mapeamento, quando esse método retornar "SUCESSO" deve fazer o que... mais adiante. Calma aí.

Criando o JSP (view)

O JSP é a nossa view, quanto menos processamento, código, regra de negócio rodar aqui melhor!

Lembra que antes no web.xml estava definido que o index.jsp era a página padrão da nossa aplicação. Vamos modificá-lo, fazer um link de acesso a tela/ação que traz a listagem. Segue (mudanças destacadas)


Crie uma nova página jsp, essa será usada para printar as dados retornados pelo método da action. Chamei de todolist-list. O final (-list) é porque depois vai haver um -ins, -edit ...


Logo no início, adicione o que eu tenho na linha 6.
Depois, na 18 a 33, temos uma tabela para listar os dados, as primeiras linhas são o cabeçalho, depois iteramos o objeto todolist (linha 25) e mostramos os campos (assim como está definido no model). E é isso.



Ajustando os mapeamentos

Bom, vamos ajustar algumas coisas no hibernate.xml para ajudarmos a debugar se for preciso, e temos que mapear aqui a model.

Adicione os itens indicados.


 Clique em xml (antes estava em design) e adicione o mapeamento da classe onde está a definição da tabela.


No struts.xml, temos dizer quem responde pela aquela ação que colocamos lá no href do link no index.jsp. Assim definimos que tal ação, quando invocada chama tal classe, em tal método.

Bem no fim, adicione o que eu tenho na linha 14, isso faz as mensagens de erro do java serem mais amigáveis. Coloque para false antes de publicar a aplicação.

Em cima do projeto (botão auxliliar) clique em "clean and build" e depois em "run".


Rodando a aplicação

Quando você da "run" no projeto, o NetBeans da deploy automático, exceto das coisas da camada de persistência, portanto sempre que mexer em alguma coisa do hibernate, de "clean and build" antes do "run"

Executando, teremos algo parecido com isso:

 Clicando no link, que chama a ação, a action processa, devolve os dados e passa para view. E está aí!
Achou muita tralha para pouca coisa? Eu também. Mas pior sem frameworks. Deve ser por isso que a lenda diz que pagam bem para programador java.

Nos próximos, exclusão, cadastro, e edição.

Com chave estrangeira? Com chave estrangeira? Acompanhe o blog... quem sabe sai alguma coisa.

* Daqui um tempo (um mês por aí) vai começar uma série de posts de programação para Android, usando a SDK deles, com Java!

Foo!

3 comentários:

  1. Código fonte aqui: http://www.sourcedreams.com.br/diversos/java-web-samples/todolist-source.zip

    ResponderExcluir
  2. Parabéns Helton!

    Muito bom, os que vierem depois de nós terão melhor material pra aprender!

    Minha todolist ta igual a sua hehe, pode add tbm trabalho sobre ginga tv digital/LUA rsrsrs

    Tamo FOO!

    ResponderExcluir
  3. Amigo estou tentando fazer funcionar esses plugin do netbeans e estou encontrado uma grande dificuldade em integrar o struts 2 com hibernate por causa do jar asm-3.3.
    Quando deixo esse jar ele dá conflito com o hibernate e quando eu retiro ele funciona o hibernate e para o struts.
    Será que vc poderia corrigir o link que contém o projeto com o codigo fonte ou me enviar por e-mail?
    Assim posso ver o que está errado na minha configuração dos jar´s!
    Obrigado

    ResponderExcluir