Mostrando postagens com marcador Struts. Mostrar todas as postagens
Mostrando postagens com marcador Struts. Mostrar todas as postagens

terça-feira, 3 de maio de 2011

Deleção/Delete/Exclusão de dados com Struts2 e Hibernate em Netbeans

Continuando o projeto, agora vamos implementar o delete. Basicamente vamos colocar um link de delete na view da listagem, quando clicar, chama uma action que apaga e volta para a lista.


Modificando a view
Na view (arquivo jsp), vamos adicionar um link, chamando a action, com um parâmetro. Adicionamos mais uma coluna na tabela. (clique na figura para ampliar)

Estamos passando o parâmetro id, por isso, depois lá na action teremos que criar um atributo id e implementar os getters e os setters.


Modificando a DAO
Na DAO, temos que implementar o método delete. Para isso precisamos importar a org.hibernate.Transaction, já que o hibernate por baixo vai rodar um delete from ...



Modificando a action
Preste atenção na linha 8, declaramos o atributo id, igual passamos no parâmetro lá na view. Implementamos os getters e os setters para o id e também o método que efetivamente responde a ação do usuário e chama a DAO no método de exclusão.

 

Ajustando os mapeamentos
No arquivo struts.xml temos que mapear que quando chamarmos na URL "ListTodolistDelete" deve chamar o método apropriado na action. Quando isso for processado deve redirecionar para "ListTodolist", é isso que faz o type="redirect" na linha 14. (clique na figura para ampliar)




Rodando a aplicação
Salve tudo, "clean and build" e depois "run". Delete funcionando.




No próximo faremos o cadastro.
Saudações!

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!

sexta-feira, 29 de abril de 2011

Olá Mundo com Struts2 e NetBeans

Olá galerinha!!

Vamos pra mais um Hello World, agora com o Struts2. Pra comecar crie um novo projeto no NetBeans (estou usando no Linux, aqui no Foojava tem um post que ensina instalar tudo certinho), segue -> JavaWeb -> Aplicacao Web, de o nome de HelloStruts, estou a utilizar servidor Tomcat 6.0.26 e Java EE 5, no passo 4 selecione o framework Struts2 e desmarque a opcao de Criar pagina de exemplo, caso contrário o hello world já vem pronto de exemplo, sacanagem!

Segue imagens dessa primeira parte pra ajudar vocês que ficaram com alguma dúvida nessa primeira parte.




Bom, projeto criado, vamos editar o arquivo index.jsp que foi criado junto com o projeto, este arquivo está marcado para ser sua página inicial no arquivo web.xml. Dentro do index coloque o seguinte código:

<%-- 
    Document   : index
    Created on : 28/04/2011, 20:55:03
    Author     : bolivar
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<%-- Adicione essa taglib para usar as tags do Struts --%>
<%@taglib uri="/struts-tags" prefix="s" %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <s:form action="Hello">
            <s:textfield name="nomeUsuario" label="Seu nome" />
            <s:submit />
        </s:form>
    </body>
</html>

Perceba que no início da página foi adicionado uma linha de código que inclui as tags especiais do Struts, para usar essas tags devemos adicionar o prefixo s: nas tags, é interessante dar uma olhada nessas tags, o NetBeans tem um autoComplete que msotra todas as tags possíveis de serem utilizadas. Essas tags serão substituidas por tags HTML normais quando o projeto for executado, em tempo de execução/compilaçao, não tenho bem certeza.

Crie agora mais duas páginas JSP, chame uma de sucesso.jsp e outra de erro.jsp.


 Na página de erro coloque apenas HTML normal com uma mesangem de erro e link para volar ao início.
<%-- 
    Document   : erro
    Created on : 28/04/2011, 21:08:18
    Author     : bolivar
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Primeiro Hello Struts</title>
    </head>
    <body>
        <p>
            Erro: Campo nome nao pode ser vazio, informe seu nome!<br><br>
            <a href="index.jsp">clique aqui pra voltar</a>
        </p>
    </body>
</html>

Na página de sucesso vamos utilizar novamente a taglib do Struts2, para exibir uma mensagem de Ola.
<%-- 
    Document   : sucesso
    Created on : 28/04/2011, 21:06:57
    Author     : bolivar
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="/struts-tags" prefix="s" %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Primeiro Hello Struts</title>
    </head>
    <body>
        <h1><s:property value="mensagem" /></h1>
    </body>
</html>

Bom, até agora temos duas variáveis/propriedades para trabalhar, uma está na index.jsp que é o nomeUsuario e outra na página de sucesso que é a mensagem. Para manipularmos estes campos vamos criar uma classe Java que será a nossa Action, crie uma classe java dentro de um novo pacote chamado acoes. De o nome para a nova classe de HelloAction.



Criado a classe HelloAction, dentro de um pacote acoes, coloque o seguinte código.

package acoes;

/**
 * @author bolivar
 */
public class HelloAction {

    private String Mensagem;
    private String nomeUsuario;

    public String execute() {
        if (getNomeUsuario().length() > 0)
        {
            setMensagem("Ola " + getNomeUsuario());
            return "SUCESSO";
        } else
        {
            return "ERRO";
        }
    }

    /**
     * @return the Mensagem
     */
    public String getMensagem() {
        return Mensagem;
    }

    /**
     * @param Mensagem the Mensagem to set
     */
    public void setMensagem(String Mensagem) {
        this.Mensagem = Mensagem;
    }

    /**
     * @return the nomeUsuario
     */
    public String getNomeUsuario() {
        return nomeUsuario;
    }

    /**
     * @param nomeUsuario the nomeUsuario to set
     */
    public void setNomeUsuario(String nomeUsuario) {
        this.nomeUsuario = nomeUsuario;
    }
    
}

Esta classe estamos criando duas variáveis String que correspondem aos nossos elementos nas JSP, nomeUsuario e mensagem, implementamos os métodos GET e SET para definir valores e recuperar os valores dessas propriedades e criamos uma função chamada execute(), que é o método padrão das actions dentro do Struts.

Dentro desse método execute() nós verificamos se foi preenchido o campo nomeUsuario, em caso TRUE nós setamos a propriedade mensagem com o valor 'Olá ' e concatenamos com nome informado pelo usuário que está na propriedade nomeUsuario, tudo certo, retorna 'SUCESSO', este retorno é muito importante, não é necessário ter o nome 'sucesso', mas precisa existir para mapearmos dentro do struts depois.

No caso do usuário não ter digitado o seu nome, o método vai retornar 'ERRO'.

Muito bem, vamos para nossa parte final do Hello World, é impressão minha ou fazer um hello em Struts é super complicado? hehe Seguindo, agora só nos falta relacionar tudo isso dentro do arquivo de configuração struts.xml, o código abaixo simples e comentadinho.

<struts>
    <!-- Configuration for the default package. -->
    <package name="default" extends="struts-default">
        <!-- Configura as actions, o name é o que esta sendo chamada no form da index.jsp,
 class é local da action a ser executada e adicionei também o method execute, 
isso não é necessário quando o método tem este nome, mas se tivesse outro nome como remover, listar... ai seria necessário -->
        <action name="Hello" class="acoes.HelloAction" method="execute">
            <!-- Configura os resultados da action, em caso da funçao retornar SUCESSO 
vai ir para pagina JSP sucesso, caso de ERRO vai para erro.jsp -->
            <result name="SUCESSO">/sucesso.jsp</result>
            <result name="ERRO">/erro.jsp</result>
        </action>

    </package>
</struts>

Bom pessoal, basicamente é isso ai, para ver o Hello com Struts funcionando basta executar o projeto agora e correr pro abraço. A estrutura do projeto ficou igual a imagem abaixo.


Até mais!