You are on page 1of 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:

hello

Ambiente:

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

Response

Uso freqente

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

por cdigo, no mtodo init().

Factory para alguns outros elementos Wicket

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. Definida pelo mtodo Application.getHomePage() Ele retorna a classe da pgina, que ser instanciada automaticamente pelo Wicket.

A primeira pgina exibida ao usurio:


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 Application.getHomePage().

Mas h uma sempre configurada: a home page.

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()

Construtor sem parmetros Forma de receber parmetros da URL

public MinhaPagina(PageParameters)

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. Verificao de required falhou? falhou? falhou? Converso String->Model (no atualiza model ainda)

onError

onSubmit

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:

DateConverter, BigDecimalConverter, BooleanConverter...

normalmente automtico.

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

Conversores usam Locale do browser (fica na sesso)

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:

Sobrescrever Application.newConverterLocator() Estender ConverterLocator ou apenas instanci-lo e configur-lo

Por componente

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
1 IConverter.<tipo> 2 <id>.IConverter.<tipo> 3 <id composto>.IConverter.<tipo>

Exemplo
IConverter.Date data.IConverter.Date 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 RangeValidator MinimumValidator ... StringValidator (enclosing class) ExactLengthValidator ... Outros (sem enclosing class) PatternValidator ... Especiais Required componente.setRequired RequiredTextField Required new PatternValidator() PatternValidator StringValidator.exactLength() StringValidator.exactLength Forma para instanciar NumberValidator.range() NumberValidator.minimum() Chave NumberValidator.range NumberValidator.minimum NumberValidator (enclosing class)

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 form.nome.NumberValidator.range=O valor de X deve...

Por componente. Ex:

Validao - mensagens

A maior parte tem os seguintes parmetros:


${label}: label do componente ${name}: nome do componente ${input}: valor ${maximum}, ${minimum}, etc

Alguns tem:

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 Muito usado Relativamente simples Limitao: permite apenas List Exemplo: listview-1

ListView

Repetidores

Loop

Repete por um nmero de vezes predeterminado No h fonte de dados, apenas um nmero Como se fosse um for Repete o nmero de vezes que houver filhos Os filhos so adicionados com add simples Ver Javadoc

RepeatingView:

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:

H uma pgina de consulta, que mostra uma lista de acordo com alguns critrios. Essa lista renderizada por um ListView A lista ento acaba ficando dentro do ListView Mas... no precisaria, pois a consulta deve ser refeita no caso de refresh ou novo submit Um caso muito semelhante

Veja o exemplo listview-2

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

Link, Form, ...

Como criar componentes reusveis complexos, com vrios componentes internos? Painis:

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>

Faz o trecho interno ser includo no <head> da pgina Forma de uma subclasse de pgina ou um painel contribuir para o <head> da pgina final Muito til para importar Javascripts e CSSs Esconde um trecho de HTML quando um componente interno estiver invisvel Poupa um WebMarkupContainer

<wicket:enclosure>

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 PaginaDetalhes detalhes = new PaginaDetalhes(entidade); setResponsePage(detalhes);

Ento...:

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:

Acrescentam um comportamento extra ao componente AtributeModifier

Behavior interessante:

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 J esto capacitados a procurar (e a perguntar)

Assunto extenso...

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

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

Localizer

Lembre-se:

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 mais features veja Javadoc.

StringResourceModel:

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

No novo, mas comenta sobre o uso do Wicket em um produto da IBM. Veja alguns screenshots do produto aqui.

Tapestry and Wicket compared

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

Seam / JSF vs Wicket: performance comparison

You might also like