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

sábado, 5 de julho de 2008

Tagged under: , , ,

ZK: Ajax sem JavaScript no NetBeans - Parte 3

Estamos chegando à terceira e última parte do nosso tutorial sobre o uso do ZK no NetBeans. Vamos continuar alterando o projeto criado na parte 1 e evoluído na parte 2, finalizando uma Lista de Tarefas 100% funcional.

Vamos começar alterando o arquivo index.zul, para permitir inclusão, exclusão e alteração de tarefas. A versão final está listada a seguir, com negrito destacando as modificações relativas ao apresentado na parte 2. Adicionamos um groupbox contendo textbox, intbox e datebox, para permitir atribuir valores ao Nome da Tarefa, Prioridade e Data, respectivamente. Aos botões Incluir, Excluir e Salvar estão associados os respectivos métodos que serão acionados no evento onClick. Além disso, ao selecionar uma linha do listbox, o evento onSelect irá disparar o método selecionar().
<?xml version="1.0" encoding="UTF-8"?>
<window title="Lista de Tarefas" width="800px" border="normal">
<zscript src="ListaTarefas.zs"/>
<listbox id="box" multiple="true" rows="4" onSelect="selecionar()">
<listhead>
<listheader label="Tarefa"/>
<listheader label="Prioridade" width="90px"/>
<listheader label="Data" width="90px"/>
</listhead>
<listitem forEach="${listaTarefas}" value="${each}">
<listcell label="${each.nome}"/>
<listcell label="${each.prioridade}"/>
<listcell label="${each.dataTarefaAsString}"/>
</listitem>
</listbox>
<groupbox>
Tarefa:
<textbox id="nome" cols="30" />
Prioridade:
<intbox id="prioridade" cols="1" />
Data:
<datebox id="dataT" cols="8"/>
<button label="Incluir" width="60px" height="24px" onClick="incluir()" />
<button label="Salvar" width="60px" height="24px" onClick="salvar()" />
<buTton label="Excluir" width="60px" height="24px" onClick="excluir()" />
</groupbox>
</window>
Você deve ter observado que o código Java do zcript está agora em um arquivo separado. Para criá-lo no NetBeans, clique no nome do projeto com o botão direito e escolha New -> Other -> Web -> ZS File e clique em Next. Nomeie o arquivo como ListaTarefas.zs e clique em Finish.

Criando um arquivo ZS no NetBeans

O novo arquivo será criado na pasta Web Pages e deve ter o conteúdo abaixo. Infelizmente a versão atual REM, o plugin ZK para o NetBeans que estamos utilizando, ainda não provê code completion para arquivos ZS, portanto o editor mostrará o código Java como num arquivo texto comum (no Ubuntu, a tecla ENTER não funcionou, então tive que usar o Ctrl+Enter para inserir novas linhas).
import javabahia.beans.Tarefa;
import javabahia.dao.TarefaDAO;
import java.text.SimpleDateFormat;

TarefaDAO tarefaDAO = new TarefaDAO();
List listaTarefas = tarefaDAO.listar();

void incluir(){
//insere no banco de dados
Tarefa novaTarefa = new Tarefa(nome.value, prioridade.value.intValue(), dataT.value);
tarefaDAO.incluir(novaTarefa);

//sincroniza a variável listaTarefas com os dados do banco
listaTarefas = tarefaDAO.listar();

//insere um novo Tarefa na listbox
Listitem li = new Listitem();
li.setValue(novaTarefa);
li.appendChild(new Listcell(nome.value));
li.appendChild(new Listcell(prioridade.value.toString()));
li.appendChild(new Listcell(new SimpleDateFormat("dd/MM/yyyy").format(dataT.value)));
box.appendChild(li);
}

void salvar(){
//atualiza o banco de dados
Tarefa editTarefa = (Tarefa)box.selectedItem.value;
editTarefa.setNome(nome.value);
editTarefa.setPrioridade(prioridade.value);
editTarefa.setDataTarefa(dataT.value);
tarefaDAO.salvar(editTarefa);

//atualiza a listbox
List children = box.selectedItem.children;
((Listcell)children.get(0)).label = nome.value;
((Listcell)children.get(1)).label = prioridade.value.toString();
((Listcell)children.get(2)).label = new SimpleDateFormat("dd/MM/yyyy").format(dataT.value);
}

void excluir(){
tarefaDAO.excluir((Tarefa)box.selectedItem.value);
box.removeItemAt(box.getSelectedIndex());
limpar();
}

void selecionar(){
nome.value = ((Tarefa)box.selectedItem.value).getNome();
prioridade.value = ((Tarefa)box.selectedItem.value).getPrioridade();
dataT.value = ((Tarefa)box.selectedItem.value).getDataTarefa();
}

void limpar(){
nome.value = null;
prioridade.value = null;
dataT.value = null;
}
Os métodos incluir(), salvar(), excluir() e selecionar() são acionados pelos código já mostrado em index.zul e são bem auto-explicativos, portanto me reservarei ao direito de não entrar em detalhes (Você poderá encontrar maiores explicações no tutorial original, que utilizamos como base). Logo no início é instanciado o novo TarefaDAO, que ainda não havíamos criado, necessários para fazer "a ponte" entre as camadas de interface e persistência. Eis o seu código, que deve estar localizado no package javabahia.dao.
package javabahia.dao;

import java.util.List;
import javabahia.beans.Tarefa;
import javax.persistence.EntityManager;
import org.zkoss.zkplus.jpa.JpaUtil;

public class TarefaDAO {
private static EntityManager em = JpaUtil.getEntityManager("ListaTarefasPU");

public List listar() {
return em.createQuery("SELECT t FROM Tarefa t").getResultList();
}
public void excluir(Tarefa t) { em.remove(t); }
public void incluir(Tarefa t) { salvar(t); }
public void salvar(Tarefa t) {
em.getTransaction().begin();
em.persist(t);
em.getTransaction().commit();
}
}
Estamos quase prontos. pois ainda falta criar um construtor adicional para a classe Tarefa, necessário para adicionar novas tarefas. Ao invés de digitar da maneira tradicional, vamos usar um recurso do NetBeans. Estando com o código aberto, escolha o menu Source -> Insert Code, selecione Generate / Constructor. Marque Nome, Prioridade e Tarefa e clique em Generate.

Gerando um construtor adicional para a classe Tarefa

Agora sim, não falta mais nada. Execute sua aplicação e você verá a tela a seguir, com funcionamento semelhante a este demo ao vivo. O código-fonte deste tutorial está disponível para download neste link do javabahia.dev.java.net.

Uma aplicação completa feita no NetBeans usando o ZK

Se o ZK despertou seu interesse, sugiro dar uma olhada no Developers Guide, que possui uma documentação fundamentada e abrangente. Consulte também site do ZK e, é claro, nosso inseparável Google. Espero que lhe tenha sido útil e até o próximo tutorial!

sábado, 28 de junho de 2008

Tagged under: , , , , ,

ZK: Ajax sem JavaScript no NetBeans - Parte 2

Na 2a parte do nosso tutorial vamos usar o NetBeans 6.1 para criar uma tabela no JavaDB e automaticamente gerar uma classe de entidade correspondente no padrão JPA. Ao final, exibiremos as informações em uma página index.zul.

Comece abrindo o projeto ListaTafefas que criamos na parte 1. Na aba Services, do lado esquerdo, clique com o botão direito em JavaDB e escolha CreateDatabase. Chame o banco de dados de Tafefas, usuário e senha javabahia e escolha a localização do BD no seu computador. Logo abaixo, aparecerá uma linha jdbc:derby://localhost:1527/Tarefas. Clique com o botão direito e escolha Connect. Pronto! O banco está criado, porém ainda não temos nenhuma tabela.

Criando o banco de dados Tarefas no JavaDB

Clique com o botão direito no folder Tables e escolha Execute Command. Na área de edição, será aberta uma aba que permite a execução de comandos SQL. Copie e cole o comando a seguir e mande executar (Ctrl+Shift+E):
create table TAREFA(
ID INTEGER GENERATED ALWAYS AS IDENTITY not null primary key,
NOME VARCHAR(50),
PRIORIDADE INTEGER,
DATA_TAREFA DATE);
INSERT INTO Tarefa(NOME,PRIORIDADE,DATA_TAREFA) VALUES ('Comprar passagens', 1, '07/10/2008');
INSERT INTO Tarefa(NOME,PRIORIDADE,DATA_TAREFA) VALUES ('Reservar hotel', 2, '07/15/2008');
INSERT INTO Tarefa(NOME,PRIORIDADE,DATA_TAREFA) VALUES ('Alugar carro', 3, '07/25/2008');
INSERT INTO Tarefa(NOME,PRIORIDADE,DATA_TAREFA) VALUES ('Arrumar bagagens', 3, '07/30/2008');
INSERT INTO Tarefa(NOME,PRIORIDADE,DATA_TAREFA) VALUES ('Tirar férias', 1, '09/01/2008')
Será criada uma tabela com 4 campos, tendo o ID como chave primária, gerada automaticamente. Também serão adicionados 4 registros, para utilizarmos na hora de listá-los (observe que as datas estão no formato MM/DD/AAAA). Agora vamos aprender a usar o Java Persistence API, que provê um padrão para mapeamento objeto relacional. Na árvore do projeto, clique com o botão direito em Source Packages e escolha New -> Entity Classes from Database. Abra a combo em Data Source e escolha New. Informe jdbc/tarefas no campo JDNI Name e jdbc:derby://localhost:1527/Tarefas em Data Base Connection. Após clicar em OK a tabela TAREFA aparecerá disponível na lista. Selecione-a e clique em Add e em seguida Next.

Criando Entity Classes a partir de um banco de dados

Na tela seguinte, informe javabahia.beans no campo Package e clique no botão Create Persistente Unit. Aceite os valores default (será usado o TopLink como provider, mas você poderia escolher outro de sua preferência, como Hibernate ou OpenJPA) e clique em Create para gerar a ListaTarefasPU. De volta a tela anterior, clique em Finish e será criada a classe Tarefa, já com todas as anotações no padrão JPA, e o arquivo persistence.xml com as definições da Persistence Unit. Abra Tarefa.java e adicione @GeneratedValue(strategy=GenerationType.IDENTITY) logo abaixo de @Id, o que provocará a geração automática da chave primária da tabela. Adicione também o método public String getDataTarefaAsString() { return new SimpleDateFormat("dd/MM/yyyy").format(dataTarefa); }, que será utilizado mais à frente para obter a data da tarefa no formato dia/mês/ano. Execute um Fix Imports (Ctrl+Shift+I) para não dar erro de compilação. Na pasta Configuration Files, dê um duplo clique em persistence.xml e desmarque a opção Include All Entity Classes in "ListaTarefas" Module. Clique no botão Add Class e inclua javabahia.beans.Tarefa.

Editando a classe Tarefa.java, criada automaticamente pelo NetBeans

Agora já podemos editar o arquivo index.zul para acessar as informações no nosso banco de dados. Altere-o para o conteúdo listado a seguir. Observe que dentro da tag zscript escrevemos puramente código Java. Usamos a classe JpaUtil para obter um EntityManager referenciando pelo nome a Persistence Unit criada anteriormente. Com a tag listitem o atributo forEach realiza as iterações na lista de tarefas já obtida. Em listcell usamos Expression Language (EL) para obter o conteúdo de cada campo. Viu como é fácil?
<?xml version="1.0" encoding="UTF-8"?>
<window title="Lista de Tarefas" width="800px" border="normal">
<zscript>
import javabahia.beans.Tarefa;
import java.util.ArrayList;
import javax.persistence.EntityManager;
import org.zkoss.zkplus.jpa.JpaUtil;

private static EntityManager em = JpaUtil.getEntityManager(
"ListaTarefasPU");
List listaTarefas = em.createQuery(
"SELECT t FROM Tarefa t").getResultList();
</zscript>
<listbox id="box" multiple="true" rows="4">
<listhead>
<listheader label="Tarefa" />
<listheader label="Prioridade" width="90px" />
<listheader label="Data" width="90px" />
</listhead>
<listitem forEach="${listaTarefas}" value="${each}">
<listcell label="${each.nome}"/>
<listcell label="${each.prioridade}"/>
<listcell label="${each.dataTarefaAsString}"/>
</listitem>
</listbox>
</window>
Execute a aplicação o NetBeans se encarregará de compilar tudo, efetivar o deploy no Glassfish e abrir o navegador padrão na página da aplicação. Você verá tabela listando todos os itens previamente cadastrados no banco de dados. No próximo post iremos melhorar este exemplo, criando uma aplicação totalmente funcional. Novamente lembramos que esse é um exemplo adaptado de um tutorial da página oficial do ZK, então você já tem uma boa referência para incrementar já sua Lista de Tarefas.

Usando ZK com JPA para listar as Tarefas armazenadas no JavaDB

domingo, 15 de junho de 2008

Tagged under: , , , , , ,

ZK: Ajax sem JavaScript no NetBeans - Parte 1

Em um dos posts sobre o JavaOne comentei ter visto um framework impressionante chamado ZK. Conversei alguns minutos com Henri Chen, autor de um livro sobre o assunto, e prometi a mim mesmo que arranjaria um tempo para conhecer melhor a solução, pois fiquei bastante curioso.


Henri Chen e seu livro sobre ZK

O principal objetivo do ZK é permitir que aplicações web tenham a mesma interatividade e riqueza encontradas desktop, só que isso deve ser o mais fácil possível para o desenvolvedor. Ele inclui um Ajax-based event-driven engine, um conjunto rico de componentes XUL e XHTML e uma linguagem de marcação (markup language). Para ter uma noção do que é possível sugiro dar uma olhada no live demo e uma navegada na página do projeto em zkoss.org.

Para experimentar o ZK eu precisava de uma aplicação exemplo. Resolvi me basear num Lista de Tarefas (Todo list) criada em um Tutorial Passo a Passo para iniciantes do ZK, em português (Veja ao vivo). Como não tenho colocado a mão na massa com desenvolvimento Web ultimamente, procurei facilitar minha vida e encontrei no SourceForge o REM - A NetBeans Module for ZK, ou seja, um plugin ZK para o NetBeans.

Nessa 1a parte, vamos aprender a instalar o plugin e criar um projeto usando o ZK. Na 2a criaremos uma tabela no JavaDB, a classe de entidade correspondente usando JPA e exibiremos as informações em uma página. Na 3a parte vamos implementar a inclusão, exclusão e alteração de informações, chegando a uma aplicação 100% funcional.

Primeiro baixe a versão 1.5.0 (um arquivo ZIP), e adicione o plugin ao NetBeans 6.1 (Para isso, vá no menu Tools -> Plugins, aba Downloaded, clique em Add Plugins e selecione o arquivo net-sf-rem.nbm na pasta onde você descompactou o arquivo baixado. Clique em Install e siga confirmando até concluir).

Instalando o REM NetBeans Module for ZK

Agora crie um projeto para ver como usar o ZK no NetBeans. Escolha File -> New Project -> Web / Web Application e clique em Next. Chame o projeto de ListaTarefas e escolha Next. Escolha o Server de sua preferência (estou usando o Glassfish V2) e siga em frente. A última tela pedirá para escolher os frameworks que você deseja usar na aplicação. Selecione ZK 3.0.1 e clique em Finish.

Criando um projeto Web no NetBeans usando o ZK

Será criado um projeto Java/Web com toda a estrutura de pastas e prontas para deploy. Em Web Pages, Observe o arquivo principal index.zul, contendo apenas o trecho código:
<?xml version="1.0" encoding="UTF-8"?>
<window>
My ZK application
</window>
Se você clicar em Run terá uma aplicação funcional, mostrando uma página com o texto My ZK application.

Aplicação ZK básica feita no NetBeans

Temos nosso ponto de partida, então você já pode começar a desenvolver para Web usando o ZK. Se não quiser aguardar o próximo post, sugiro fazer umas experiências alterando o código da index.zul com base em demos ou tutoriais da página do ZK. Até breve!

sexta-feira, 9 de maio de 2008

Tagged under: , ,

JavaOne 2008 - 3o Dia

O terceiro dia foi iniciado por uma General Session da Intel, que não tive condições de assitir. Ainda bem que fica tudo gravado e disponível, então os interessados podem conferir o que rolou em http://java.sun.com/javaone/sf/sessions/general.


Rogério Santana e Bruno Souza

Para mim o evento começou mesmo na sessão Free and Open-Source Software (FOSS): Use and Production by the Brazilian Government. Rogério Santana, do Ministério do Planejamento, Rogério Santana, dividiu com Bruno Souza uma apresentação sobre produção e uso do software livre no governo brasileiro, citando o portal do Software Público, o sistema de votação eletrônico, experiências de tele-centros, uso de SL na educação, enfim, um grande overview do panorama brasileiro, considerado referência mundial na questão do uso de SL. O IRPF Java, mais uma vez foi citado. Algumas perguntas interessantes. Após a palestra, conversei com o Spencer Gib, um desenvolvedor Java norte-americado muito simpático, da Igreja de Jesus Cristo dos Santos dos Últimos Dias. Há 12 anos ele morou no Brasil e estava aproveitando para desenferrujar o português. Coisas do JavaOne!


Eu e Spencer Gib

Bom, o pavilhão só fica aberto até a 5a-feira, por isso reservei a minha tarde para circular bastante, ver melhor as novidades, conhecer mais pessoas e, não posso negar, pegar uns brindes para levar para o Brasil e sortear/distribuir nos eventos do Java Bahia. Dois destaques:
- ZK - Ajax without JavaScript Framework, que permite criar aplicações RIA com muito pouca codificação e alta produtividade. Estive com autor do livro de mesmo título, Henri Chen, que fez uma breve apresentação da farramenta, que inclusive foi finalista de prêmios no Source Forge, sendo bem votada pela comunidade. Fiquei bastante curioso em saber mais. Se você já conhece, ou resolver estudar um pouco mais, gostaria muito de ver comentários aqui no blog. Web site www.zkoss.org. Experimente o Live Demo e veja que tem até um tutorial em português.
- O stand da AMD, que oferecia oxigêncio puro com vários aromas. Fiz uma montagem abaixo, para dar uma idéia da coisa. Que viagem...


Oxigênio aromatizado

Pra finalizar o dia, show do Smash Mouth no Yerba Buena Garden, depois fomos a mais duas festas "0800" (brasileiro tem um faro pra essas coisas...). Teve gente cantando, tocando violão, piano. Muita diversão!


Queria ver se no Brasil eu ia conseguir ficar tão perto.

No JavaOne, a visão e as experiências de cada um são muito particulares. Na página principal do evento tem diversas informações e links para fotos, vídeos e a central de blogs. Se você desejar ver outras perspectivas vou deixar aqui algumas sugestões de blog:
- Blog de Givanildo Nascimento, líder do SEJug e grande parceiro de viagem.
- Boletins do DFJUG, por Daniel deOliveira, a quem sou muito grato pela força que tem me dado, pois tenho aprendido muito. Em seu primeiro boletim do JavaOne foi muito gentil em citar meu blog e o de Givanildo.
- Blog de Rubem Badaró, lider do PT.JUG, o Grupo Português de Utilizadores de Java, com quem tive o prazer de conversar e dar boas rizadas.
- Blog de Antonio Gonçalves, que fala um português excelente (também, com esse nome!) e lidera o Paris JUG.


PT.JUG, ParisJUG, JavaBahia e SouJava representados. Que intercâmbio, não!?