Apache WicketApache WicketProdutividade na WebProdutividade na Web
Palestrante
Consultor pela Summa-Tech
Desenvolvedor open source
Ganhador do prêmio Glassfish Awards 2008
Já trabalhou como arquiteto, consultor, programador em projetos de telecomunicação, financeiro e bancário, automação, internet e comércio eletrônico.
Palestrante em diversos eventos no Brasil e internacionais desde 2001
Agenda
Motivação para mudar
O que é o Apache Wicket?
Conceitos e componentes
Ajax
Um pouco de diversão
Problemas
XML demais
Poluição de taglibs
Javascripts não compatíveis
Não componentizado
Complexo
Limitações
O simples existe
Wicket
http://wicket.apache.org
Wicket
Framework Web
Orientado a Componentes
Open Source
Puro Java e XHTML
Simples
XHTML e Java
new Label(“msg”, “Mensagem da web”);
<span wicket:id=”msg”>mensagem</span>
<span>Mensagem da web</span>
XHTML
JAVA
Renderizado no cliente
Você irá encontrar ...
Puro XHTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3c.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org" >
Você irá encontrar ...
Programação com POJOs
Você irá encontrar ...
Reusabilidade
● Componentes● Gerenciamento do ciclo de vida
● Fragmentos
Você irá encontrar ...
Escalabilidade
● Suporte a replicação de sessão● Baixo estado da sessão
Você irá encontrar ...
Testabilidade
@Test public void navigateToSecondPage() {
WicketTester tester = new WicketTester();
tester.startPage(new FirstPage());
tester.clickLink("link");
tester.assertRenderedPage(SecondPage.class);
}
Você irá encontrar ...
Extensibilidade
● API do framework ● Comportamento● Apresentação
Você irá encontrar ...
Configuração em Java
● Suporte em qualquer IDE● Simplicidade● Completamento de código
Você irá encontrar ...
Debug facilitado
● Ajax Debug Window● Apenas código Java (sem jsp, velocity,etc.)
Você irá encontrar ...
Internacionalização
Você irá encontrar ...
Herança de páginas HTML
Você irá encontrar ...
Controle do botão de voltar
● Estado da sessão● Formulários POST
Você irá encontrar ...
Persistência de estado
● Transparente● Suporte a POJO●
Você irá encontrar ...
Cache
Você irá encontrar ...
Componentes prontos
● Ajax, Paginação, Templates, Abas● Validação, Árvores, Tabelas, Calendário● Bookmarks, Bordas, Fragmentos
Você irá encontrar ...
Validações
● Lado servidor e Ajax● Perda de foco
Você irá encontrar ...
Paginação
● No cliente e no servidor● Template de paginação
E mais
Core (principal módulo)
extensions (extensões Ajax etc)
IoC (spring / guice)
date/time
velocity (templating)
auth-roles (autenticaçao e permissão)
stuff (contribuições da comunidade)
Maven
$ mvn archetype:generate
...
37: internal -> wicket-archetype-quickstart
(A simple Apache Wicket project)
...
Choose a number: 37
Conceitos
Aplicação
Sessão
RequestCycle
Componentes
Models
Behaviors
Aplicação
Configuração
Ponto de entrada (home page)
Binding
Aplicação
Definida no web.xml <filter> <filter-name>wicket.demo</filter-name> <filter-class> org.apache.wicket.protocol.http.WicketFilter </filter-class> <init-param> <param-name>applicationClassName</param-name> <param-value> teste.WicketApplication </param-value> </init-param> </filter>
<filter-mapping> <filter-name>wicket.demo</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Direto ao ponto
<html><head> <title>Wicket</title></head><body>
<span wicket:id="msg">Mensagem</span>
</body></html>
Direto ao ponto
public class HomePage extends WebPage { public HomePage() { add(new Label("msg", "Texto Renderizado!")); }}
public class WicketApplication extends WebApplication { public Class<HomePage> getHomePage() { return HomePage.class; }}
XHTML e Java
new Label(“msg”, “Texto Renderizado!”);
<span wicket:id=”msg”>mensagem</span>
<span>Texto Renderizado!</span>
Renderizado no cliente
Sessão
Abstrai a HttpSession
Armazena informações específicas
Sessão
public class LojaSession extends WebSession { private Sacola sacola; public Sacola getSacola() {...} public void setSacola(Sacola s) {...}}
Sacola sacola = sessao.getSacola();sacola.add(produto, quantidade);
RequestCycle
Encapsula uma requisição
Libera os recursos no final
Útil para aplicar o pattern OpenSessionInViewFilter
Tipos
Stateless
Statefull
RequestCycle
1. Cria o objeto de requisição
2. Decodifica a requisição
3. Identifica o alvo (componente, página ...)
4. Processa o evento (onClick, onSubmit ...)
5. Responde (página, componente, arquivo ...)
6. Limpa tudo
Componentes
Componentes
Encapsulam a manipulação do HTML
Respondem a eventos
onClick, onSubmit
Sabem onde e como se renderizarem
Gerenciamento completo do ciclo de vida
Componentes
Componentes de composição
Painéis
Bordas
Fragmentos
HerançaEspecialize componentes
Reutilize
Componentes
Super classe:org.apache.wicket.Component
Label
TextField
RequiredTextField
MultiLineLabel
PasswordTextField
Image
Link
Tree
BookmarkablePageLink
ListView
PageableListView
Loop
PagingNavigator
ImageMap
Button
Form
Ajax...
DatePicker
Componentes
Tudo é componente wicket:id
Tags associadas
Podem ser aninhadosRespeitando a hierarquia
Tags comuns<a href>, <input type>, <form>, <div>, <span>, etc
Componentes
Arquivos HTML
Juntos à classe correspondente
teste.wicket.Paginasrc/teste/wicket/Pagina.html
src/teste/wicket/Pagina.java
Behaviours
Behaviours
Plugins para componentes
Modificam o HTML
Behaviours
Modifica atributos da marcação dos componentes
onClick, onBlur, alt,
Plugins para componentes
on
Modificam o HTML
Behaviours
Modifica atributos do HTML dos componentesalt, style, class, font ...
Adiciona eventos javascriptonClick, onBlur, onKeyPressed ...
Adiciona tratamento Ajax
cpnt.setOutputMarkupId(true);
cpnt.add(
new AjaxSelfUpdateBehaviour(Duration.seconds(5)));
Models
Models
Binding entre dados e componentes
Models
HTML<input type=”text” wicket:id=”txId” />
Java new TextField(“txId”, new PropertyModel(usuario, “nome”));
TextField(“txId”, model)
<<Usuario>>
+nome : String+cidade : String
PropertyModel
Models
Model simplesnew Label(“id”, “valor qualquer”);
Por propriedadenew Label(“id”, new PropertyModel(usuario, “nome”));
Models
Pelo wicked:id dos componentesform = new Form(“cadastro”);
form.setModel(new CompoundPropertyModel(usuario));
form.add(new RequiredTextField(“nome”));
Mais poder – nested propertiesform.add(new TextField(“endereco.rua”));
Um componente novo
Confirmação
public abstract class ConfirmLink extends Link { public ConfirmLink(String id, String message) { super(id);
add(new AbstractBehaviour() { public void onComponentTag( Component c, ComponentTag tag) { tag.put(“onClick”, "return confirm('"+message+"');"); } }); }}
Confirmação
public abstract class DeleteLink extends ConfirmLink { public DeleteLink(String id) { super(id, "Excluir registro?"); }}
HTML<a href=”#” wicket:id=”del”>Apagar</a>
Javaadd(new DeleteLink(“del”) { public void onClick() { E dataObj = (E) modelObject.getObject(); getService().delete(dataObj); }});
Confirmação
<a href=”/demo/?wicket_url” onClick=”return confirm('Excluir registro?');”> Apagar</a>
AJAX
Como funciona no Wicket?
Ajax
Programador Java, gosta de debugar/programar em
JavaScript ?
Ajax
Use java para programar JavaScript !
Ajax
Suporte nativo
Troca de mensagem entre navegador/servidor
Pintura parcial de elementos da tela
Inclusão dinâmica de JS/CSS enviado pelo servidor
Console para debug (desenvolvimento)
Suporte genérico a outras bibliotecas JS
Componentes prontos para usar
Ajax
Componentes Prontos
Link, Barra de Progresso, Upload,
Dialog Modal
Abas,
Element Polling – Fazer um elemento, se auto atualizar pelo servidor
Submit (formulários)
Checkbox (onchange)
Paginação de dados em tabela (com ou sem lazy loading)
Ajax
Componentes Prontos
EditableLabel – editar porções de texto (textarea, checkbox)
AutoComplete TextField
LazyLoad Panel – quando existem painéis com muitas informações
AjaxButton com indicador
Facilidade em adicionar validações Ajax, em formulário convencional.
Ajax
Com uma linha de código, adicione validação Ajax, para o formulário inteiro
AjaxFormValidatingBehavior.
addToAllFormComponents(form, "onkeyup",
Duration.ONE_SECOND);
Ajax
Label counterLabel = new Label("counter");
add(counterLabel);
counterLabel.setOutputMarkupId(true);
add(new AjaxLink("counterLabelLink") {
public void onClick(AjaxRequestTarget target){
counter++;
target.addComponent(counterLabel);
}
}
Ajax
DEMO
Ajax
Considerações ao comparar com outros frameworks
Diferença na concepção do framework
Action x Componentes
Wicket: self contained
Inovação x Continuísmo
Tooling – suporte a IDE
Wicket: Java + XHTML
Outros: Vários XMLs, taglibs/freemarker/velocity,
Concluindo ... (finalmente)
Fácil construção e customização de componentes
Desenvolvimento rápido
Baixa curva de aprendizadoSó Java e HTML! :-)
Atualizado freqüentemente
Popular
Forte comunidade
Muito Obrigado !
http://www.claudius.com.br
http://wicket.apache.org