-
Notifications
You must be signed in to change notification settings - Fork 0
Primeira Aplicação com Prodígio
Este tutorial tem como objetivo introduzir os conceitos iniciais e essenciais para o desenvolvimento de uma aplicação utilizando o Metaframework Prodigio.
Abordaremos como criar Entidades, Controllers, Interfaces e Regras de Negócio.
Utilizaremos um caso de uso simples, que consiste apenas em uma entidade que registra tarefas, com descrição e datas.
Para iniciar com o desenvolvimento deste tutorial configure o ambiente de desenvolvimento e crie um novo projeto Prodigio.
Neste artigo nomearemos o projeto como tutorial
.
Uma Entidade é a representação de uma classe do domínio. Normalmente é a classe que representa um objeto que sera persistido.
Nesta etapa iremos criar uma Entidade para "Tarefas".
Regras de Nomenclatura
As entidades devem iniciar com letra maiúscula e ter o sufixo VO.
Importante
As entidades devem ser obrigatoriamente criadas no domínio da aplicação, sendo assim, no diretório
tutorial-domain
.
Para criar uma entidade, clique com o botão direito sobre o diretório tutorial-domain
, selecione New > Class
e pressione Finish
.
Certifique-se de que os campos estão preenchidos conforme ilustrado abaixo. Vale lembrar que a classe esta sendo criada dentro de um pacote que estamos nomeando como tarefa
. Este pacote é um módulo do nosso projeto, o qual representa um subgrupo do modelo de domínio.
Entidade Tarefa
NOTA O campo package deve ser preenchido como br.gov.prodemge.prodigio.tutorial.entidades.tarefa
onde o próprio Eclipse irá criar um package com o sufixo tarefa
, caso não exista.
Uma vez com a classe gerada, herde de ProVO
e crie os atributos conforme o código abaixo.
package br.gov.prodemge.prodigio.tutorial.entidades.tarefa;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import br.gov.prodigio.entidades.ProVO;
@Entity
@Table(name="tarefa")
public class TarefaVO extends ProVO {
private static final long serialVersionUID = -4314992947793025006L;
private String descricao;
private Date dataInicial;
private Date dataFinal;
@Override
@Id
@SequenceGenerator(name = "sq_tarefa", sequenceName = "sq_tarefa", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_tarefa")
public Long getId() {
return super.getId();
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Date getDataInicial() {
return dataInicial;
}
public void setDataInicial(Date dataInicial) {
this.dataInicial = dataInicial;
}
public Date getDataFinal() {
return dataFinal;
}
public void setDataFinal(Date dataFinal) {
this.dataFinal = dataFinal;
}
}
Ceritifique-se de que as classes estão sendo apropriadamente especificadas no arquivo de configuração do Hibernate para que o mesmo faça o mapeamento das entidades no banco de dados.
Para isso, pressione Ctrl + Shift + R
, abra o arquivo persistence.xml
e adicione entradas para a entidade TarefaVO
, conforme o código abaixo.
...
<persistence-unit name="tutorial-ds" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>java:/tarefas-ds</non-jta-data-source>
<!--ENTIDADES PRODIGIO-->
<class>br.gov.prodemge.prodigio.tutorial.entidades.tarefa.TarefaVO</class>
<!-- Demais tags ocultadas para brevidade do exemplo -->
...
Um Controller é uma classe de controle do padrão MVC relativo a um processo elementar (caso de uso ou conceito de domínio).
Tem a função de atualizar a interface gráfica e lidar com dados dos modelos.
Regras de Nomenclatura
Os controllers devem iniciar com letra maiúscula e ter o sufixo Ctr.
Importante
Os controllers devem ser obrigatoriamente criados no frontend da aplicação, sendo assim, no diretório
tutorial-frontend
.
Para criar um controller, clique com o botão direito sobre o diretório tutorial-frontend
e pressione New > Class
.
Em seguida preencha os campos conforme imagem abaixo.
NOTA O campo package deve ser preenchido como br.gov.prodemge.prodigio.tutorial.controle.tarefa
onde o próprio Eclipse irá criar um package com o sufixo tarefa
, caso não exista.
Uma vez com a classe gerada, herde de ProCtr<TarefaVO>
e sobrescreva o método doAfterCompose()
conforme o código abaixo.
package br.gov.prodemge.prodigio.tutorial.controle.tarefa;
import org.zkoss.zk.ui.Component;
import br.gov.prodemge.prodigio.tutorial.entidades.tarefa.TarefaVO;
import br.gov.prodigio.controle.ProCtr;
public class TarefaCtr extends ProCtr<TarefaVO> {
@Override
public void doAfterCompose(Component componente) throws Exception {
super.doAfterCompose(componente);
pesquisar();
}
}
NOTA O método sobrescrito doAfterCompose()
é invocado após renderizar os componentes na página.
Os arquivos com extensão .zul
são as telas da aplicação, que utilizam as tecnologias do ZK, que é um framework para criação de interfaces gráficas baseadas em componentes.
Regras de Nomenclatura
As interfaces devem iniciar com letra maiúscula.
Importante
As zuls devem ser criadas no frontend da aplicação, sendo assim, no diretório
tutorial-frontend
. Os arquivos são criados em pastas específicas com nomenclatura respectivas às entidade ao qual a interface faz referencia, no diretóriovisao
.
Para criar uma zul, clique com o botão direito sobre o diretório /tutorial-frontend/src/main/webapp/br/gov/prodemge/prodigio/tutorial/visao
e selecione New > Folder
e então crie uma subpasta com o nome da nossa entidade tarefa
.
Uma vez com o diretório criado, clique com o botão direito sobre o mesmo, selecione New > File
, nomeie o novo arquivo como Tarefa.zul
e clique em Finish
.
Um arquivo .zul
em branco será gerado, nele insira o código a seguir.
<window id="tarefa_window"
apply="br.gov.prodemge.prodigio.tutorial.controle.tarefa.TarefaCtr"
sizable="true" title="Tarefa">
<div id="barradebotoes" align="right" />
<selecaobox>
<sylistbox id="listaSelecao">
<auxhead class="cabecalhoPesquisa">
<auxheader>
<label value="ID:" />
<intboxarg id="idArg"></intboxarg>
</auxheader>
</auxhead>
<listhead id="cabecalho">
<listheadersort label="ID" value="id" />
<listheadersort label="Descricao" value="descricao" />
<listheadersort label="Data Inicial" value="dataInicial" />
<listheadersort label="Data Final" value="dataFinal" />
</listhead>
<listitem height="25px">
<listcellbind label="id"></listcellbind>
<listcellbind label="descricao"></listcellbind>
<listcellbind label="dataInicial"></listcellbind>
<listcellbind label="dataFinal"></listcellbind>
</listitem>
</sylistbox>
</selecaobox>
<manutencaobox>
<tablelayout>
<tablechildren>
<vbox>
<label value="Id" />
<label value="@{classecontrole.objetoAtual.id}" />
<label value="Descrição " />
<textboxbind
nomeDoObjeto="classecontrole.objetoAtual.descricao">
</textboxbind>
<label value="Data Inicial " />
<dateboxbind
nomeDoObjeto="classecontrole.objetoAtual.dataInicial">
</dateboxbind>
<label value="Data Final " />
<dateboxbind
nomeDoObjeto="classecontrole.objetoAtual.dataFinal">
</dateboxbind>
</vbox>
</tablechildren>
</tablelayout>
</manutencaobox>
</window>
Neste artigo não entraremos em detalhes sobre a criação de interfaces. Acesse a documentação dos componentes para aprofundar no assunto.
As Regras de Negócio...
Regras de Nomenclatura
As regras de negócio devem iniciar com letra maiúscula e ter o sufixo RN. Por exemplo, uma classe com regras de negócio para uma entidade que representa um "funcionáio" deve ser ser nomeada
FuncionarioRN
.
Importante
As regras de negócio devem ser obrigatoriamente criadas no backend da aplicação, sendo assim, no diretório
nomeaplicacao-backend
.
Para criar uma classe para regras de negócio, clique com o botão direito sobre o diretório /tutorial-backend
, selecione New > Class
e preecha os campos conforme imagem abaixo.
No exemplo a seguir definimos duas regras de negócio para o domínio "Tarefas".
No primeiro método regraDescricao
definimos que o campo descrição não pode ser nulo e nem ter menos de 3 caracteres.
No segundo método regraDatas
definimos que a Data Inicial
não pode ser posterior a Data Final
.
public class TarefaRN extends TutorialBaseRN {
@RegraDeNegocio(autor = "Autor", codigo = "SEUCODIGO01", ordem = 1, fluxo = Constantes.FLUXO.GRAVAR, momentoDeExecucao = MomentoDeExecucao.ANTES)
public void regraDescricao(TarefaVO tarefa) {
Map<String, String> erros = new LinkedHashMap<String, String>();
if (tarefa.getDescricao().length() < 3)
erros.put("descricao",
"A descrição deve conter no minímo 3 caracteres!");
if (!erros.isEmpty())
throw new ViolacaoDeRegraEx(erros);
}
@RegraDeNegocio(autor = "Autor", codigo = "SEUCODIGO02", ordem = 1, fluxo = Constantes.FLUXO.GRAVAR, momentoDeExecucao = MomentoDeExecucao.ANTES)
public void regraDatas(TarefaVO tarefa) {
Map<String, String> erros = new LinkedHashMap<String, String>();
if (tarefa.getDataInicial() == null || tarefa.getDataInicial() == null)
throw new ViolacaoDeRegraEx("Os campos não podem ser nulos!");
else if (tarefa.getDataInicial().compareTo(tarefa.getDataFinal()) > 0) {
erros.put("dataInicial",
"A data inicial não pode ser maior que a data final!");
erros.put("dataFinal", "A data final não pode ser menor que a data inicial!");
}
if (!erros.isEmpty())
throw new ViolacaoDeRegraEx(erros);
}
}
Utilizamos a [anotação @RegraDeNegocio
](regra-de-negocios] para definir que o método seguinte é uma regra e para setar algumas configurações de como e quando a regra vai ser aplicada.