Professional Documents
Culture Documents
Introduo
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.
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
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
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
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.
No pensem em campos hidden, em armazenar ids em combo-boxes, essas coisas. Inicialmente pensem em classes e objetos apenas.
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(...).
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.
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.
Wicket HTML
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.
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
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
hello
Ambiente:
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
SessionStore
RequestTarget
Request
Response
Uso freqente
Uso eventual
Uso raro
Para alguns elementos, h uma subclasse com o prefixo Web (ex: WebApplication), que a implementao normalmente usada No se assustem veremos apenas
Application
Ponto inicial de implementao de um aplicativo. Usa-se estendendo WebApplication e implementando alguns mtodos
Isso obrigatrio.
Application
Session, RequestCycle
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();
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.
Pginas
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 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>
Componentes Hierarquia
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>
Componentes Hierarquia
Veja que no foi preciso incluir um componente para o elemento <div>. Exemplo: hierarquia-componentes
Lembre-se: nos exemplos, usamos o componente Label com o elemento <span>. A resposta :
Apenas modifica seus atributos e contedo interno. Mas h de tudo... alguns modificam o elemento. Tudo est nos Javadocs.
Tipos de requisies
Bookmarkable
No bookmarkable.
http://servidor/app/?wicket:interface=:2:link::ILinkListener::
URLs Bookmarkable
URLs Bookmarkable
public MinhaPagina()
public MinhaPagina(PageParameters)
URLs no Bookmarkable
Ex: Link
Observaes:
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.
Label label = new Label("mensagem", "Ol, Mundo!"); // um atalho para Label label = new Label("mensagem", new Model("Ol, Mundo!"));
Model cont.
Models cont.
models-exemplo1 models-exemplo2
Reforando:
A classe Model um modelo esttico, pois o valor est dentro dele muda apenas pelo programador ou pelo Wicket. PropertyModel um modelo dinmico.
Formulrios
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:
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
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
normalmente automtico.
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:
Por componente
Exemplo: converters-2
O Wicket oferece boa flexibilidade para internacionalizao. Uma das formas por arquivos de propriedades. H vrios escopos de arquivos de propriedades.
Exemplo:
1.HomePage.properties 2.BasePage.properties 3.HelloApplication.properties 4.BaseApplication.properties
Arquivos de propriedades devem estar juntos das classes a que correspondem. H muito mais sobre internacionalizao veremos mais ao final do curso.
Exemplo
IConverter.Date data.IConverter.Date form.data.IConverter.Date
Exemplo: converters-properties-1
Arquivo de propriedades.
Chave:
Mtodo setLabel
Validao
componente.add(IValidator)
Validao
Validao
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
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...
Validao - mensagens
${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
Algumas vezes necessrio fazer submit sem converter ou validar tudo. Ex:
Uma combo que usada para preencher as opes de outra. Telas com abas
Button SubmitLink
Mensagens rpidas
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:
LoadableDetachableModel problema
Wicket stateful Guarda todas as pginas em memria e em disco Mas e as referncias contidas nelas?
Guarda tambm
LoadableDetachableModel problema
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?
Serve para se desfazer de tudo o que no mais necessrio ou que pode ser obtido novamente depois:
Principalmente referncias
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
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
LoadableDetachableModel e form
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
<wicket:extend> <wicket:child>
Exemplo: heranca-1
Painis
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
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.
<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
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.
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
Use mtodos synchronized para getters e setters de aplicao e sesso quando possam ser acessados dentro de uma requisio.
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
Duas formas:
No bookmarkable Bookmarkable
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...:
Bookmarkable:
Relembrando:
Pginas bookmarkable podem ser acessadas diretamente pela URL Devem ser previamente montadas no init do Application
public MinhaPagina(PageParameters)
Exemplo: pagina-com-parametros
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:
Wicket e Ajax
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...
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.
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:
Modelos internacionais
ResourceModel StringResourceModel
StringResourceModel:
Exemplo: resource-models
Tag especial:
<span> <wicket:message key="chave">Texto</wicket:message> </span> texto=Novo Texto <span> Novo Texto </span>
Atributo wicket:message
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
A Year of Wicket
No novo, mas comenta sobre o uso do Wicket em um produto da IBM. Veja alguns screenshots do produto aqui.