Demoiselle Tutorial Documentation Release 1.0.0 Demoiselle Framework January 29, 2010
CONTENTS 1 Arquitetura 3 1.1 Laboratório Arquitetura e Configuração................................ 3 2 Persistência 13 2.1 Laboratório Persistência........................................ 13 3 Indices and tables 23 i
ii
Contents: CONTENTS 1
2 CONTENTS
CHAPTER ONE ARQUITETURA 1.1 Laboratório Arquitetura e Configuração Este laboratório tem por objetivo fixar os conceitos abordados no Módulo 01 do tutorial que trata as questões de arquitetura do Framework Demoiselle e orientar o processo de instalação e configuração do ambiente de desenvolvimento e da aplicações instanciadas por ele. Caso esteja optando por não utilizar a ferramenta MAVEN, utilize o documento Demoiselle-Tutorial-Modulo01-Arquitetura-Anexo-I, ao invés deste. Para o bom andamento deste laboratório, espera-se que o ambiente do desenvolvedor contenha os seguintes softwares: Software Versão Objetivo Compilador Java (JDK) 1.5.0_17* Compilação dos projetos Eclipse Ganymede 3.4.2 IDE para desenvolvimento AspectJ Development Tools for Eclipse 1.6.4 Compilação de aspectos Maven Integration for Eclipse 0.9.7* Integração com projetos Maven Servidor de Aplicação Tomcat 6.0.18 Servidor de aplicação Web Demoiselle Wizard 1.0.2 Gerador de código do Framework Demoiselle Jboss Tools 3.0 Kit de acessórios para desenvolvimento Mínima 1.1.1 Objetivos Criar e configurar projetos via arquétipo Maven; Criar projeto do tutorial (projeto que terá continuidade nos demais laboratórios); Configurar projeto via Demoiselle Wizard. 3
Figura 1: Lista de update sites configurados no Eclipse 1.1.2 Exercício 1.0 Instalação e configuração do Ambiente 1. Baixar e instalar a JDK JAVA (http://java.sun.com/javase/downloads/index_jdk5.jsp), também é possível utilizar JAVA 6, mas mantendo a compatibilidade com JAVA 5. 2. Baixar e instalar a IDE Eclipse Ganymede (http://www.eclipse.org/ganymede/). 3. Inicie o uso do Eclipse. 4. Já no interface do Eclipse utilize a opção de Software Updates: Menu-> Help-> Software Updates. 5. Utilize a opção Add Site... (figura 1) para instalar os seguintes softwares: AspectJ Development Tools for Eclipse (http://download.eclipse.org/tools/ajdt/34/update/) Maven Integration for Eclipse (http://m2eclipse.sonatype.org/update/) Demoiselle Wizard (http://demoiselle-wzd.sourceforge.net/updatesite/) JBoss Tools (http://download.jboss.org/jbosstools/updates/stable/) 1.1.3 Exercício 1.1 Arquétipo Demoiselle 1. Configuração do repositório Maven 4 Chapter 1. Arquitetura
Abra o Eclipse. A primeira vez que plugin do Eclipse (m2) é instalado, o repositório local é criado na pasta.m2, que fica na Pasta do Usuário (USER_HOME). No Windows, normalmente fica em C:Documents and Settings$USER_HOME.m2 ; no Linux, em /home/$user_home/.m2/ ). Dica: A pasta.m2 é protegida, portanto pode não estar visível por padrão. Para acessá-la, se estiver numa máquina Windows, configure a exibição de arquivos ocultos. No Linux, utilize as teclas Ctrl+H para exibir e esconder arquivos ocultos. No seu repositório local ($USER_HOME/.m2) crie o arquivo archetype-catalog.xml e copie o conteúdo abaixo: <?xml version="1.0" encoding="utf-8"?> <archetype-catalog> <archetypes> <archetype> <groupid>br.gov.component.demoiselle.archetypes</groupid> <artifactid>demoiselle-archetype-webapp-sample</artifactid> <version>1.0.0</version> <repository> http://demoiselle.sourceforge.net/repository/release </repository> </archetype> </archetypes> </archetype-catalog> 1. Criando um novo projeto Volte ao Eclipse é acione o menu: File New Project... Selecione a opção Maven Project (figura 2): 1.1. Laboratório Arquitetura e Configuração 5
Figura 2: Seleção de projeto Maven Na próxima tela é possível configurar o local onde o projeto será criado. Mantenha sua tela conforme a figura 3 para que o projeto seja criado dentro do Workspace padrão. 6 Chapter 1. Arquitetura
Figura 3: Criação de um novo projeto Maven a partir de arquétipo Na tela seguinte (figura 4) são exibidos todos os arquétipos cadastros no archetype-catalog.xml; Selecione no campo Catalog a opção: Default Local; Selecione a última versão do arquétipo demoiselle (demoiselle-archetype-webapp-sample). 1.1. Laboratório Arquitetura e Configuração 7
Figura 4: Configuração do catálogo local de arquétipos Maven Vá à próxima tela. Informe os dados do seu projeto. Group Id: representa a identificação da organização; Artifact Id: representa o nome do projeto; Version: versão do projeto; Package: pacote raiz da aplicação. 8 Chapter 1. Arquitetura
Figura 5: Parâmetros do projeto Maven Acione o botão Finish para iniciar a criação do projeto. Seu projeto deverá ser criado conforme estrutura da figura 6: 1.1. Laboratório Arquitetura e Configuração 9
Figura 6: Estrutura de pacotes do projeto escola O Arquétipo Maven constrói uma aplicação JEE compatível com os seguintes componentes/frameworks: JSF Api 1.2.08 RichFaces 3.1.2 Weblets Api 1.1 MyFaces Tomahawk 1.1.7 10 Chapter 1. Arquitetura
JSF-Facelets 1.1.14 Postgresql 8.0-318 JasperReports 3.1.0 1.1. Laboratório Arquitetura e Configuração 11
12 Chapter 1. Arquitetura
CHAPTER TWO PERSISTÊNCIA 2.1 Laboratório Persistência Este laboratório tem por objetivo fixar os conceitos da camada de persistência do Framework Demoiselle e orientar o processo de configuração das aplicações. 2.1.1 Objetivos Configurar a camada de Persistência através do Demoiselle Wizard utilizando JPA. Criar a camada de persistência da aplicação Escola. Interfaces DAO; Implementações DAO; Filtros de Consulta; Testar o funcionamento da camada de persistência. 2.1.2 Exercício 2.1 Configuração do Projeto 1. Este laboratório utilizará o projeto escola criado no laboratório anterior. 2. Clique com o botão direito sob o projeto a acione a opção Demoiselle -> Configurar Projeto. Figura 1: Configurar Projeto 1. Na guia JPA, você poderá adicionar, alterar ou remover suas Persistence Units. Para incluir uma Persistence Unit, clique no botão adicionar. 13
Figura 2: Configurar Persistence Unit Para incluir uma Persistence Unit, preencha os seguintes campos: Obs.: Este tutorial utilizará como exemplo o HypersonicSQL. Nome: EscolaPU Provider: org.hibernate.ejb.hibernatepersistence Tipo: Resource Local Data Source: Não vamos usar JNDI Propriedades: Key hibernate.dialect hibernate.show_sql hibernate.format_sql hibernate.hbm2ddl.auto hibernate.connection.driver_class hibernate.connection.url hibernate.connection.username hibernate.connection.password hibernate.use_sql_comments Value org.hibernate.dialect.hsqldialect true false update org.hsqldb.jdbcdriver jdbc:hsqldb:. sa false 1. Clique no botão Salvar e caso não queira adicionar nenhuma outra Persistence Unit clique no botão Finish. O Wizard irá configurar o arquivo persistence.xml na pasta resources/meta-inf do projeto conforme figura abaixo: 14 Chapter 2. Persistência
Figura 3: Persistence.xml 1. Adicione a linha framework.demoiselle.persistence.default_persistence_unit=escolapu ao final do arquivo demoiselle.properties. 2. Adicione a dependência do HSQLDB versão 1.8.0.1 no arquivo pom.xml da aplicação (logo após a tag <profiles>) conforme abaixo: <dependencies>... <dependency> <groupid>hsqldb</groupid> <artifactid>hsqldb</artifactid> <version>1.8.0.1</version> </dependency>... </dependencies> 2.1.3 Exercício 2.2 Desenvolvimento da camada de persistência Pacote Bean 1. No pacote br.gov.demoiselle.escola.bean Implemente o Pojo de Aluno conforme abaixo: package br.gov.demoiselle.escola.bean; import java.util.arraylist; import java.util.date; import java.util.hashset; import java.util.list; import java.util.set; import javax.persistence.entity; import javax.persistence.sequencegenerator; import javax.persistence.table; import javax.persistence.column; import javax.persistence.fetchtype; import javax.persistence.generatedvalue; import javax.persistence.id; import javax.persistence.temporal; import javax.persistence.temporaltype; 2.1. Laboratório Persistência 15
import javax.persistence.cascadetype; import javax.persistence.onetomany; import javax.persistence.generationtype; import br.gov.framework.demoiselle.core.bean.ipojo; @Entity @Table(name="aluno") @SequenceGenerator(name="AlunoSequence", sequencename="aluno_seq", allocationsize=1) public class Aluno implements IPojo { private static final long serialversionuid = 1L; @Id @GeneratedValue(generator="AlunoSequence", strategy=generationtype.sequence) @Column(name="id_aluno") private Long id; @Column(name="nome", length=100) private String nome; @Column(name="pai", length=100) private String pai; @Column(name="mae", length=100) private String mae; @Column(name="nascimento") @Temporal(value=TemporalType.DATE) private Date nascimento; @OneToMany(cascade=CascadeType.ALL, fetch=fetchtype.lazy) private Set<Endereco> enderecos; public Aluno() { enderecos = new HashSet<Endereco>(); public Aluno(long id) { this(); this.id = id; public Long getid() { public void setid(long id) { return id; this.id = id; public String getnome() {return nome; public void setnome(string nome) {this.nome = nome; public String getpai() {return pai; public void setpai(string pai) {this.pai = pai; public String getmae() {return mae; public void setmae(string mae) {this.mae = mae; 16 Chapter 2. Persistência
public Date getnascimento() {return nascimento; public void setnascimento(date nascimento) {this.nascimento = nascimento; public Set<Endereco> getenderecos() { return enderecos; public List<Endereco> getlistaendereco() { return new ArrayList<Endereco>(enderecos); public void setenderecos(set<endereco> enderecos) { this.enderecos = enderecos; 1. No mesmo pacote implemente o Pojo de Endereço: package br.gov.demoiselle.escola.bean; import javax.persistence.column; import javax.persistence.entity; import javax.persistence.fetchtype; import javax.persistence.generatedvalue; import javax.persistence.generationtype; import javax.persistence.id; import javax.persistence.joincolumn; import javax.persistence.manytoone; import javax.persistence.sequencegenerator; import javax.persistence.table; import br.gov.component.demoiselle.common.pojo.extension.description; import br.gov.component.demoiselle.common.pojo.extension.equalsfield; import br.gov.component.demoiselle.common.pojo.extension.pojoextension; import br.gov.framework.demoiselle.core.bean.ipojo; @Entity @Table(name="endereco") @SequenceGenerator(name="EnderecoSequence", sequencename="endereco_seq", allocationsize=1) public class Endereco extends PojoExtension implements IPojo { private static final long serialversionuid = 1L; @EqualsField @Id @GeneratedValue(generator="EnderecoSequence", strategy=generationtype.sequence) @Column(name="id_endereco") private Long id; @EqualsField @Description @Column(name="logradouro", length=100) private String logradouro; @Description @Column(name="numero", length=100) private String numero; @Description 2.1. Laboratório Persistência 17
@Column(name="complemento", length=100) private String complemento; @Description @Column(name="bairro", length=100) private String bairro; @Description @Column(name="cep", length=100) private String cep; @Column(name="municipio", length=100) private String municipio; @Description @Column(name="tipo") private Integer tipo; @Description @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="aluno") private Aluno aluno; public Endereco() { public Endereco(String logradouro, String numero, String complemento, String bairro, String cep, String Municipio, Integer tipo) { super(); this.logradouro = logradouro; this.numero = numero; this.complemento = complemento; this.bairro = bairro; this.cep = cep; this.municipio = Municipio; this.tipo = tipo; public Long getid() { return id; public void setid(long id) { this.id = id; public String getlogradouro() { return logradouro; public void setlogradouro(string logradouro) { this.logradouro = logradouro; public String getnumero() { return numero; 18 Chapter 2. Persistência
public void setnumero(string numero) { this.numero = numero; public String getcomplemento() { return complemento; public void setcomplemento(string complemento) { this.complemento = complemento; public String getbairro() { return bairro; public void setbairro(string bairro) { this.bairro = bairro; public String getcep() { return cep; public void setcep(string cep) { this.cep = cep; public Integer gettipo() { return tipo; public void settipo(integer tipo) { this.tipo = tipo; public String getmunicipio() { return municipio; public void setmunicipio(string Municipio) { this.municipio = Municipio; public Aluno getaluno() { return aluno; public void setaluno(aluno aluno) { this.aluno = aluno; 1. Agora os beans foram criados será necessário fazer o mapeamento deles no arquivo persistence.xml. Para isso clique com o botão direito em cima do projeto e em seguida clique em Demoiselle -> Configurar Projeto. 2.1. Laboratório Persistência 19
Figura 4: Configurar Projeto Na aba JPA, clique em cima da Persistence Unit criada com o nome de EscolaPU e em seguida clique em Editar. Figura 5: Editar Persistence Unit No lado direito da tela aparecerá as configurações feitas anteriormente e aparecerá também um botão chamado Adicionar Pojo. Clique nesse botão. 20 Chapter 2. Persistência
Figura 6: Adicionar Pojo Em seguida aparecerá as classes que já foram criadas. Selecione os dois beans (Aluno e Endereço) conforme a figura abaixo e clique em Finish. 2.1. Laboratório Persistência 21
Figura 7: Selecionar Pojos Verifique que os dois beans foram mapeados no aquivo persistence.xml conforme abaixo: <?xml version="1.0" encoding="utf-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd" version="1.0" <persistence-unit name="escolapu" transaction-type="resource_local"> <provider>org.hibernate.ejb.hibernatepersistence</provider> <class>br.gov.sample.demoiselle.escola.bean.aluno</class> <class>br.gov.sample.demoiselle.escola.bean.endereco</class> <properties> <property name="hibernate.connection.username" value="sa" /> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcdriv <property name="hibernate.format_sql" value="false" /> <property name="hibernate.connection.password" value="" /> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.use_sql_comments" value="false" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.dialect" value="org.hibernate.dialect.hsqldialect" <property name="hibernate.connection.url" value="jdbc:hsqldb:." /> </properties> </persistence-unit> </persistence>... 22 Chapter 2. Persistência
CHAPTER THREE INDICES AND TABLES Index Module Index Search Page 23