Share
Embed
Produtividade no Desenvolvimento Web com GWT
Curso ministrado no III Meditec - Medianeira In Tecnology - 2012
Carlos Alexandro Becker
June 27, 2012
Transcript
26 slides
-
Carlos A. Becker • Graduado em Tecnologia em Análise e
Desenvolvimento de Sistemas pela Universidade Tecnológica Federal do Paraná (UTFPR); • Cursando Especialização em Projeto e Desenvolvimento de Sistemas para a Internet e Dispositivos Móveis (UTFPR); • Desenvolvedor de Rich WebApps à 2 anos; • Gerente de Desenvolvimento e Arquiteto de Software na Digitaldoc. -
Agenda 1. Maven 2. JPA2 (JSR317) com EclipseLink 3. BeanValidation
(JSR303) 4. DI com o Google Guice (JSR330) 5. Guice-Persist 6. GWT 7. MVP 8. GWT-Platform 9. Desvantagens 10. Dúvidas -
1. Maven • Ferramenta para gerenciamento e automação de projetos
Java mantido pela Apache Foundation; • Bem documentado; • Muito bem aceito pela comunidade Java. -
Maven • Plugins para geração de documentação, relatórios de code
coverage, dependency tree, status dos testes, changelogs, desenvolvedores, modificações no projeto, etc etc etc • Logo ele aprenderá a fazer café também :) -
Tem que ter alguma coisa ruim nele, né? Sim, algumas:
◦ A configuração em si, facilmente vira um XML de 600 linhas "criptografado". ◦ Alguns bugs conhecidos, a grande maioria, felizmente, é contornável. ◦ Algumas IDE's (Eclipse) não se dão muito bem com ele em alguns casos (M2E bugado). ▪ Mas hey, funciona graciosamente bem no Netbeans e IntelliJ. -
2. JPA2 (JSR317) + EclipseLink • A JPA é a
API padrão para persistência de Objetos com Java; • EclipseLink é a implementação de referência da JPA2 (última versão), e é mantida pela Eclipse Foundation; -
JPA2 • Define diversas anotações e seus devidos comportamentos default:
◦ @Entity ◦ @Id ◦ @{Many,One}To{Many,One} ◦ ... • Configuração do banco de dados via XML. -
3. BeanValidation (JSR303) • API padrão de validação de objetos
para a plataforma Java; • HibernateValidator, Apache BVAL, ... • Permite a escrita de Validators personalizados (CPF, RG, etc...) -
4. DI com o Google Guice (JSR330) • Em vez
de obter as dependencias (FooFactory.get(Bar.class);), você opta por recebê-las de algum lugar. • IoC (Inversion of Control) - Princípio de Hollywood – "não nos chame; nós vamos chamá-lo" -
Guice • @Inject like a boss • Providers para dependências
complexas • DI em servlets • Suporte a AOP • Qualifiers / Named • Escopo (Singleton, Request, Session...) -
Boas práticas sempre, com o Guice também :) • Minimizar
a Mutabilidade; • Injetar somente dependências diretas; • Evitar o uso de dependências estáticas. -
5. Guice-Persist • @Inject EntityManager ◦ ou @Inject Provider<EntityManager> usando
Session-per-request (web apps, maoe) • @Transactional ◦ adeus tratamento de transações replicados por aí (AOP). • Múltiplos PersistenceUnits. -
6. GWT • Aplicações dinâmicas "sem escrever nenhuma linha de
JS e/ou CSS" • Extensível por meio de diversas API's • Interface declarativa • Ótimo desempenho para o usuário • Componentes bonitos e facilmente extensíveis. -
Componentes Insuficientes? • GXT (feio) • Smart GWT (bobo) •
GWT-Bootstrap (melhor do melhor do sul do mundo) ◦ http://gwtbootstrap.github.com -
GWT • Conversão de código Java para Javascript - o
flyweight que é muito lindo lá no servidor, complica sua vida aqui. • Chamadas Assíncronas, sempre (AJAX) - não tente fazer hacks. • Sugere o MVP ao invés do já tradicional e "antigo" MVC. -
GWT • EventBus - observer de eventos. ◦ Yeah, você
pode criar eventos personalizados. ◦ Diminui o muito acoplamento -
8. GWT-Platform • Te obriga a utilizar os melhores padrões
para aplicações GWT - segundo os engenheiros do GWT :) • Muuuuito código que você acabaria escrevendo para facilitar sua vida, já está aqui, provavelmente melhor do que você faria (sem ofenças); • DI com o GIN (GWT INjection); -
Presenters • Vários métodos para capturar eventos do seu ciclo
de vida. • Proxyes - code split ◦ Será injetada somente uma versão "leve" da presenter no DOM, até você realmente precisar dela :) • Nested Presenters FTW -
PlaceManager • Esconde/Revela Presenters "sem mudar de página" • Mas
trata o histórico do browser utilizando um hackzinho maroto (hidden iframe) • Passagem de parâmetros: ◦ http://foo.com/#cliente;id=2 -
DispatchAsync - Command Pattern • Melhor forma de fazer chamadas
assíncronas com GWT-RCP; • Encapsulamento; • Action/Result/ActionHandler; • Boilerplate Generation (clichê) ◦ Gen Action/Result w/ Annotation Processing. • Suporte a Undo; • Proteção contra XSRF (Cross-Site Request Forgery). -
9. Desvantagens • Uso de memória ram em modo Dev;
• Demora para compilar; • Necessidade de uma "DTO Layer" para "desencantar" objetos "encantados" pela CGLib/EclipseLink/etc (Lembra do flyweight?); • Curva de aprendizado. -
10. "Dúvidas" comuns • "Ai carlos não gostei disso de
fazer uma DTO layer..." • "Ouvi falar que o GWT tá sendo descontinuado por causa do Google Dart e da tecnologia XYZ... é verdade?" • "Ninguém usa, não vou usar." • "Ahh, eu uso o MVC diferente..."