aula 01 frameworks para desenvolvimento web em java - utfpr
TRANSCRIPT
Frameworks para Desenvolvimento web em
JavaAndré Luiz Forchesatto
Apresentação● Especialista em Ciência da Computação pela UFSC;● Graduado em Tecnologia em Informática pela Unoesc;● Atuação
○ Sócio Camtwo Sistemas;○ Desenvolvedor Java desde 2002;○ Professor;
● Contato○ http://about.me/andreforchesatto○ [email protected]○ @forchesatto
Ementário
Evolução do desenvolvimento de aplicações WEB. Introdução ao Desenvolvimento RAD para WEB. Visão geral das ferramentas e frameworks para desenvolvimento de aplicações WEB. Gerenciamento de dependências e deploy com maven. Injeção de dependência com Spring ou CDI. Padrão de Desenvolvimento WEB Action Based e Component Based.
Planejamento
● Aula 01○ Maven○ Injeção de dependência○ Introdução ao Spring○ Spring IoC○ Spring Boot○ Spring Data
● Aula 02○ Spring Test○ Spring MVC○ Spring Rest○ Spring Web com HTML
Planejamento
● Aula 03○ Spring Web com JSF○ Spring MVC○ Spring Web
● Aula 04○ Spring Security○ CDI
● Aula 05○ CDI○ Trabalho Final
Maven
Problema Gestão de Dependência
Problema Gestão de Dependência
● Múltiplos Componentes● Componentes dependem de outros componentes● Múltiplas versões
Inferno dos Jars
Conceito
● Ferramenta para gerenciamento, construção e implantação de projetos;
● Simplifica o processo de Build● Organiza e compartilha as Libs dos projetos● Fornece orientação para as melhores práticas
de projeto e programação● Gera relatórios e documentação sobre o
projeto
Características
● Builds automatizados● Ciclo de vida bem definido (lifecycle)● Repositório de artefatos● Gestão de Dependências● Definição de Projetos declarativa (POM)● Plugins como peça fundamental● Quickstart rápido de projetos● Site de projetos facilmente acessível● Integração com controle de versão
Project Object Model (POM)
● Definições do projeto● Configurações de dependências de
componentes(lib)● Customizações (definições de plugin,
repositorios, etc..)● Herança e agregação de projetos
Estrutura Mínima (POM)
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.camtwo.cursoJava</groupId>
<artifactId>exemplo</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>exemplo</name>
</project>
Propriedades (POM)
● groupId (nome do package - empresa)● artifactId (identificador do projeto)● packaging (pom, war, jar, etc. - default jar)● version (versão de release ou SNAPSHOT)
Propriedades (POM)
Dependências
<project>...<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency></dependencies>...</project>
compile (default)providedruntime
testsystem
http://search.maven.org/
Buscando libs
Herança de projetos
● Permite herdar as caracteristicas de um projeto pai, como libs, propriedades e build.
Exemplo de Projeto Pai
Tag Build
Tag do pom.xml onde definimos parametros de compilação, como versão do Java, diretorios de resources e vários outros plug-ins que podem ser utilizados
Tag Build
<build><finalName>exemploioc</finalName><plugins>
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration>
<compilerVersion>1.8</compilerVersion><source>1.8</source>
<target>1.8</target> </configuration>
</plugin></plugins></build>
● Exemplo Build definição do nome final e versão do Java
Instalação
● Devemos ter uma instalação quando desejamos rodar os comandos pelo prompt.
● Linux○ sudo apt-get install maven2
● Windows○ Efetuar o download (http://maven.apache.
org/download.html)○ Descompactar em uma pasta○ Criar uma variável de ambiente M2_HOME com o
caminho da pasta○ Adicionar no classpath esta variável com o \bin
Testando
● Testar no console mvn -v● Criar um projeto simples no console:
mvn archetype:create -DgroupId=br.com.camtwo -DartifactId=exemplo
● Verificar se criou a estrutura de diretórios● Verificar se criou a pasta .m2
Estrutura Projeto Maven
Eclipse + Maven
● A versão Kepler+ já vem com o Maven nativo.
● Versões anteriores:○ Instalação do Plug-in m2 help/install new software○ m2eclipse Core Update - http://m2eclipse.sonatype.
org/sites/m2e○ m2eclipse Extras Update - http://m2eclipse.sonatype.
org/sites/m2e-extras
Novo projeto: Maven + EclipseFile->New Project
Novo projeto: Maven + Eclipse
Novo projeto: Maven + Eclipse
Build no projeto
Spring framework
O que é?
● Framework open-source criado por Rod Johnson
● Container leve com inversão de controle e programação orientada a aspecto
● Criado para simplificar o desenvolvimento enterprise
Alguns principios
● O Código de sua aplicação não deve depender da API do Spring
● Spring não deve competir com boas soluções existentes mais sim promover integração
● Escrever código testável é crítico e o container deve ajudar(não interferir) nesse objetivo
● Usar o Spring deve ser um prazer!
Módulos
Uso completo
Spring IO - http://spring.io/platform
Todos os componentes do sistema são gerenciados pelo Spring utilizando IoC e Injeção de dependência.
"A primeira pergunta a ser respondida é: como obter um objeto sem depender direta ou indiretamente de sua classe?"
fonte: GUERRA, Eduardo, Designer Pattern com Java. Ed.: Casa do Código - SP
Dynamic Factory
fonte: GUERRA, Eduardo, Designer Pattern com Java. Ed.: Casa do Código - SP
IOC (Inversão de controle)
● Delegação de tarefas de construção para frameworks
● O objeto perde o controle sobre sua construção
● Possibilita menor acoplamento entre as dependências
Exemplo IoC
public class TesteIOC {
private static TesteIOC testeIOC;
public static TesteIOC getInstance(){ if(testeIOC == null){ testeIOC = new TesteIOC(); } return testeIOC; }}
@Service(value=”testeIOC”)public class TesteIOC {
}
SEM IoC utilizando Singleton COM IoC - Exemplo Spring
Injeção de dependência
● Design pattern que visa desacoplar os componentes da aplicação;
● Injeta através de construtor, setters ou atributos o valor de dependência para a classe a ser construída;
Injeção de dependência
fonte: GUERRA, Eduardo, Designer Pattern com Java. Ed.: Casa do Código - SP
Injeção de dependência
PedidoRepository
ConexaoBanco CarrinhoDeCompra
ProdutoRepository
ClienteRepositoryContainer IoC
public class CarrinhoDeCompra {
@Autowiredprivate PedidoRepository repositorio;
}
Spring e IoC
● Tudo passa pelo Container de Beans● É o núcleo do Spring famework● Usa IOC para gerenciar os componentes que
compõem uma aplicação● Componentes são expressos como simples
Java Beans● O Container gerencia as relações entre os
Beans e é responsável por sua configuração● O Container gerencia o ciclo de vida dos
Beans
Tipos de Container
● Bean Factory○ Dá suporte básico a injeção de dependência○ Configuração e gerenciamento do ciclo de vida
● Application Context○ Construído sobre o Bean Factory adicionando
serviços de:■ Resolução “mensagens” através de arquivos de
propriedades para internacionalização■ Carregamento de recursos genéricos■ Publicação de eventos
Exemplo Bean Factory
@Service(value="mensagemBean")public class MensagemImpl implements Mensagem {
private String mensagem = “Olá”;
public void setMensagem(String mensagem){ this.mensagem = mensagem; } public String getMensagem() { return mensagem; }}
public interface Mensagem { String getMensagem();}
Características dos managed beans● Singletons por default● Propriedades setadas por Dependency
Injection○ Referência para outros managed beans○ Strings○ Tipos primitivos○ Coleções (lists, sets, map, props)
● Parâmetros podem ser extraídos para arquivos de propriedades
Tipos de anotações
● @Component - Componente genérico da aplicação
● @Service – Anotação camada de serviço● @Repository – Anotação para DAO● @Controller – Anotação para camada web● @Autowired – Injeção de dependência● @Qualifier – Qualificar o nome do bean a ser
injetado
Spring - Boot
● Novo projeto da Pivot para simplificar o inicio do desenvolvimento de aplicações Spring.
● Elimina todos os xmls e configurações básicas para uma aplicação Spring.
● Ganhou fama com o post no twitter: https://twitter.com/rob_winch/status/364871658483351552
Spring - Boot
● Desenvolvido em Grovy● Já configura todas as libs necessárias● Não é um novo framework e um bootstrap
para Spring● Configuração básica pronta● Disponibiliza servidor tomcat ou jetty
embutido
Spring - Boot - Java1. Criar um novo projeto Maven2. Configurar pom.xml3. Criar classe main4. Criar classes de negócio da aplicação
Spring - Boot - pom.xml<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.8.RELEASE</version></parent>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
Spring - Boot - pom.xml
● Dependência Web Básica
Classe Main Básica Spring-boot
Spring-boot Serviço Web
Ao rodar o tomcat/jetty embutido é iniciado e basta acessar http://localhost:8080/ que a app web esta disponível com base nos controladores criados
Prática
Injeção de dependência com Spring
Spring-Data
Realidade Banco de dados
Spring Data
Realidade Persistência Java
Spring Data
“Simplifica o desenvolvimento de aplicações que usam novas tecnologias de acesso a dados como: noSql, mapReduce e cloud. Além do suporte aperfeiçoado a bancos relacionais.”
Spring Data
SubProjetos
●JPA●JDBC Extensions●Hadoop●GemFire●Redis●Riak●MongoDB●Neo4j●Blob●Commons
Spring Data - COMMONS
Conceito utilizado por todos os outros subprojetos, é utilizado como core do projeto Spring Data.
Spring Data - COMMONS
Uma interface principal denominada CrudRepository que deve ser herdada para cada Model Class da aplicação.
Spring Data - CrudRepository
Spring Data – JPARepository
Configuração Spring-bootArquivo resources/application.properties
spring.jpa.hibernate.ddl-auto:updatespring.jpa.show-sql: truespring.jpa.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialectspring.datasource.url=jdbc:postgresql://localhost:5432/utfprspring.datasource.username=postgresspring.datasource.password=spring.datasource.driverClassName=org.postgresql.Driver
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency>
<groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.3-1100-jdbc41</version> </dependency>
Prática
Spring Data - Query Builder
Construção de query utilizando somente o nome do método.
Spring Data - Query Builder
Spring Data - @Query
Para aplicações que utilizam JPA, ainda é possível criar as query utilizando JPAQL
Spring Data - PaginaçãoUtilizando as classes Page e Pageable do Spring é possível fazer paginação na query com o minimo de esforço.
Utilizando o método:
Mais Spring Data-JPA
Repositórios CustomizadosQuery DSLSpecificationAuditingStoreProceduresWebSuport
Prática
Criar repositórios, entidades e testar.
Transações Spring
● Suporte para gerenciamento programático e declarativo de transações
● Transações locais são delegadas pelo Spring para o gerente de transações do data-source
● Quando múltiplos recursos estão envolvidos (transações distribuídas), Spring delega para o gerente de transações JTA obtido através do JNDI
● Apenas algumas pequenas mudanças são necessárias para trocar entre local e JTA
Transações Spring
● Gerenciamento Declarativo (+)○ Usa AOP para encapsular chamadas a objetos
transacionais com código de begin e commit de transações
● Comportamento de propagação○ Mandatory, Never, Not Supported, Required, Requires New, Support,
Nested
● Também suporta níveis de isolação○ Default, Read Uncommitted, Read Committed, Repeatable Read,
Serializable
Modelo transacional
● Normalmente o modelo flat transactions● Se método é chamado dentro de uma transação, ele
pode continuar transação anterior● Se ele falhar, transação inteira é revertida● Se nova transação for iniciada no método que já faz
parte de uma transação, ela é independente● Se falhar, pode sinalizar rollback() para desfazer
transação externa (ou não, e permitir que transação externa continue)
● O possível rollback da transação externa não afetará outras transações (T2) cujos resultados já foram cometidos
Modelo transacional
T1 Suspensa T1
T2
Suspensa T1
T3
Início
A=0
B=0
C=0
A=5
sucesso
A=5
B=3 falha
C=8 C=0
Fim
A=5B=0
C=0B=0
Comportamento de propagação
● Mandatory○ Indica que o método só pode ser chamado no
escopo de uma transação do cliente○ Se o método for chamado fora de uma
transação, ele causará uma exceção● Never
○ Indica que o método nunca pode estar dentro de uma transação
○ Se o cliente que chama o método for parte de uma transação, ele causará uma exceção
Comportamento de propagação
● NotSupported○ Indica que o método não suporta transações○ Se o método for chamado pelo cliente no escopo de uma
transação, a mesma será suspensa enquanto durar a chamada do método (não haverá propagação de transações do cliente)
● Required○ Indica que o escopo de uma transação é requerido pelo
método○ Se não existe transação, uma nova é criada e dura até
que o método termine (é propagada para todos os métodos chamados)
○ Se já existe uma transação iniciada pelo cliente, o bean é incluído no seu escopo durante a chamada do método
Comportamento de propagação
● Requires New○ Indica que o método requer uma nova transação○ Estando ou não o cliente no escopo de uma transação, o
bean irá iniciar uma nova transação que iniciará e terminará no bean.
● Support○ Indica que o método suporta transações ○ Será incluído no escopo da transação do cliente se existir○ Se ele for chamado fora do escopo de uma transação ele
realizará suas tarefa sem transações e pode chamar objetos que não suportam transações
E como fazer?
● Anotando as transações○ A anotação pode ser no começo da classe ou
acima de um método
E como fazer?
● @Transactional○ Indica que a classe ou o método esta envolvido em
uma transação○ Se estiver sobre a classe indica que todos os
métodos terão o mesmo comportamento transacional;
○ Os métodos anotados com @Transactional desconsideram a anotação da classe
● ReadOnly○ Indica que o método ou classe poderá ou não
alterar os dados contidos na transação
E como fazer?
● Propagation● Indica o tipo de propagação da transação
○ PROPAGATION_MANDATORY○ PROPAGATION_NESTED○ PROPAGATION_NEVER○ PROPAGATION_NOT_SUPPORTED○ PROPAGATION_REQUERED○ PROPAGATION_REQUERED_NEW○ PROPAGATION_SUPPORTS
Prática
Criar Services e configurar transações