Aula 01 Frameworks para desenvolvimento web em java - UTFPR

Post on 26-May-2015

480 views 7 download

Transcript of Aula 01 Frameworks para desenvolvimento web em java - UTFPR

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○ andreforchesatto@gmail.com○ @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