Você está na página 1de 106

Apache Wicket

Cristiano Kliemann, 2009

Introduo

Este um curso apenas introdutrio ao Wicket.

No possvel, em to pouco tempo, falar sobre


tudo.
importante continuar com estudos e
experimentos.
Ao final do treinamento, voc ter muito mais
condies de buscar mais informaes por conta
prpria.
Pea algum tempo ou um projeto no crtico ao seu
chefe! :-)

Introduo

Em diversos momentos irei me repetir. A idia


apresentar um pouco de cada coisa e ir
aprofundando em ciclos.
Me interrompam imediatamente:

Quando tiverem dvidas

Se estiver indo muito rpido ou muito devagar

No tenham medo de perguntar: qualquer


informao pode ser importante lembrem-se que
isso muito diferente de Struts

O que Wicket?

Framework web baseado em componentes.

Patrocinado pela Apache: http://wicket.apache.org

Concorrente de JSF

Embora se parea com JSF, parte de uma viso


bem diferente.

Na prtica, as coisas so bem diferentes.

Vrios pontos fortes, com destaque a gerncia de


estado

Pginas so stateful com suporte ao boto voltar do


browser.

Breve Histria

Jun/2005: Verso 1.0 no SourceForge. As


verses at 1.2.x podem ainda ser pegas l
(http://sourceforge.net/projects/wicket/).

Out/2006: aceito na Apache para incubao

Jun/2007: graduou-se top level.

Jan/2008: lanada a verso 1.3.0, a primeira


sob o nome Apache Wicket.
Verso atual: 1.3.x
Em desenvolvimento: verso 1.4.0, que oferece
suporte a Generics de Java 5.

Problemas na web

MVC desacopla a ao, o fluxo da aplicao e


a apresentao.

Resolve bem pouca coisa a mais.

Na prtica, o resto fica muito parecido com o


fluxo requisio-resposta de um servidor HTTP.
HTTP foi criado para servir pginas estticas.

Problemas na web

Sistemas web no so pginas estticas.

So aplicativos (parecidos com aplicativos desktop) que

rodam em servidor;
usam o browser como plataforma de interao com usurio.

Telas normalmente podem ser organizadas em painis,


formulrios, campos, lembrando muito pouco os
documentos estticos da web.
A maioria dos programadores perceber que natural
organizar a tela em componentes. Programadores GWT,
Swing e SWT sabem disso.
Por que a programao web precisa ser diferente?

Problemas na web

Poucos frameworks lidam com estado parece


um problema complexo.

Wicket Primeiras informaes

Orientado a pginas e componentes, a no a


aes

O principal ponto de extenso a pgina por


onde a programao comea quando se quer
implementar uma funcionalidade (com Struts, a
action).

Programar para Wicket tem semelhanas com


programao de GUIs como Swing ou Delphi.

Wicket Primeiras informaes

Wicket um framework stateful guarda


instncias de pginas no servidor.

Mesmo assim, gerencia muito bem a memria


serializa instncias antigas.

Nos exerccios, esqueam Struts!

No pensem em campos hidden, em armazenar ids


em combo-boxes, essas coisas. Inicialmente
pensem em classes e objetos apenas.

Wicket Java Java

O Wicket no tenta reduzir o uso de Java ao


contrrio: usa Java sempre que possvel.
Componentes e pginas Wicket so classes
Java que voc manipula apenas com Java.
Voc constri os componentes e manipula a
hierarquia deles na pgina com construes
Java comuns.

Ex: para instanciar um componente, voc o constri


com new: Link link = new Link(...).

Wicket Java Java

Isso possibilita que voc:

use todos os pontos fortes da linguagem herana,


tipagem esttica, etc;
aproveite as melhores funcionalidades das IDEs
refactoring, ajuda para completar cdigo,
navegao pelo cdigo;
aprenda com mais facilidade o funcionamento do
Wicket e dos sistemas.

Wicket Java Exemplo

public class HomePage extends WebPage {


public HomePage() {
Label label = new Label("mensagem", "Ol, Mundo!");
add(label);
}
}

Wicket HTML

Java muito bom para manipular os


componentes, responder a eventos, etc. Mas
no bom para definir layout.

HTML geralmente melhor.

A parte de apresentao com Wicket feita


com templates HTML.

Wicket HTML

Diferena com outros frameworks: fora o uso


de templates limpos.

No h scriptlets, bindings, expression language,


taglibs, etc.
H apenas marcadores que ligam um elemento
HTML ao o componente Java instanciado pelo
desenvolvedor.
Todo o resto se faz em Java.

HTML - Exemplos

JSP:
<ul>
<c:forEach var="item" items="${requestScope.items}">
<li><c:out value="item.text"/></li>
</c:forEach>
</ul>

Wicket:
<ul wicket:id="lista">
<li wicket:id="item">Aqui vai o item da lista</li>
</ul>

No h ligao com os dados a serem mostrados


nem lgica relacionada ao loop no template Wicket.
Isso feito exclusivamente na parte Java.

Mais informaes sobre templates

Por que o Wicket no permite lgica nos


templates?

Mais informaes sobre templates

Problemas de lgica no template:

Spaghetti code
O compilador pode te ajudar muito pouco muitas
verificaes so feitas apenas em execuo.
As IDEs tambm ajudam pouco (refactoring, por
exemplo). Mesmo que a IDE oferea bom suporte a
JSPs ou templates Facelets, por exemplo,
dificilmente ser to bom quanto para Java.
complicado trabalhar com os designers. Muitas
vezes joga-se fora o HTML que elem mandam.
Muito difcil criar abstraes reusveis.

Referncias Usem sempre!

Site: http://wicket.apache.org
Livro: Wicket in Action: http://www.manning.com/
dashorst/

O mais recente e provavelmente melhor livro sobre


Wicket. Muito bom.

Boa introduo:
http://wicket.apache.org/introduction.html
Wiki, com bastante contedo:

http://cwiki.apache.org/WICKET/
Muito importante:
http://cwiki.apache.org/WICKET/reference-library.html.

Referncias

Exemplos:

http://www.wicketstuff.org/wicket13/ - o melhor
conjunto de exemplos. Rodando e com fontes.
Vejam o link Source code na parte superior direita
das telas.
http://wicket.apache.org/examples.html

Exemplo Ol, Mundo!


Exemplo:

Ambiente:

hello

JDK 5, Maven 2.1.0, Eclipse 3.4

Em todos os exemplos:

Execute mvn eclipse:eclipse no diretrio do exemplo

Importe o projeto no Eclipse

Execute a classe Inicio como Java Application

No browser, acesse http://localhost:8080

Exemplo Um link

O segundo exemplo.

Exemplo: hello-com-link

Arquitetura Wicket Viso Geral


Application
Session

RequestCycleProcessor

SessionStore

RequestTarget

Requisio
Instncias existem
apenas durante
a requisio.

RequestCycle

Request

Uso freqente

Response

Uso eventual

Uso raro

Arquitetura Wicket Viso Geral

Para alguns elementos, h uma subclasse com


o prefixo Web (ex: WebApplication), que a
implementao normalmente usada
No se assustem veremos apenas

Application

RequestCycle

Session

Application

Ponto inicial de implementao de um


aplicativo.
Usa-se estendendo WebApplication e
implementando alguns mtodos

Isso obrigatrio.

H apenas uma instncia por aplicao.

Application

Local onde as configuraes so feitas

Factory para alguns outros elementos Wicket

por cdigo, no mtodo init().

Session, RequestCycle

o primeiro ponto de extenso do Wicket.

Ex: para implementar um Request prprio, preciso


reimplementar o RequestCycle padro e depois ainda
reimplementar o mtodo newRequestCycle de
Application.

RequestCycle

Responsvel por processar uma requisio,


geralmente delegando ao
RequestCycleProcessor.
Guarda Request, Response e o RequestTarget.
Uma instncia por requisio. Depois de
terminada, a instncia descartada.
Bastante utilizado pelos programadores.
RequestCycle rc = RequestCycle.get();
// Mais comum:
WebRequestCycle rc = (WebRequestCycle) RequestCycle.get();

O quarteto Pgina, Componente,


Template, Model

Elementos que faro obrigatoriamente parte do


seu dia-a-dia com Wicket
Pgina
(Java)

Template
(HTML)

Componente
(Label, Form, ...)

Model

Pginas

So classes Java estendidas pelo programador


acompanhadas por um template HTML.
Representam.... ora, pginas...

O equivalente a uma janela em uma interface


grfica desktop.

A primeira pgina exibida ao usurio:

Definida pelo mtodo Application.getHomePage()


Ele retorna a classe da pgina, que ser
instanciada automaticamente pelo Wicket.

Pginas

Uma pgina instanciada pelo Wicket ou pelo


programador.

Aps ser mostrada, normalmente fica em memria


para sempre ( possvel configurar) e seus
mtodos podem redirecionar o cliente para outra
classe ou instncia de pgina.
Isso permite o funcionamento o boto voltar do
browser.
Todo o histrico do usurio fica na sesso.

Pginas

Pginas contm instncias de componentes.


Na realidade, pginas so tambm
componentes (mas isso s um detalhe).

Componentes - introduo

So elementos reusveis (classes) que


representam partes dinmicas de uma pgina

mensagens, formulrios, campos, botes, etc

So classes Java instanciadas e manipuladas


pelo programador.
So extensveis: para modificar um
componente, basta estend-lo.
Conceito muito comum em GUIs: Swing, SWT,
Delphi.

Componentes - introduo

H muitos componentes prontos no Wicket.


Cada componente em uma pgina deve ter um
id String e um elemento corresponde no
template, com o atributo wicket:id igual.
Exemplo no prximo slide.

Componentes - template

Uma pgina:
public class HomePage extends WebPage {
public HomePage() {
Label label = new Label("mensagem", "Ol, Mundo!");
add(label);
}
}

Trecho do template:
<body>
<span wicket:id="mensagem">O "Ol, Mundo" vir aqui.</span>
</body>

J vimos isso no projeto hello. Vamos rever?

Componentes Hierarquia

Componentes podem ter outros componentes


internos.

Um exemplo comum o Form.

Assim, a pgina formada por uma hierarquia


de componentes.

Componentes Hierarquia

Classe (construtor):
public HomePage() {
Form form = new Form("form");
add(form);
form.add(new TextField("nome"));
}

Trecho do template:
<form wicket:id="form">
Nome: <input type="text" wicket:id="nome">
</form>

A hierarquia de componentes na pgina deve ser exatamente a


mesma do HTML.

Componentes Hierarquia

No necessrio criar componentes para todo o HTML

apenas para o que for dinmico

A classe anterior funcionaria com o template abaixo:


<form wicket:id="form">
<div class="campo">
Nome: <input type="text" wicket:id="nome">
</div>
</form>

Veja que no foi preciso incluir um componente para o


elemento <div>.
Exemplo: hierarquia-componentes

Mais sobre componentes e


templates

Qual elemento HTML o correto para um componente?

Lembre-se: nos exemplos, usamos o componente Label com o elemento


<span>.
A resposta :

Depende do componente.
Olhe o Javadoc.

O Wicket normalmente no substitui o tipo de elemento:

Apenas modifica seus atributos e contedo interno.

Mas h de tudo... alguns modificam o elemento.

Tudo est nos Javadocs.

Experimente usar um Label em um <div> ou em um <p>.

Tipos de requisies

No Wicket, h dois tipos de URL:

Bookmarkable

O usurio pode colocar no browser.

http://servidor/app
http://servidor/app/pessoa/incluir
http://servidor/app/pessoa/detalhar/id/21
http://servidor/app/pessoa/detalhar?id=21

No bookmarkable.

Geradas pelo Wicket

http://servidor/app/?wicket:interface=:2:link::ILinkListener::

URLs Bookmarkable

URLs do tipo bookmarkable so previamente configuradas


pelo programador.

Montadas no Application.init() cada uma

Mas h uma sempre configurada: a home page.

Application.getHomePage().

So os pontos de entrada do usurio na aplicao.

Quando recebe uma URL assim:


1.Instancia a pgina
2.Executa seus mtodos de ciclo de vida
3.Devolve ao usurio
4.E mantm a pgina em memria

URLs Bookmarkable

Para serem bookmarkable, pginas devem ter


um ou ambos os construtores:

public MinhaPagina()

public MinhaPagina(PageParameters)

Construtor sem parmetros


Forma de receber parmetros da URL

Se ambos forem implementados, o Wicket


executa o com PageParameters

URLs no Bookmarkable

So geradas pelos componentes do Wicket

Ex: Link

Usurio no digita no browser diretamente

Quando recebe uma requisio assim:


1.Decodifica a URL e a partir disso:
2.Encontra na memria a pgina que contm o componente que
ir respond-la.
3.Encontra na pgina o componente que ir respond-la.
4.Executa os eventos do componente (Link.onClick).
5.Renderiza a pgina.
6.Mantm a pgina em memria.

O ltimo participante do quarteto


Model!

Observaes:

Talvez o conceito mais complicado do Wicket.

Apenas mais complicado que os anteriores.

muito importante compreend-lo bem.

Cada componente precisa de uma fonte de dados:

Um Label precisa de um texto.


Um TextField (<input type=text>) precisa de um local para
ler o seu valor e atualiz-lo quando o usurio submeter o
formulrio.

Model cont.

Model o elemento que faz a ligao de um


componente com a sua fonte de dados.
Model uma classe Java.
Cada instncia de componente tem associado uma
instncia de um Model.
representado pela interface IModel. Vamos v-la no
Eclipse?

Model cont.

Ao criar nosso Label no exemplo anterior,


usamos um atalho.

Label label = new Label("mensagem", "Ol, Mundo!");


// um atalho para
Label label = new Label("mensagem", new Model("Ol, Mundo!"));

Model cont.

A classe Model uma implementao simples


de IModel. Pouco mais que:
public class Model implements IModel {
private Serializable object;
public Model(final Serializable object) {
setObject(object);
}
public Object getObject() { return object; }
public void setObject(final Serializable object) {
this.object = object;
}
public void detach() { }
}

Models cont.

Models do grande flexibilidade aos


programadores.
Exemplos:

models-exemplo1

models-exemplo2

Models estticos e dinmicos

Reforando:

A classe Model um modelo esttico, pois o valor est dentro


dele muda apenas pelo programador ou pelo Wicket.
PropertyModel um modelo dinmico.

H vrias implementaes de IModel. Algumas:

Model e PropertyModel

CompoundPropertyModel

LoadableDetachableModel

StringResourceModel e ResourceModel

crie a sua...

Formulrios

Formulrios so simples composies de


componentes Wicket

Componente principal: Form

Componentes para os campos. Ex:

TextField, RequiredTextField: <input type=text>


DropDownChoice: <select>
ListChoice, ListMultilpeChoice: <select size=x>
RadioChoice, RadioGroup, Radio: <input type=radio>
CheckBox, CheckGroup, Check: <input type=checkbox>
Button, ImageButton
outros...

Formulrios

Melhores referncias:

Javadocs
Muito bom: http://www.wicket-library.com/wicketexamples/forminput/

Exemplos:

formularios-1

formularios-2

CompoundPropertyModel

Repetir PropertyModel para cada campo do


formulrio trabalhoso e prejudica a
legibilidade/manutenibilidade.

CompoundPropertyModel simplifica isso.

Exemplo: formularios-3

Processamento de formulrios
Incio

Leitura da
requisio
falhou?

Guarda a entrada
em String
temporariamente.

falhou?

onError

onSubmit

Converso
String->Model
(no atualiza model ainda)

Verificao de
required

falhou?
falhou?

Update dos
modelos
(model.setObject)

Validao

Conversores

Problema:

HTTP e HTML so baseados em String, mas...

A aplicao usa outros tipos: Date, int, BigDecimal...

A soluo do Wicket: Converters


Classes que convertem String de e para
qualquer tipo.

Implementaes de IConverter.

Converters

H uma implementao por tipo:

normalmente automtico.

O Wicket escolhe o converter a partir do que o Model retorna.

Conversores usam Locale do browser (fica na sesso)

DateConverter, BigDecimalConverter, BooleanConverter...

Se no existir, usa do servidor.

Exemplo: converters-1

Converters escolhendo um

E quando os conversores do Wicket no so


suficientes?

possvel trocar e incluir conversores

Duas formas:

Geral: troca ou inclui um converter associado a um


tipo para todo o sistema.
Por componente

Converters escolhendo um

Geral:

Estender ConverterLocator ou apenas instanci-lo e


configur-lo

Por componente

Sobrescrever Application.newConverterLocator()

Estender mtodo getConverter(Class) do componente.

Exemplo: converters-2

Resource Bundles e Wicket parte


1

O Wicket oferece boa flexibilidade para


internacionalizao.
Uma das formas por arquivos de
propriedades.
H vrios escopos de arquivos de
propriedades.

Resource Bundles e Wicket parte


1

Quando busca uma chave, faz na seguinte ordem:


1.<pagina>.properties
2.<superpaginas>.properties ...
3.<aplicacao>.properties
4.<superclasses da aplicacao>.properties

Exemplo:
1.HomePage.properties
2.BasePage.properties
3.HelloApplication.properties
4.BaseApplication.properties

Resource Bundles e Wicket parte


1

Arquivos de propriedades devem estar juntos


das classes a que correspondem.
H muito mais sobre internacionalizao
veremos mais ao final do curso.

Erros de converso mensagens

Como alterar as mensagens de erros de


converso?
Arquivos de propriedades

Erros de converso mensagens

Chaves trs formas:


Forma

Exemplo

1 IConverter.<tipo>

IConverter.Date

2 <id>.IConverter.<tipo>

data.IConverter.Date

3 <id composto>.IConverter.<tipo>

form.data.IConverter.Date

Pode ser na pgina ou na aplicao.

Forma 1 mais comum na aplicao

Formas 2 e 3 mais comuns na pgina

Exemplo: converters-properties-1

Mensagens e o nome do campo?

Mensagens podem ter nome do campo atravs de


substituio de expresses.

IConverter.Date=Campo ${label} deve ser uma data


vlida.

Wicket no sabe automaticamente.

Duas formas:

Arquivo de propriedades

Mtodo setLabel() do componente.

Mensagens e o nome do campo?

Arquivo de propriedades.

Chave:

<id completo>=Nome do campo


form.campoData=Data

Use no arquivo de propriedades da pgina apenas

Exemplo: labels-1

Mtodo setLabel

componente.setLabel(new Model(Nome do campo));

Exemplo: labels-2

Mensagens e o nome do campo?

Como escolher a estratgia?

Tem internacionalizao?

Se positivo: properties

Se negativo: preferncia setLabel.

Validao

O Wicket tem um bom suporte a validao.

Basta incluir em cdigo:

componente.add(IValidator)

Possvel adicionar vrios validadores a um componente.

Vrios validadores prontos.

Mas... comum implementar outros.

Validao

Validadores e factories prontos:

StringValidator.exactLength

StringValidator.maximumLength

...

PatternValidator.xxxxx

NumberValidator.xxxxx

EmailAddressValidator

DateValidator

UrlValidator

Validao

Uma validao especial: Required

Habilitada por componente.setRequired(boolean)

Para TextField, h o RequiredTextField

Exemplo: validacao-1

Criando um validador

Basta implementar IValidator.


Tem apenas um mtodo: void
validate(IValidatable validatable)
O melhor sobrescrever a classe
AbstractValidator.

Mtodo onValidate.

Validao - mensagens

Arquivos de propriedades

Chaves:

Dependem o mtodo resourceKey() do validador.

Para os built-in, veja a tabela:

Validao - mensagens
Validador

Forma para instanciar

Chave

NumberValidator (enclosing class)


RangeValidator

NumberValidator.range()

NumberValidator.range

MinimumValidator

NumberValidator.minimum()

NumberValidator.minimum

...
StringValidator (enclosing class)
ExactLengthValidator

StringValidator.exactLength()

StringValidator.exactLength

...
Outros (sem enclosing class)
PatternValidator

new PatternValidator()

PatternValidator

componente.setRequired
RequiredTextField

Required

...
Especiais
Required

Validao - mensagens

Para os validadores personalizados, a chave


default o nome da classe.
A chave no arquivo de propriedades pode ser:

Direta. Ex:

NumberValidator.range=O valor deve estar entre $


{minimum} e ${maximum}
PatternValidator

Por componente. Ex:

form.nome.NumberValidator.range=O valor de X deve...

Validao - mensagens

A maior parte tem os seguintes parmetros:

${label}: label do componente

${name}: nome do componente

${input}: valor

Alguns tem:

${maximum}, ${minimum}, etc

Veja os outros parmetros no Javadoc dos


validadores ou no mtodo variablesMap() do
validador.
Exemplo: validacao-2

Cancelando processamento padro

Algumas vezes necessrio fazer submit sem


converter ou validar tudo. Ex:

Uma combo que usada para preencher as opes de


outra.
Telas com abas

Mtodo setDefaultFormProcessing(boolean)

Nos componentes:

Button

SubmitLink

Sem exemplos: fica como referncia

Mensagens rpidas

possvel incluir mensagens rpidas diretamente na pgina.

Mtodos de Component:

fatal, error, info, warn, debug

Vo para o FeedbackPanel como as outras mensagens.

Mais usados:

info: Para mensagens de sucesso.

error: Erros.

So eliminadas na prxima renderizao da pgina.

Exemplo: flash-messages

Repetidores

Wicket oferece alguns componentes que repetem contedo do


template.
Os mais importantes:

ListView

DataView

RepeatingView

Loop

ListView

Muito usado

Relativamente simples

Limitao: permite apenas List

Exemplo: listview-1

Repetidores

Loop

Repete por um nmero de vezes predeterminado

No h fonte de dados, apenas um nmero

Como se fosse um for

RepeatingView:

Repete o nmero de vezes que houver filhos

Os filhos so adicionados com add simples

Ver Javadoc

DataView: veremos mais adiante

LoadableDetachableModel
problema

Wicket stateful
Guarda todas as pginas em memria e em
disco
Mas e as referncias contidas nelas?

Guarda tambm

LoadableDetachableModel
problema

Referncias: use-as com cuidado.

No guarde referncias a singletons (DAOs e


outros objetos que forneam servios)
A no ser que exista um mecanismo para evitar a
serializao delas
Mas e as que so usadas pelo Wicket nos models?

Entidades de negcio
Resultados de pesquisa

LoadableDetachableModel ciclo
de requisio

O Wicket tem um mecanismo para desatracar referncias

Ciclo de requisio:
1.Recebe requisio
2.Decodifica a requisio
3.Encontra a pgina e o componente que iro responder
4.Executa os eventos
5.Renderiza a pgina
6.Excuta o mtodo detach() de:
1. Todos os componentes das pginas envolvidas na requisio
2. Todos os Models das pginas
3. Sesso

7.Mantm as pginas em memria e/ou em disco

LoadableDetachableModel ciclo
de requisio

O detach um mtodo normal.

Voc pode sobrescrev-lo.

Serve para se desfazer de tudo o que no


mais necessrio ou que pode ser obtido
novamente depois:

Principalmente referncias

LoadableDetachableModel um
caso comum

Um caso comum:

Essa lista renderizada por um ListView

A lista ento acaba ficando dentro do ListView

H uma pgina de consulta, que mostra uma lista


de acordo com alguns critrios.

Mas... no precisaria, pois a consulta deve ser


refeita no caso de refresh ou novo submit

Veja o exemplo listview-2

Um caso muito semelhante

LoadableDetachableModel
soluo

E se o mtodo getObject do model buscasse no banco de


dados a lista e depois, quando o Wicket no precisasse
mais, a descartasse?
isso que LoadableDetachableModel faz

Internamente, descarta a referncia no mtodo detach

Exemplos: loadabledetachablemodel-1 e 2

Outro motivo:

Garantir a sincronia com o banco de dados

LoadableDetachableModel e form

Uma tela simples de consulta:

Exemplo: loadabledetachablemodel-3

DataView

Poderoso para tabelas de dados

Permite ordenao e paginao

Um pouco mais complicado...

Exemplos:

dataview-1: simples, sem paginao e ordenao

dataview-2: com paginao

dataview-3: com paginao e ordenao

Parece muito complicado no incio

Voc vai se acostumar

Crie extenses para te ajudar

Herana de pginas

O Wicket permite herana de pginas.

Uso de tags especiais nos templates:

<wicket:extend>

<wicket:child>

Exemplo: heranca-1

Painis

At agora estendemos componentes simples

Como criar componentes reusveis complexos, com


vrios componentes internos?
Painis:

Link, Form, ...

Componentes com template que podem ser includos em


qualquer pgina.

Forma de construo muito parecida com a de pginas.

Diferena: uso de <wicket:panel>

Exemplo: panel-1

Mais tags Wicket

J vimos que o Wicket tem algumas tags especiais para


templates:

<wicket:panel>, <wicket:child> e <wicket:extend>

H mais: http://cwiki.apache.org/WICKET/wickets-xhtml-tags.html

Veremos algumas delas

<wicket:remove>

O Wicket ir remover o contedo que estiver entre as tags.

Usado para facilitar integrao com web designer OU

Permitir renderizao do template direto no browser.

Mais tags Wicket

<wicket:head>

Forma de uma subclasse de pgina ou um painel


contribuir para o <head> da pgina final
Muito til para importar Javascripts e CSSs

<wicket:enclosure>

Faz o trecho interno ser includo no <head> da pgina

Esconde um trecho de HTML quando um componente


interno estiver invisvel
Poupa um WebMarkupContainer

Exemplo: tags-1

Escopos de aplicao e sesso

Como guardar informaes com escopo diferente de pgina?

Escopo de aplicao:

Simples: no seu Application

Escopo de sesso:

O Wicket cria um objeto derivado de WebSession por sesso de usurio

Criado por WebApplication.newSession.

Basta estend-lo e retornar sua prpria subclasse de WebSession.

Vantagens sobre Sesso servlet:

Propriedades bem definidas

Tipos!

Escopos de aplicao e sesso

Sessions podem ser temporrias

Se o Wicket perceber que no h pginas stateful,


pode descartar a sesso recm criada.
Para no fechar, use o mtodo Session.bind().

Exemplo: session-1

Thread safety

Pginas so thread-safe

Nunca h mais de uma requisio sendo tratada ao mesmo tempo por


uma mesma instncia

Application e Session no so!

Cuidados:

Use mtodos synchronized para getters e setters de aplicao e


sesso quando possam ser acessados dentro de uma requisio.

Cuidado especial com colees.

Isso no exclusivo do Wicket: com servets tambm h o problema!


Voc toma esse cuidado hoje?
Evite manter referncias a componentes em outros locais que no as
pginas onde esto
No compartilhe componentes entre pginas

Passando parmetros para uma


pgina

Como passar parmetros para uma pgina?

Ex: uma pgina de detalhamento de entidade


precisa da instncia ou identificao da entidade

Duas formas:

No bookmarkable

Bookmarkable

Passando parmetros para uma


pgina

No bookmarkable:

Se:

Pginas em Wicket so classes Java


Pginas podem ser instanciadas diretamente pelo seu
construtor
Construtores podem ter parmetros
Classes podem ainda ter outros mtodos que alteram seu
estado

Ento...:

PaginaDetalhes detalhes = new PaginaDetalhes(entidade);


setResponsePage(detalhes);

Passando parmetros para uma


pgina

Bookmarkable:

Relembrando:

Pginas bookmarkable podem ser acessadas


diretamente pela URL
Devem ser previamente montadas no init do Application

Pginas bookmarkable aceitam parmetros

Basta implementar um construtor com a assinatura:

public MinhaPagina(PageParameters)

Passando parmetros para uma


pgina

Pginas podem ser bookmarkable e no


bookmarkable ao mesmo tempo.

Depende do construtor usado.

Exemplo: pagina-com-parametros

Behaviors

Algumas vezes precisamos mudar atributos de


um elemento HTML dinamicamente

Ex: style em uma tabela de dados para


implementar zebra

Podemos estender o componente e seu


mtodo onComponentTag
Ou podemos usar Behaviors!

Behaviors

So associados aos componentes atravs do mtodo


Component.add(IBehavior).
Componentes encadeiam alguns dos seus mtodos
de ciclo de vida aos behaviors associados a eles.
Como o nome diz:

Behavior interessante:

Acrescentam um comportamento extra ao componente


AtributeModifier

Muito usado com Ajax no Wicket.

Wicket e Ajax

Wicket tem suporte nativo a Ajax

Vrias formas de usar

H componentes para uso especfico com Ajax


H behaviors que plugam Ajax em componentes
regulares

Assunto extenso...

J esto capacitados a procurar (e a perguntar)

Resource Bundles e Wicket parte


2

Qualquer componente pode ter seu arquivo properties

S precisa ter o mesmo nome mas com extenso properties

Ordem de busca:
1.Properties da pgina que contm o componente
2.Properties das superclasses da pgina
3.Properties do componente.
4.Properties das superclasses do componente.
5.Properties da aplicao.
6.Properties das superclasses da aplicao.

Resource Bundles e Wicket parte


2

Formas de se obter uma mensagem:

Mtodo getString

Localizer

componente.getLocalizer().getString(...)
Oferece mais opes que componente.getString().
O Localizer nico por aplicativo (mesmo que seja obtido pelo
componente).

Lembre-se:

componente.getString(chave)

Page tambm um componente.

Tudo isso vale para mensagens de validao e erros de


converso.

Modelos internacionais

Veremos mais dois models:

ResourceModel

StringResourceModel

Apenas leitura

Pegam mensagens de resource bundles

ResourceModel

simples, sem substituies, expresses

StringResourceModel:

mais features

veja Javadoc.

Exemplo: resource-models

Internacionalizao direto no
template

Tag especial:

<wicket:message>
Substitui o trecho interno pelo contedo obtido a
partir da chave

<span>
<wicket:message key="chave">Texto</wicket:message>
</span>
texto=Novo Texto
<span>
Novo Texto
</span>

Internacionalizao direto no
template

Atributo wicket:message

Substitui atributos pelo contedo obtido atravs da


chave

<input type="submit" wicket:message="value:pagina.busca"/>


pagina.busca=Buscar
<input type="submit" value="Buscar" />

Use vrgula para incluir vrios atributos:


<img src="img.gif" wicket:message=
"alt:pagina.img.alt,title=pagina.img.titulo"/>

Templates internacionais

O Wicket tambm pode escolher templates de


acordo com o Locale do usurio.
O Wicket busca os templates como busca
arquivos de propriedades.
Ex: se o Locale for pt_BR:
1.HomePage_pt_BR.html
2.HomePage_pt.html
3.HomePage.html

Mais referncias

Viso (filosofia):
http://wicket.apache.org/vision.html
Livro: Enjoying Web Development with Wicket:
http://www.agileskills2.org/EWDW/

Wicket 1.3

Livro: Pro Wicket:


http://www.apress.com/book/view/1590597222

Wicket 1.2 (pr-Apache)

Mais referncias alguns artigos

A Year of Wicket

Veja alguns screenshots do produto aqui.

Tapestry and Wicket compared

No novo, mas comenta sobre o uso do Wicket em um


produto da IBM.

Artigo na IBM. No deixe de ler a seo Conclusion.

Seam / JSF vs Wicket: performance comparison

Você também pode gostar