Você está aqui: Página Inicial Framework Quick Start

Exemplo Simplificado de Construção de uma Aplicação

por admin última modificação 05/05/2010 10:15

Criação de um Projeto no Eclipse com o plugin SERPRO ^

O ambiente de desenvolvimento padrão para o framework é o IDE Eclipse. A instalação completa do framework já contém o plugin SERPRO, que facilita a criação de projetos com a estrutura do framework, além de possuir wizards que geram código a partir de uma interface visual.

Com o Eclipse aberto, entre no menu File e clique no item New Project. Será apresentada a tela abaixo.

New Project

Selecione a pasta SERPRO e clique sobre Novo Projeto. Nosso projeto de exemplo se chamará escola. Após clicar no botão Finish, o plugin irá gerar um projeto com o mínimo de arquivos exigidos para o uso do framework.

POJO ^

POJO é uma outra denominação para um objeto Java comum. Possui atributos que guardam correspondência com campos de tabelas de bancos de dados (ou outras fontes de dados), o construtor da classe e métodos de acesso e modificação dos atributos (getters e setters). Neste exemplo, temos um banco PostgreSQL do qual trataremos apenas uma tabela chamada professor, a qual tem dois campos: id_professor (serial) e nome (text). A classe POJO será criada dentro do pacote br.gov.serpro.escola.bean, conforme a figura abaixo.

package br.gov.serpro.escola.bean;

import br.gov.framework.core.bean.IPojo;

public class Professor implements IPojo {

private static final long serialVersionUID = 1L;

private Long id;
private String nome;

public Professor(Long id) {
this.id = id;
}

public Professor(String nome) {
this.nome = nome;
}

public Professor() {
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}
}

Na verdade, basta definir os atributos, pois os getters e setters podem ser gerados pelo editor no menu Source do Eclipse, pelo item Generate Getters and Setters.

Persistência ^

HBM ^

Cada POJO deve ter seu respectivo arquivo hbm do Hibernate. Vamos criar o arquivo Professor.hbm.xml dentro do diretório hbm, de acordo com a figura abaixo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="br.gov.serpro.escola.bean.Professor" table="professor">

<id column="id_professor" name="id">
<generator class="increment" />
</id>

<property name="nome" type="string" length="100" />

</class>
</hibernate-mapping>

A associação dos .hbms ao hibernate.cfg.xml pode ser feita pelo submenu SERPRO, item Configurar Projeto.

Na aba Hibernate, configure a conexão com o banco e selecione o arquivo Professor.hbm.xml, conforme figura abaixo.

Show SQL faz com que o Hibernate exiba, na saída padrão (console) as expressões SQL geradas e executadas.

Format SQL só é válida se a opção anterior for selecionada. Ela formata a expressão SQL de forma a torná-la mais legível.

Auto update HBM. Se marcada, esta opção faz com que as alterações nos arquivos HBM referentes à estrutura de tabelas sejam refletidas no banco de dados, inclusive com a criação das mesmas se não existirem. Porém o banco deve existir.

Ao clicar sobre o botão Finish, o arquivo hibernate.cfg.xml será atualizado com as informações fornecidas.

DAO ^

Faz-se necessária a criação de uma classe para acesso aos dados (DAO). Pelo submenu SERPRO clique sobre o item Editar Projeto. Na janela que será aberta, conforme a a figura abaixo, definiremos o pacote o e POJO referenciados na aba DAO.

Pacote: br.gov.serpro.escola.persistence.dao

Pojo: br.gov.serpro.escola.bean.Professor

Dicas:

  1. Para buscar o pacote, vá digitando o nome parcialmente, desde o pacote mais alto (da esquerda), conforme figura abaixo:
  1. Para buscar o bean, basta digitar o nome parcial da classe:

Em Tipo marque a opção Hibernate, pois é o que usaremos para acessar o banco.

O wizard do plugin criará no pacote especificado uma interface herdeira de IDAO, que trará a assinatura do métodos selecionados. Vamos incluir outros métodos, de modo que IProfessorDAO.java fique assim:

IProfessorDAO ^
public interface IProfessorDAO extends IDAO<Professor> {

public PagedResult<Professor> listar(Page page);

public Professor buscar(Professor professor);

public PagedResult<Professor> filtrar(Professor prof, Page page);

public List<Professor> listar();

}

Além dessa interface, deve ter sido criada a classe ProfessorDAO no pacote br.gov.serpro.escola.persistence.dao.implementation, com a implementação dos métodos da interface. Vamos criar o código de modo que a classe fique assim:

ProfessorDAO ^
package br.gov.serpro.escola.persistence.dao.implementation;

import java.util.List;

import br.gov.component.hibernate.filter.dao.HibernateFilterGenericDAO;
import br.gov.framework.persistence.hibernate.HibernateUtil;
import br.gov.framework.util.page.Page;
import br.gov.framework.util.page.PagedResult;
import br.gov.serpro.escola.bean.Professor;
import br.gov.serpro.escola.filter.FiltroProfessor;
import br.gov.serpro.escola.persistence.dao.IProfessorDAO;

public class ProfessorDAO extends HibernateFilterGenericDAO<Professor> implements IProfessorDAO{

/**
* Lista todos os alunos com paginação.
* Uso de HQL
*/
public PagedResult<Professor> listar(Page page) {
HibernateUtil.getInstance().getSession().flush();
return findHQL("from Professor order by nome asc", page);
}


public List<Professor> listar() {
HibernateUtil.getInstance().getSession().flush();
return findHQL("from Professor order by nome asc");
}

/**
* Busca pelo campo id
*/
public Professor buscar(Professor professor) {
FiltroProfessor f = new FiltroProfessor();
f.addEquals(FiltroProfessor.ID, professor.getId());
List<Professor> retorno = find(f);
if (retorno != null && retorno.size() > 0 )
return retorno.get(0);
return null;
}

public PagedResult<Professor> filtrar(Professor prof, Page page) {
PagedResult<Professor> retorno = findByExample(prof, page);
return retorno;
}

}

Testando o DAO ^

Agora, para testar nosso DAO, vamos criar a classe ProfessorDAOTest, no pacote br.gov.serpro.escola.test. Vamos fazer um caso de teste para verificar a inclusão de novos registros.

package br.gov.serpro.escola.test;

import junit.framework.TestCase;

import org.junit.Assert;

import br.gov.framework.core.layer.IViewController;
import br.gov.framework.core.layer.integration.Injection;
import br.gov.framework.web.transaction.WebTransactionContext;
import br.gov.serpro.escola.bean.Professor;
import br.gov.serpro.escola.persistence.dao.IProfessorDAO;

public class ProfessorDAOTest extends TestCase implements IViewController {

@Injection
private IProfessorDAO professorDAO;



public void testIncluirProfessor()
{
Long idAntes, idDepois;

Professor professor = new Professor();

professor.setNome("Brasilino");

idAntes = professor.getId();

WebTransactionContext.getInstance().init();

professorDAO.insert(professor);

WebTransactionContext.getInstance().end();

idDepois = professor.getId();

Assert.assertNotSame(idAntes, idDepois);

}

}

Negócio ^

Vamos criar um controlador de negócios para a classe Professor, que faça uso das classes de persistência anteriores. No submenu SERPRO, item Editar Projeto, selecione a aba Business Controller e adicione um controlador chamado ProfessorBC no pacote br.gov.serpro.escola.business.implementation.

Adicione um método chamado incluir com alias incluirProfessor que retorne Void e tenha um parâmetro do tipo Professor. Clique em Salvar para gravar os dados do Business Controller, depois em Aplicar para que as alterações resultem na criação da classe ProfessorBC. Findos esses passos, basta fechar a janela clicando sobre Finish. A classe ProfessorBC deve ficar assim:

public class ProfessorBC implements IProfessorBC {

Testando o BC ^

Agora criaremos em br.gov.serpro.escola.test um classe que utilizará o controlador de negócios para efetuar uma inclusão de registro. O propósito de refazer a mesma operação é mostrar o aumento no nível de abstração. Abaixo segue a classe de teste ProfessorBCTest:

package br.gov.serpro.escola.test;

import junit.framework.Assert;
import junit.framework.TestCase;
import br.gov.framework.core.layer.IViewController;
import br.gov.framework.web.transaction.WebTransactionContext;
import br.gov.serpro.escola.bean.Professor;
import br.gov.serpro.escola.business.implementation.ProfessorBC;

public class ProfessorBCTest extends TestCase implements IViewController {

private ProfessorBC professorBC;

public void testIncluirProfessor()
{
Long idAntes, idDepois;

Professor professor = new Professor();

professor.setNome("Brasilino");

idAntes = professor.getId();

WebTransactionContext.getInstance().init();

professorBC.inserir(professor);

WebTransactionContext.getInstance().end();

idDepois = professor.getId();

Assert.assertNotSame(idAntes,idDepois);

}

}

Apresentação ^

Para fazer a camada de apresentação, vamos criar uma classe chamada ProfessorMB por meio do wizard. Acesse o submenu SERPRO e clique sobre Editar Projeto. Selecione a aba Managed Beans. Preencha os campos conforme a figura abaixo:

Conforme a tela acima, na seção Ações são definidos os métodos do Managed Bean. Clique sobre o botão Adicionar e defina os seguintes métodos, conforme a tabela abaixo (o nome e ação de retorno são os mesmos neste caso):

Nome Ação de Retorno
inserir inserir
listar listar
filtrar filtrar
alterar alterar
excluir excluir
carregarLista carregarLista
filtrar filtrar
updatePage updatePage
preInserir preInserir
cancelar cancelar
menu menu
preExcluir preExcluir
preAlterar preAlterar

Os métodos que retornam String irão devolver uma constante que refere-se a página que será apresentada.

Grave os métodos com o botão Salvar e após concluída a geração da classe, feche a janela com o botão Finish.

A classe MB foi criada no pacote br.gov.serpro.escola.ui. Vamos implementar o código de forma que fique deste jeito:

ProfessorMB ^

public class ProfessorMB extends AbstractManagedBean implements IViewController{/* Fields declarations */

@Injection
private IProfessorBC professorBC;

private Professor professor = new Professor();
private PagedResultDataModel<Professor> listaProfessor;

private static Logger log = Logger.getLogger(ProfessorMB.class);

/**
* Construtor
*/
public ProfessorMB() {
log.debug("construtor");
listaProfessor = new PagedResultDataModel<Professor>();
}


/**
* Lista de professores paginada
* @return
*/
public PagedResultDataModel<Professor> getListaProfessor() {
return listaProfessor;
}


public String inserir() {
professorBC.inserir(professor);
carregarLista();
log.debug("inserir [ok]");
return AliasNavigationRule.PROFESSOR_LISTAR;
}

public String listar() {
carregarLista();
log.debug("listar [ok]");
return AliasNavigationRule.PROFESSOR_LISTAR;
}

public String filtrar(){
PagedResult<Professor> pg = professorBC.filtrar(professor, new Page(getRows(), 1));
listaProfessor.bind(pg);
log.debug("filtrar [ok]");
return AliasNavigationRule.PROFESSOR_LISTAR;
}

public String alterar() {
professorBC.alterar(professor);
carregarLista();
log.debug("alterar [ok]");
return AliasNavigationRule.PROFESSOR_LISTAR;
}

public String excluir() {
professorBC.remover(professor);
log.debug("remover [ok]");
carregarLista();
return AliasNavigationRule.PROFESSOR_LISTAR;
}

/**
* Atualiza a lista de professor realizando consulta no banco
* com paginação
*/
public void carregarLista(Page page) {
listaProfessor.bind(professorBC.listar(page));
log.debug("carregarLista [ok]");
}

/**
* Atualiza a lista de aluno passando sempre a primeira página
*/
public void carregarLista() {
carregarLista(new Page(getRows(), 1));
}

/**
* Atualiza a página de alunos
*/
public void updatePage(DataScrollerEvent e){
int index = ((UIDatascroller) e.getComponent()).getPageIndex();
Page pagina = new Page(getRows(), index);
carregarLista(pagina);
log.debug("updatePage [ok]");
}

//**************** NAVEGAÇÃO ****************

public String preInserir() {
professor = new Professor();
log.debug("preInserir [ok]");
return AliasNavigationRule.PROFESSOR_EDITAR;
}

public String cancelar() {
log.debug("cancelar [ok]");
return AliasNavigationRule.PROFESSOR_LISTAR;
}

public String menu() {
log.debug("menu [ok]");
return AliasNavigationRule.ESCOLA_MENU;
}

public String preExcluir() {
log.debug("preExcluir [ok]");
return AliasNavigationRule.PROFESSOR_VISUALIZAR;
}


public String preAlterar() {
Professor prof = professorBC.buscar(professor);
if (prof == null){
throw new ApplicationRuntimeException(ErrorMessage.PROFESSOR_001);
}
log.debug("preAlterar [ok]");
return AliasNavigationRule.PROFESSOR_EDITAR;
}

//SET e GETS
public Professor getProfessor() {
return this.professor;
}

public void setProfessor(Professor arg0) {
this.professor = arg0;
}


}//End of class

Criação de Páginas ^

Uma vez construído o MB, vamos criar as páginas Web que constituem a interface gráfica da aplicação.

No submenu SERPRO, clique em Criar Páginas (jsp). Na tela exibida a seguir, selecione o diretório /escola/src/main/webapp/private/pages e marque o item Listagem.

Seleciona destino das páginas

Em seguida, vamos definir a página de listagem. Se tivessémos selecionado os outros itens, teríamos outras abas, mas não é este o caso. Preencha a tela conforme a figura adiante.

Página de Listagem

Isso criará o arquivo professor_listar.xhtml. Você pode executá-lo como se fosse uma página JSP, pois na verdade é isso o que ele é. Apenas tem uma extensão diferente. Se tudo estiver certo, será exibida uma página que listará o nome dos professores (supondo que você tenha cadastrado algum).

Este exemplo é um excerto da aplicação escola, cujo fonte pode ser baixado aqui colocar link, juntamente com o material de trenamento.