SlideShare uma empresa Scribd logo
1 de 69
Apache Wicket
Desenvolvimento Web orientado a componentes




                Felipe Fedel Pinto
Felipe Fedel Pinto
                             (Amaral)



• UNESP Rio Claro - 2007

• Ampliato - Tecnologia da
  Informação e Consultoria

• Trabalha com Wicket desde
  2010

• Contribui para projetos
  externos de Wicket
Sumário
• O que é Wicket?
• Conceitos
• Novidades
• Mais informações
• Perguntas
• Contato
O que é wicket?
Wicket W. Warrick
O que é wicket?
Um framework Web open source
orientado a componentes que usa
apenas Java e HTML




                         (Sem XML)
Frameworks
      Echo           Cocoon       Millstone        OXF
     Struts          SOFIA        Tapestry       WebWork
      RIFE         Spring MVC      Canyamo       Maverick
    JPublish          JATO         Folium         Jucas
     Verge           Niggle        Bishop       Barracuda
Action Framework     Shocks      TeaServlet       wingS
    Expresso         Bento      jStatemachine     jZonic
   OpenEmcee        Turbine         Scope        Warfare
      JWAA           Jaffa        Jacquard        Macaw
     Smile          MyFaces         Chiba        JBanana
    Jeenius          JWarp          Genie         Melati
    Dovetail        Cameleon      JFormular       Xoplon
     Japple          Helma        Dinamica      WebOnSwing
     Nacho         Cassandra       Baritus       Stripes
     Click            GWT
Motivações

• Sistemas complexos
• Desenvolvimento ágil e fácil
• Escalabilidade
• Reusabilidade
• Sem HTMLs mutantes
JSP


         request (GET /login.jsp)

Client                                            login.jsp
                response
                                    <html>
                                        <head>
                                            ...
                                        </head>
                                        <body>
                                            ...
                                        </body>
                                    </html>
MVC
         request (GET /login.do)

Client                                               Framework
                response




                           <html>
                               <head>    login.jsp               Login
                                   ...
                               </head>
                               <body>
                                   ...
                               </body>
                           </html>
Um framework Web open source
orientado a componentes que usa
apenas Java e HTML




                         (Sem XML)
Apenas Java

• Componentes são objetos
• Lógica
• Orientação a objetos
  -   new, extends, implements, etc...


• POJO (Plain Old Java Object)
• Similar a Swing
POJO
public class Carro implements java.io.Serializable {

       private String nome;
       private String cor;

       public Carro() {
       }

       public Carro(String nome, String cor) {
           this.nome = nome;
           this.cor = cor;
       }

       public String getCor() {
           return cor;
       }

       public void setCor(String cor) {
           this.cor = cor;
       }

       public String getNome() {
           return nome;
       }

       public void setNome(String nome) {
           this.nome = nome;
       }
   }
Apenas HTML

• Murkup limpo (Sem lógica)
• “Holders” para os componentes
• HTML 5, CSS 3
• Desenvolvedores não estragam o
  design

• Designers não estragam no código
Desenvolvedores

           e

                  Designers
Sem xml?
• Configuração (Java)
• Navegação (Java)
• Componentes (Java)
• Estilos (HTML, CSS)
História


2004 - Criado por Jonathan Locke
2005 - Versão 1.0
2007 - Projeto Apache
2012 - Versão 6.2.0 (2 dias atrás)
Hello World!


 <html xmlns:wicket="http://wicket.apache.org">
    public class HelloWorld extends WebPage {
 <head>
     <html xmlns:wicket="http://wicket.apache.org">
 <meta charset="utf-8" />
     <head>
    public HelloWorld() {
 <title>Hello World</title>
     <meta charset="utf-8" />
     <title>Hello World</title>
 </head> add(new Label("mensagem", "Hello, World!"));
 	   <body>
     </head>
 	 }	     <h1 wicket:id="mensagem">[Texto]</h1>
     	    <body>
}	   </body>
     	    	   <h1>Hello, World</h1>
 </html>
     	    </body>
     </html>
Conceitos
Conceitos
• Application
• Session
• RequestCycle
• Components
• Behaviors
• Models
Application
• Ponto central
• Inicialização
  -   init();


• Configurações
  -   getDebugSettings().setAjaxDebugModeEnabled(false);

  -   getDebugSettings().setDevelopmentUtilities(true);

  -   mountPage(“login”, SignIn.class);


• Homepage
• Indicado no web.xml
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/
2001/XMLSchema-instance"
	   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/
ns/javaee/web-app_2_5.xsd"
	   version="2.5">

	   <display-name>nome_projeto</display-name>

	
       <filter>
       	   <filter-name>nome_filtro</filter-name>
       	   <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
       	   <init-param>
       	   	   <param-name>applicationClassName</param-name>
       	   	   <param-value>org.fedel.seccomp.WicketApplication</param-value>
       	   </init-param>
       </filter>


       <filter-mapping>
       	   <filter-name>nome_filtro</filter-name>
       	   <url-pattern>/*</url-pattern>
       </filter-mapping>

</web-app>
Conceitos
• Application
• Session
• RequestCycle
• Components
• Behaviors
• Models
Session

• Sem manipulação do HttpSession
• Dados específicos
• Tipos bem definidos
• SessionStore
 -   Histórico

 -   Botão voltar
Session
public class SeccompSession extends WebSession {

    private Aluno aluno;

    public synchronized Aluno getAluno() {
        return user;
    }

    public synchronized boolean isAuthenticated() {
        return (aluno != null);
    }

    public synchronized void setAluno(Aluno aluno) {
        this. aluno = aluno;
        dirty();
    }
}



SeccompSession session = MyApplicattion.getSession();

Aluno aluno = session.getAluno();
Session
                                               Pag 1 v 1




                           pageMap: janela 1   Pag 1 v 2
                                 entries



               Session 1
               pageMaps                        Pag 2 v 1


                           pageMap: janela 2
SessionStore                     entries
   sessions




               Session 2
               pageMaps
Conceitos
• Application
• Session
• RequestCycle
• Components
• Behaviors
• Models
RequestCycle
• WebRequest
• WebResponse
• IRequestCycleProcessor
• IRequestHandler
• Métodos para tratar exceções
• Métodos para tratar inicio e fim de uma
  requisição
  -   onBeginRequest();
  -   onEndRequest();
Link                 URL: ./?0-1.ILinkListener-link_seccomp



                           requisicão                                  cria
         Client                         WicketFilter/Servlet                      RequestCycle



                                                                                          usa
   ListenerInterfaceRequestHandler



                                              analisa e cria
 IRequestHandler                                                              IRequestCycleProcessor



   processa           ILinkListener


                                 escreve
                                 markup                               responde
 Page/Component                               HttpResponse                            Client


onClick(){
   setResponse(MyPage.class);              RenderPageRequestHandler
};
Conceitos
• Application
• Session
• RequestCycle
• Components
• Behaviors
• Models
Components
• Lógica
                                      Component
• Manipula o markup
• Renderiza conteúdo
• Recebe e manipula
  eventos

   - onClick(),
     onMouseOver(),          Markup               Model
     onSubmit()


• Possui model...ou não
• Devem ser reutilizáveis!
Components
Label                DatePicker
                                           RepeatingView
                                  Link
 PasswordTextField      Page
                                     AjaxFallbackLink
                              Tree
               Form
                                           DataTable
TextField                        Image
                 AjaxButton

    Button                      ListView
                                             Panel


               E muitos outros...
Components
• Componente possui identificadormesmo pacote
                      Java e Markup no
  (wicket:id)
  - new Label(“mensagem”, “Hello, World!”)

• Markup possui identificador
  (wicket:id)
  - <h1 wicket:id=”mensagem”>[Mensagem]</h1>
Components
• Poder ser aninhados (Árvore)

   <a wicket:id="link">
      <span wicket:id="label">[TEXTO]</span>
    </a>




    Link link = new Link("link"){...};
    add(link);
    link.add(new Label("label", "Texto"));
Components
• Recebe e manipula eventos

 public class EditaAlunoForm extends Form<Aluno>{

     public EditaAlunoForm(String id, Aluno aluno) {
         super(id);

     }
     @Override
      protected void onSubmit() {
          salvar();
          setResponsePage(ListaAlunosPage.class);
          super.onSubmit();
      }
 }
Conceitos
• Application
• Session
• RequestCycle
• Components
• Behaviors
• Models
Behaviors


• Plugins
• Modificam atributos do markup
• Adicionam eventos JavaScript
• Adicionam eventos Ajax
Behaviors
    Label msg = new Label("mensagem", "Hello, World!");

    msg.add(new Behavior() {

          public void onComponentTag(Component component, ComponentTag tag)
{
              tag.put("onClick", "return confirm('Clicou?')");

          }

    });

    add(msg);
Ajax Behaviors
O que é Ajax?
Ajax
 (Asynchronous JavaScript and XML)
• Reunião de várias tecnologias
• Requisições assíncronas
• Objeto XMLHttpRequest
• Sem reload
• Atulização da árvore DOM
Ajax Behaviors
Label msg = new Label("mensagem", "Hello, World!");

msg.setOutputMarkupId(true);

msg.add(new AjaxEventBehavior("onClick") {

    @Override
    protected void onEvent(AjaxRequestTarget target) {
        target.add(getComponent());
    }

    @Override
    protected void onComponentTag(ComponentTag tag) {
        tag.put("style", "color:" + getRandomColor());
        super.onComponentTag(tag);
    }
});
add(msg);
Ajax Behaviors
• Podem renderizar novamente os componentes
    -   target.add(componente);


• Podem executar códigos JavaScript
    -   target.appendJavaScript("seuComandoJS('');");


• Regulam a execução dos eventos no cliente
    -   behavior.setThrottleDelay(Duration.seconds(10));


• Podem adicionar novos recursos ao header
    -   Arquivos JavaScript, CSS, etc.
Conceitos
• Application
• Session
• RequestCycle
• Components
• Behaviors
• Models
Models
Liga POJOs aos componentes


            Component




   Markup               Model
Models

new TextField(“login”, Model.of(“fedel”));




new Label(“nome”, cliente.getNome());




new Label(“rua”, cliente.getEndereco().getRua());
Problemas?
•Não atualiza os valores
   -   new Label(“nome”, cliente.getNome());

   -   new TextField(“login”, Model.of(“fedel”));


•Possível existência valores nulos
   -   new Label(“rua”, cliente.getEndereco().getRua());


•Solucão: OGNL (                                        )
                         Object-Graph Navigation Language
Models
•PropertyModel
  -   new Label(“nome”,
          new PropertyModel(cliente, “nome”));

  -   new Label(“rua”,
          new PropertyModel(cliente,“endereço.rua”));


•CompoundPropertyModel
  -   setModel(new CompoundPropertyModel(cliente));

  -   add(new Label(“nome”));

  -   add(new Label(“endereco.rua”));
Exemplo Form


•Cadastro simples
  -   Nome e email


•Alguns dos conceitos explicados
Exemplo Form
public class Usuario implements Serializable {

    private String nome;
    private String email;

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}




                                 POJO
Exemplo Form
<body>
	




	   <div>
	   	   <span class="label">Nome:</span> <span class="value" wicket:id="nome"></span>
	   </div>
	   <div>
	   	   <span class="label">E-mail</span> <span class="value" wicket:id="email"> </span>
	   </div>

</body>
Exemplo Form
public FormPage() {

    setUsuario(new Usuario());
    final Label nome_label = new Label("nome", new PropertyModel<String>(usuario, "nome"));
    nome_label.setOutputMarkupId(true);
    final Label email_label = new Label("email", new PropertyModel<String>(usuario, "email"));
    email_label.setOutputMarkupId(true);

    add(nome_label);
    add(email_label);




}
Exemplo Form
<body>


    <form wicket:id="form">

	   	     <div>
	   	     	   <span class="label">Nome:</span><input type="text" wicket:id="nome">
	   	     </div>
	   	     <div>
	   	     	   <span class="label">E-mail</span><input type="email"
	   	     	   	   wicket:id="email">
	   	     </div>

	   	

	   </form>

	   <div>
	   	   <span class="label">Nome:</span> <span class="value" wicket:id="nome"></span>
	   </div>
	   <div>
	   	   <span class="label">E-mail</span> <span class="value" wicket:id="email"> </span>
	   </div>

</body>
Exemplo Form
public FormPage() {

    setUsuario(new Usuario());
    final Label nome_label = new Label("nome", new PropertyModel<String>(usuario, "nome"));
    nome_label.setOutputMarkupId(true);
    final Label email_label = new Label("email", new PropertyModel<String>(usuario, "email"));
    email_label.setOutputMarkupId(true);

    add(nome_label);
    add(email_label);

    Form<Usuario> form = new Form<Usuario>("form",
            new CompoundPropertyModel<Usuario>(usuario));
    // adiciona os componentes no form
    form.add(new TextField<String>("nome"));
    form.add(new EmailTextField("email"));




}
Exemplo Form
<body>


    <form wicket:id="form">

	   	     <div>
	   	     	   <span class="label">Nome:</span><input type="text" wicket:id="nome">
	   	     </div>
	   	     <div>
	   	     	   <span class="label">E-mail</span><input type="email"
	   	     	   	   wicket:id="email">
	   	     </div>

	   	     <input type="button" value="Salvar" wicket:id="button" />

	   </form>

	   <div>
	   	   <span class="label">Nome:</span> <span class="value" wicket:id="nome"></span>
	   </div>
	   <div>
	   	   <span class="label">E-mail</span> <span class="value" wicket:id="email"> </span>
	   </div>

</body>
Exemplo Form
public FormPage() {

    setUsuario(new Usuario());
    final Label nome_label = new Label("nome", new PropertyModel<String>(usuario, "nome"));
    nome_label.setOutputMarkupId(true);
    final Label email_label = new Label("email", new PropertyModel<String>(usuario, "email"));
    email_label.setOutputMarkupId(true);

    add(nome_label);
    add(email_label);

    Form<Usuario> form = new Form<Usuario>("form",
            new CompoundPropertyModel<Usuario>(usuario));
    // adiciona os componentes no form
    form.add(new TextField<String>("nome"));
    form.add(new EmailTextField("email"));


    form.add(new AjaxSubmitLink("button") {

          @Override
          protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
              target.add(nome_label);
              target.add(email_label);
              super.onSubmit(target, form);
          }
    });


}
Wicket 6.0
• Versão anterior: 1.5.8 (Java 1.5 ou >)
• Atual: Java 6 ou >
• JQuery
• HTML 5
• WebSocket nativo
• Servlet 3.0
Prós
•Separação entre lógica e exibiçao
•POJO
•Sem XML
•Orientado a componentes
•Ajax sem dificuldades
•Comunidade ativa
Contras
•Pouca documentação
•Curva de aprendizagem um pouco
 longa

•(Por enquanto)
•Espero ter diminuído
Mais informações
• http://wicket.apache.org
• http://wicketinaction.com
• irc: ##wicket@irc.freenode.net
• users@wicket.apache/org
• http://www.wicket-library.com (Exemplos)
• https://github.com/wicketstuff
  (Componentes)
Livros
Contatos


fedelfelipe@gmail.com

@felipefedel

http://felipefedel.wordpress.com/
M  u ito
   rig  ado!
O b

Mais conteúdo relacionado

Mais procurados

Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsEduardo Mendes
 
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Tchelinux
 
GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!Bruno Borges
 
Build Automation Evolved
Build Automation EvolvedBuild Automation Evolved
Build Automation EvolvedMarcelo Diniz
 
GlassFish, Maven, Cloud e Java EE
GlassFish, Maven, Cloud e Java EEGlassFish, Maven, Cloud e Java EE
GlassFish, Maven, Cloud e Java EEBruno Borges
 
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Elvis Rocha
 
Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6danielfcampos
 
Introdução ao Desenvolvimento de aplicações WEB com JSP
Introdução ao Desenvolvimento de aplicações WEB com JSPIntrodução ao Desenvolvimento de aplicações WEB com JSP
Introdução ao Desenvolvimento de aplicações WEB com JSPManoel Afonso
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETslides_teltools
 
WEB 2 - Aula 01 - 02.08
WEB 2 - Aula 01 - 02.08WEB 2 - Aula 01 - 02.08
WEB 2 - Aula 01 - 02.08Gilson Silva
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webelliando dias
 

Mais procurados (20)

Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
Java 9, 10, 11
Java 9, 10, 11Java 9, 10, 11
Java 9, 10, 11
 
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
 
GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!
 
Build Automation Evolved
Build Automation EvolvedBuild Automation Evolved
Build Automation Evolved
 
Java Web 1 Introducao
Java Web 1 IntroducaoJava Web 1 Introducao
Java Web 1 Introducao
 
JSF & REST
JSF & RESTJSF & REST
JSF & REST
 
Java www
Java wwwJava www
Java www
 
GlassFish, Maven, Cloud e Java EE
GlassFish, Maven, Cloud e Java EEGlassFish, Maven, Cloud e Java EE
GlassFish, Maven, Cloud e Java EE
 
Curso de JSP
Curso de JSPCurso de JSP
Curso de JSP
 
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
 
Jsf 2 slideshare
Jsf 2 slideshareJsf 2 slideshare
Jsf 2 slideshare
 
jsp-intro
jsp-introjsp-intro
jsp-intro
 
Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6
 
Apresentação JSF
Apresentação JSFApresentação JSF
Apresentação JSF
 
Introdução ao Desenvolvimento de aplicações WEB com JSP
Introdução ao Desenvolvimento de aplicações WEB com JSPIntrodução ao Desenvolvimento de aplicações WEB com JSP
Introdução ao Desenvolvimento de aplicações WEB com JSP
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NET
 
WEB 2 - Aula 01 - 02.08
WEB 2 - Aula 01 - 02.08WEB 2 - Aula 01 - 02.08
WEB 2 - Aula 01 - 02.08
 
Servlets e jsp
Servlets e jspServlets e jsp
Servlets e jsp
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento web
 

Destaque

Wicket Introduction
Wicket IntroductionWicket Introduction
Wicket IntroductionEyal Golan
 
Wicket Next (1.4/1.5)
Wicket Next (1.4/1.5)Wicket Next (1.4/1.5)
Wicket Next (1.4/1.5)jcompagner
 
Architecting Applications Using Apache Wicket Java2 Days 2009
Architecting Applications Using Apache Wicket   Java2 Days 2009Architecting Applications Using Apache Wicket   Java2 Days 2009
Architecting Applications Using Apache Wicket Java2 Days 2009Mystic Coders, LLC
 
Apache Wicket Web Framework
Apache Wicket Web FrameworkApache Wicket Web Framework
Apache Wicket Web FrameworkLuther Baker
 
Wicket from Designer to Developer
Wicket from Designer to DeveloperWicket from Designer to Developer
Wicket from Designer to DeveloperMarcello Teodori
 
Apache Wicket: Web Applications With Just Java
Apache Wicket: Web Applications With Just JavaApache Wicket: Web Applications With Just Java
Apache Wicket: Web Applications With Just JavaMartijn Dashorst
 
Apache Wicket and Java EE sitting in a tree
Apache Wicket and Java EE sitting in a treeApache Wicket and Java EE sitting in a tree
Apache Wicket and Java EE sitting in a treeMartijn Dashorst
 
Reactive programming with Apache Wicket
Reactive programming with Apache WicketReactive programming with Apache Wicket
Reactive programming with Apache WicketRyuhei Ishibashi
 
​Fully Reactive - from Data to UI with OrientDB + Node.js + Socket.io
​Fully Reactive - from Data to UI with OrientDB + Node.js + Socket.io​Fully Reactive - from Data to UI with OrientDB + Node.js + Socket.io
​Fully Reactive - from Data to UI with OrientDB + Node.js + Socket.ioLuigi Dell'Aquila
 
OrientDB for real & Web App development
OrientDB for real & Web App developmentOrientDB for real & Web App development
OrientDB for real & Web App developmentLuca Garulli
 
Design your application using Persistent Graphs and OrientDB
Design your application using Persistent Graphs and OrientDBDesign your application using Persistent Graphs and OrientDB
Design your application using Persistent Graphs and OrientDBLuca Garulli
 
Comparison of Java Web Application Frameworks
Comparison of Java Web Application FrameworksComparison of Java Web Application Frameworks
Comparison of Java Web Application FrameworksAngelin R
 
OrientDB vs Neo4j - and an introduction to NoSQL databases
OrientDB vs Neo4j - and an introduction to NoSQL databasesOrientDB vs Neo4j - and an introduction to NoSQL databases
OrientDB vs Neo4j - and an introduction to NoSQL databasesCurtis Mosters
 
Introduction to the graph technologies landscape
Introduction to the graph technologies landscapeIntroduction to the graph technologies landscape
Introduction to the graph technologies landscapeLinkurious
 
Comparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and Wicket
Comparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and WicketComparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and Wicket
Comparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and WicketMatt Raible
 

Destaque (20)

Wicket Introduction
Wicket IntroductionWicket Introduction
Wicket Introduction
 
Apache Wicket
Apache WicketApache Wicket
Apache Wicket
 
Wicket Web Framework 101
Wicket Web Framework 101Wicket Web Framework 101
Wicket Web Framework 101
 
Apache Maven
Apache MavenApache Maven
Apache Maven
 
Wicket Next (1.4/1.5)
Wicket Next (1.4/1.5)Wicket Next (1.4/1.5)
Wicket Next (1.4/1.5)
 
Architecting Applications Using Apache Wicket Java2 Days 2009
Architecting Applications Using Apache Wicket   Java2 Days 2009Architecting Applications Using Apache Wicket   Java2 Days 2009
Architecting Applications Using Apache Wicket Java2 Days 2009
 
Apache Wicket Web Framework
Apache Wicket Web FrameworkApache Wicket Web Framework
Apache Wicket Web Framework
 
Biodiversidade 2003
Biodiversidade 2003Biodiversidade 2003
Biodiversidade 2003
 
Wicket from Designer to Developer
Wicket from Designer to DeveloperWicket from Designer to Developer
Wicket from Designer to Developer
 
Apache Wicket: Web Applications With Just Java
Apache Wicket: Web Applications With Just JavaApache Wicket: Web Applications With Just Java
Apache Wicket: Web Applications With Just Java
 
Wicket 2010
Wicket 2010Wicket 2010
Wicket 2010
 
Apache Wicket and Java EE sitting in a tree
Apache Wicket and Java EE sitting in a treeApache Wicket and Java EE sitting in a tree
Apache Wicket and Java EE sitting in a tree
 
Reactive programming with Apache Wicket
Reactive programming with Apache WicketReactive programming with Apache Wicket
Reactive programming with Apache Wicket
 
​Fully Reactive - from Data to UI with OrientDB + Node.js + Socket.io
​Fully Reactive - from Data to UI with OrientDB + Node.js + Socket.io​Fully Reactive - from Data to UI with OrientDB + Node.js + Socket.io
​Fully Reactive - from Data to UI with OrientDB + Node.js + Socket.io
 
OrientDB for real & Web App development
OrientDB for real & Web App developmentOrientDB for real & Web App development
OrientDB for real & Web App development
 
Design your application using Persistent Graphs and OrientDB
Design your application using Persistent Graphs and OrientDBDesign your application using Persistent Graphs and OrientDB
Design your application using Persistent Graphs and OrientDB
 
Comparison of Java Web Application Frameworks
Comparison of Java Web Application FrameworksComparison of Java Web Application Frameworks
Comparison of Java Web Application Frameworks
 
OrientDB vs Neo4j - and an introduction to NoSQL databases
OrientDB vs Neo4j - and an introduction to NoSQL databasesOrientDB vs Neo4j - and an introduction to NoSQL databases
OrientDB vs Neo4j - and an introduction to NoSQL databases
 
Introduction to the graph technologies landscape
Introduction to the graph technologies landscapeIntroduction to the graph technologies landscape
Introduction to the graph technologies landscape
 
Comparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and Wicket
Comparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and WicketComparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and Wicket
Comparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and Wicket
 

Semelhante a Apache Wicket: Desenvolvimento Web orientado a componentes

Rapid Application Development com Tapestry 5
Rapid Application Development com Tapestry 5Rapid Application Development com Tapestry 5
Rapid Application Development com Tapestry 5Marcelo Rodrigues
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.Rogério Napoleão Jr.
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheirasLambda 3
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeRafael Benevides
 
JavaScript Model-View no Frontend
JavaScript Model-View no FrontendJavaScript Model-View no Frontend
JavaScript Model-View no FrontendHenrique Gogó
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.jsGiovanni Bassi
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EELoiane Groner
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer FacesEduardo Bregaida
 
Cactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusCactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusDenis L Presciliano
 
Servlets E Applet
Servlets E AppletServlets E Applet
Servlets E Appletasiramage
 
Minicurso Java Server Faces
Minicurso Java Server FacesMinicurso Java Server Faces
Minicurso Java Server FacesJoão Longo
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysDr. Spock
 
Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Eduardo Mendes
 

Semelhante a Apache Wicket: Desenvolvimento Web orientado a componentes (20)

Rapid Application Development com Tapestry 5
Rapid Application Development com Tapestry 5Rapid Application Development com Tapestry 5
Rapid Application Development com Tapestry 5
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheiras
 
Palestra
PalestraPalestra
Palestra
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 
Curso jsf
Curso jsfCurso jsf
Curso jsf
 
Apache Wicket
Apache WicketApache Wicket
Apache Wicket
 
JavaScript Model-View no Frontend
JavaScript Model-View no FrontendJavaScript Model-View no Frontend
JavaScript Model-View no Frontend
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.js
 
Servlets e JSP
Servlets e JSPServlets e JSP
Servlets e JSP
 
servlet-introducao
servlet-introducaoservlet-introducao
servlet-introducao
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer Faces
 
Cactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusCactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta Cactus
 
Servlets E Applet
Servlets E AppletServlets E Applet
Servlets E Applet
 
Minicurso Java Server Faces
Minicurso Java Server FacesMinicurso Java Server Faces
Minicurso Java Server Faces
 
Hibernate conceitos
Hibernate conceitosHibernate conceitos
Hibernate conceitos
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1
 

Apache Wicket: Desenvolvimento Web orientado a componentes

  • 1. Apache Wicket Desenvolvimento Web orientado a componentes Felipe Fedel Pinto
  • 2. Felipe Fedel Pinto (Amaral) • UNESP Rio Claro - 2007 • Ampliato - Tecnologia da Informação e Consultoria • Trabalha com Wicket desde 2010 • Contribui para projetos externos de Wicket
  • 3. Sumário • O que é Wicket? • Conceitos • Novidades • Mais informações • Perguntas • Contato
  • 4. O que é wicket?
  • 6.
  • 7.
  • 8. O que é wicket?
  • 9. Um framework Web open source orientado a componentes que usa apenas Java e HTML (Sem XML)
  • 10.
  • 11. Frameworks Echo Cocoon Millstone OXF Struts SOFIA Tapestry WebWork RIFE Spring MVC Canyamo Maverick JPublish JATO Folium Jucas Verge Niggle Bishop Barracuda Action Framework Shocks TeaServlet wingS Expresso Bento jStatemachine jZonic OpenEmcee Turbine Scope Warfare JWAA Jaffa Jacquard Macaw Smile MyFaces Chiba JBanana Jeenius JWarp Genie Melati Dovetail Cameleon JFormular Xoplon Japple Helma Dinamica WebOnSwing Nacho Cassandra Baritus Stripes Click GWT
  • 12. Motivações • Sistemas complexos • Desenvolvimento ágil e fácil • Escalabilidade • Reusabilidade • Sem HTMLs mutantes
  • 13. JSP request (GET /login.jsp) Client login.jsp response <html> <head> ... </head> <body> ... </body> </html>
  • 14. MVC request (GET /login.do) Client Framework response <html> <head> login.jsp Login ... </head> <body> ... </body> </html>
  • 15. Um framework Web open source orientado a componentes que usa apenas Java e HTML (Sem XML)
  • 16. Apenas Java • Componentes são objetos • Lógica • Orientação a objetos - new, extends, implements, etc... • POJO (Plain Old Java Object) • Similar a Swing
  • 17. POJO public class Carro implements java.io.Serializable { private String nome; private String cor; public Carro() { } public Carro(String nome, String cor) { this.nome = nome; this.cor = cor; } public String getCor() { return cor; } public void setCor(String cor) { this.cor = cor; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } }
  • 18. Apenas HTML • Murkup limpo (Sem lógica) • “Holders” para os componentes • HTML 5, CSS 3 • Desenvolvedores não estragam o design • Designers não estragam no código
  • 19. Desenvolvedores e Designers
  • 20. Sem xml? • Configuração (Java) • Navegação (Java) • Componentes (Java) • Estilos (HTML, CSS)
  • 21. História 2004 - Criado por Jonathan Locke 2005 - Versão 1.0 2007 - Projeto Apache 2012 - Versão 6.2.0 (2 dias atrás)
  • 22.
  • 23. Hello World! <html xmlns:wicket="http://wicket.apache.org"> public class HelloWorld extends WebPage { <head> <html xmlns:wicket="http://wicket.apache.org"> <meta charset="utf-8" /> <head> public HelloWorld() { <title>Hello World</title> <meta charset="utf-8" /> <title>Hello World</title> </head> add(new Label("mensagem", "Hello, World!")); <body> </head> } <h1 wicket:id="mensagem">[Texto]</h1> <body> } </body> <h1>Hello, World</h1> </html> </body> </html>
  • 25. Conceitos • Application • Session • RequestCycle • Components • Behaviors • Models
  • 26. Application • Ponto central • Inicialização - init(); • Configurações - getDebugSettings().setAjaxDebugModeEnabled(false); - getDebugSettings().setDevelopmentUtilities(true); - mountPage(“login”, SignIn.class); • Homepage • Indicado no web.xml
  • 27. web.xml <?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/ 2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>nome_projeto</display-name> <filter> <filter-name>nome_filtro</filter-name> <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class> <init-param> <param-name>applicationClassName</param-name> <param-value>org.fedel.seccomp.WicketApplication</param-value> </init-param> </filter> <filter-mapping> <filter-name>nome_filtro</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
  • 28. Conceitos • Application • Session • RequestCycle • Components • Behaviors • Models
  • 29. Session • Sem manipulação do HttpSession • Dados específicos • Tipos bem definidos • SessionStore - Histórico - Botão voltar
  • 30. Session public class SeccompSession extends WebSession { private Aluno aluno; public synchronized Aluno getAluno() { return user; } public synchronized boolean isAuthenticated() { return (aluno != null); } public synchronized void setAluno(Aluno aluno) { this. aluno = aluno; dirty(); } } SeccompSession session = MyApplicattion.getSession(); Aluno aluno = session.getAluno();
  • 31. Session Pag 1 v 1 pageMap: janela 1 Pag 1 v 2 entries Session 1 pageMaps Pag 2 v 1 pageMap: janela 2 SessionStore entries sessions Session 2 pageMaps
  • 32. Conceitos • Application • Session • RequestCycle • Components • Behaviors • Models
  • 33. RequestCycle • WebRequest • WebResponse • IRequestCycleProcessor • IRequestHandler • Métodos para tratar exceções • Métodos para tratar inicio e fim de uma requisição - onBeginRequest(); - onEndRequest();
  • 34. Link URL: ./?0-1.ILinkListener-link_seccomp requisicão cria Client WicketFilter/Servlet RequestCycle usa ListenerInterfaceRequestHandler analisa e cria IRequestHandler IRequestCycleProcessor processa ILinkListener escreve markup responde Page/Component HttpResponse Client onClick(){ setResponse(MyPage.class); RenderPageRequestHandler };
  • 35. Conceitos • Application • Session • RequestCycle • Components • Behaviors • Models
  • 36. Components • Lógica Component • Manipula o markup • Renderiza conteúdo • Recebe e manipula eventos - onClick(), onMouseOver(), Markup Model onSubmit() • Possui model...ou não • Devem ser reutilizáveis!
  • 37. Components Label DatePicker RepeatingView Link PasswordTextField Page AjaxFallbackLink Tree Form DataTable TextField Image AjaxButton Button ListView Panel E muitos outros...
  • 38. Components • Componente possui identificadormesmo pacote Java e Markup no (wicket:id) - new Label(“mensagem”, “Hello, World!”) • Markup possui identificador (wicket:id) - <h1 wicket:id=”mensagem”>[Mensagem]</h1>
  • 39. Components • Poder ser aninhados (Árvore) <a wicket:id="link"> <span wicket:id="label">[TEXTO]</span> </a> Link link = new Link("link"){...}; add(link); link.add(new Label("label", "Texto"));
  • 40. Components • Recebe e manipula eventos public class EditaAlunoForm extends Form<Aluno>{ public EditaAlunoForm(String id, Aluno aluno) { super(id); } @Override protected void onSubmit() { salvar(); setResponsePage(ListaAlunosPage.class); super.onSubmit(); } }
  • 41. Conceitos • Application • Session • RequestCycle • Components • Behaviors • Models
  • 42. Behaviors • Plugins • Modificam atributos do markup • Adicionam eventos JavaScript • Adicionam eventos Ajax
  • 43. Behaviors Label msg = new Label("mensagem", "Hello, World!"); msg.add(new Behavior() { public void onComponentTag(Component component, ComponentTag tag) { tag.put("onClick", "return confirm('Clicou?')"); } }); add(msg);
  • 45. O que é Ajax?
  • 46. Ajax (Asynchronous JavaScript and XML) • Reunião de várias tecnologias • Requisições assíncronas • Objeto XMLHttpRequest • Sem reload • Atulização da árvore DOM
  • 47. Ajax Behaviors Label msg = new Label("mensagem", "Hello, World!"); msg.setOutputMarkupId(true); msg.add(new AjaxEventBehavior("onClick") { @Override protected void onEvent(AjaxRequestTarget target) { target.add(getComponent()); } @Override protected void onComponentTag(ComponentTag tag) { tag.put("style", "color:" + getRandomColor()); super.onComponentTag(tag); } }); add(msg);
  • 48. Ajax Behaviors • Podem renderizar novamente os componentes - target.add(componente); • Podem executar códigos JavaScript - target.appendJavaScript("seuComandoJS('');"); • Regulam a execução dos eventos no cliente - behavior.setThrottleDelay(Duration.seconds(10)); • Podem adicionar novos recursos ao header - Arquivos JavaScript, CSS, etc.
  • 49. Conceitos • Application • Session • RequestCycle • Components • Behaviors • Models
  • 50. Models Liga POJOs aos componentes Component Markup Model
  • 51. Models new TextField(“login”, Model.of(“fedel”)); new Label(“nome”, cliente.getNome()); new Label(“rua”, cliente.getEndereco().getRua());
  • 52. Problemas? •Não atualiza os valores - new Label(“nome”, cliente.getNome()); - new TextField(“login”, Model.of(“fedel”)); •Possível existência valores nulos - new Label(“rua”, cliente.getEndereco().getRua()); •Solucão: OGNL ( ) Object-Graph Navigation Language
  • 53. Models •PropertyModel - new Label(“nome”, new PropertyModel(cliente, “nome”)); - new Label(“rua”, new PropertyModel(cliente,“endereço.rua”)); •CompoundPropertyModel - setModel(new CompoundPropertyModel(cliente)); - add(new Label(“nome”)); - add(new Label(“endereco.rua”));
  • 54. Exemplo Form •Cadastro simples - Nome e email •Alguns dos conceitos explicados
  • 55. Exemplo Form public class Usuario implements Serializable { private String nome; private String email; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } POJO
  • 56. Exemplo Form <body> <div> <span class="label">Nome:</span> <span class="value" wicket:id="nome"></span> </div> <div> <span class="label">E-mail</span> <span class="value" wicket:id="email"> </span> </div> </body>
  • 57. Exemplo Form public FormPage() { setUsuario(new Usuario()); final Label nome_label = new Label("nome", new PropertyModel<String>(usuario, "nome")); nome_label.setOutputMarkupId(true); final Label email_label = new Label("email", new PropertyModel<String>(usuario, "email")); email_label.setOutputMarkupId(true); add(nome_label); add(email_label); }
  • 58. Exemplo Form <body> <form wicket:id="form"> <div> <span class="label">Nome:</span><input type="text" wicket:id="nome"> </div> <div> <span class="label">E-mail</span><input type="email" wicket:id="email"> </div> </form> <div> <span class="label">Nome:</span> <span class="value" wicket:id="nome"></span> </div> <div> <span class="label">E-mail</span> <span class="value" wicket:id="email"> </span> </div> </body>
  • 59. Exemplo Form public FormPage() { setUsuario(new Usuario()); final Label nome_label = new Label("nome", new PropertyModel<String>(usuario, "nome")); nome_label.setOutputMarkupId(true); final Label email_label = new Label("email", new PropertyModel<String>(usuario, "email")); email_label.setOutputMarkupId(true); add(nome_label); add(email_label); Form<Usuario> form = new Form<Usuario>("form", new CompoundPropertyModel<Usuario>(usuario)); // adiciona os componentes no form form.add(new TextField<String>("nome")); form.add(new EmailTextField("email")); }
  • 60. Exemplo Form <body> <form wicket:id="form"> <div> <span class="label">Nome:</span><input type="text" wicket:id="nome"> </div> <div> <span class="label">E-mail</span><input type="email" wicket:id="email"> </div> <input type="button" value="Salvar" wicket:id="button" /> </form> <div> <span class="label">Nome:</span> <span class="value" wicket:id="nome"></span> </div> <div> <span class="label">E-mail</span> <span class="value" wicket:id="email"> </span> </div> </body>
  • 61. Exemplo Form public FormPage() { setUsuario(new Usuario()); final Label nome_label = new Label("nome", new PropertyModel<String>(usuario, "nome")); nome_label.setOutputMarkupId(true); final Label email_label = new Label("email", new PropertyModel<String>(usuario, "email")); email_label.setOutputMarkupId(true); add(nome_label); add(email_label); Form<Usuario> form = new Form<Usuario>("form", new CompoundPropertyModel<Usuario>(usuario)); // adiciona os componentes no form form.add(new TextField<String>("nome")); form.add(new EmailTextField("email")); form.add(new AjaxSubmitLink("button") { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { target.add(nome_label); target.add(email_label); super.onSubmit(target, form); } }); }
  • 62. Wicket 6.0 • Versão anterior: 1.5.8 (Java 1.5 ou >) • Atual: Java 6 ou > • JQuery • HTML 5 • WebSocket nativo • Servlet 3.0
  • 63. Prós •Separação entre lógica e exibiçao •POJO •Sem XML •Orientado a componentes •Ajax sem dificuldades •Comunidade ativa
  • 64. Contras •Pouca documentação •Curva de aprendizagem um pouco longa •(Por enquanto) •Espero ter diminuído
  • 65. Mais informações • http://wicket.apache.org • http://wicketinaction.com • irc: ##wicket@irc.freenode.net • users@wicket.apache/org • http://www.wicket-library.com (Exemplos) • https://github.com/wicketstuff (Componentes)
  • 67.
  • 69. M u ito rig ado! O b