SlideShare uma empresa Scribd logo
Vraptor
Francisco Clauvane
Sobre
Esta apresentacao tem como base o
conhecimento adquirido atraves da apostila
fj28 da caelum, a minha experiencia e as
dicas dadas por profissionais mais
experientes.
Sumario
1.   Controller
2.   Component
3.   RestFul
4.   Validator
5.   Ajax-Json-JQuery
6.   Interceptor
1-Controller
@Resource
public class Mundo {
   public String boasVindas(){
        return "Ola Mundo";
   }

    public List<String> getPaises(){
       List<String> listaDePaises = new ArrayList<String>();
       listaDePaises.add("Brasil");
       listaDePaises.add("Argentina");
       listaDePaises.add("Chile");
       listaDePaises.add("Venezuela");

        return listaDePaises;
    }
}
1-Controller
@Resource
public class ProdutosController {

   private final ProdutoDao dao;
   private final Result result;
   private final Validator validator;

   public ProdutosController(ProdutoDao dao, Result
result, Validator validator) {
        this.dao = dao;
        this.result = result;
        this.validator = validator;
   }
2-Component
@Component
public class ProdutoDao {

   private Session session;

   public ProdutoDao(Session session) {
      this.session = session;
   }

   public void salva(Produto produto) {
      Transaction transaction = session.beginTransaction();
      session.save(produto);
      transaction.commit();
   }
2-Component
@Component
public class CriadorDeSessao implements ComponentFactory<Session> {
    private final SessionFactory sessionFactory;
    private Session session;
    public CriadorDeSessao(SessionFactory sessionFactory) {
         this.sessionFactory = sessionFactory;
    }
    @PostConstruct
    public void abre(){
         session = sessionFactory.openSession();
    }
    public Session getInstance() {
         return session;
    }
    @PreDestroy
    public void fecha(){
         session.close();
    }
}
2-Component
@Component
@ApplicationScoped
public class CriadorDeSessionFactory implements
ComponentFactory<SessionFactory>{
    private SessionFactory sessionFactory;
    @PostConstruct
    public void abre(){
         AnnotationConfiguration annotationConfiguration = new
AnnotationConfiguration();
         annotationConfiguration.configure("hibernate.cfg.xml");
         sessionFactory = annotationConfiguration.buildSessionFactory();
    }
    public SessionFactory getInstance() {
         return sessionFactory;
    }
    @PreDestroy
    public void fecha(){
         sessionFactory.close();
    }

}
3-RestFul
 @Get("/produtos/{id}")
 public Produto edita(Long id) {
     return dao.getProduto(id);
 }
 @Post("/produtos")
 public void adiciona(Produto produto) {
     validaFormulario(produto);
     dao.salva(produto);
     result.redirectTo(this).lista();
 }
 @Put("/produtos/{produto.id}")
 public void altera(Produto produto) {
     validaFormulario(produto);
     dao.atualiza(produto);
     result.redirectTo(this).lista();
 }
 @Delete("/produtos/{id}")
 public void remove(Long id) {
     Produto produto = dao.getProduto(id);
     dao.remove(produto);
     result.redirectTo(this).lista();
 }
4-Validator
public void adiciona(final Produto produto) {
if (produto.getNome() == null ||produto.getNome().length() < 3) {
validator.add(new ValidationMessage("Nome é obrigatório e precisa ter mais
de 3 letras", "produto.nome"));
}
if (produto.getDescricao() == null ||produto.getDescricao().length() > 40) {
validator.add(new ValidationMessage("Descrição é obrigatória não pode ter
mais que 40 letras", "produto.descricao"));
}
if (produto.getPreco() <= 0) {
validator.add(new ValidationMessage("Preço precisa ser positivo", "produto.
preco"));
}
validator.onErrorUsePageOf(ProdutosController.class).formulario();
dao.salva(produto);
result.redirectTo(this).lista();
}
4-Validator
    @NotNull(message = "O campo <b>nome</b> precisa ser preenchido!")
    @Length(min = 3, message = "O campo <b>nome</b> deve possuir no
minimo 3 caracteres!")
    private String nome;

    @NotNull(message = "O campo <b>descricao</b> precisa ser
preenchido!")
    @Length(max = 40, message = "O campo <b>descricao</b> deve possuir
no maximo 40 caracteres!")
    private String descricao;

    @NotNull(message = "O campo <b>preco</b> precisa ser preenchido!")
    @Min(value = 0, message = "O campo <b>preco</b> nao pode ser
negativo!")
    private Double preco;
4-Validator
@Post("/produtos")
  public void adiciona(Produto produto) {

       validator.validate(produto);
       validator.onErrorUsePageOf(this).formulario();
       dao.salva(produto);
       result.redirectTo(this).lista();
   }
4-Validator
<script type="text/javascript" src=".../jquery-1.3.2.min.js"></script>
<script type="text/javascript" src=".../jquery.validate.min.js"></script>

<form id="produtosForm" action="<c:url value="/produtos"/>"
method="POST">
...
<script type="text/javascript">
$('#produtosForm').validate({
rules: {
"produto.nome": {
required: true,
minlength: 3
},
"produto.descricao": {
required: true,
maxlength: 40
},
"produto.preco": {
min: 0.0
}
}
});
</script>
5-Ajax-Json-JQuery
 <form action="<c:url value="/produtos/busca"/>">
 <input id="busca" name="nome" />
 </form>
 <script type="text/javascript">
 $("#busca").puts("Busca produtos por nome");
 $("#busca").autocomplete('/goodbuy/produtos/busca.json', {
 dataType: "json",
 parse: function(produtos) {
 return $.map(produtos, function(produto) {
 return {
 data: produto,
 value: produto.nome,
 result: produto.nome
 };});
 },
 formatItem: function(produto) {
 return produto.nome + "(" + produto.preco + ")";
 }
 });
 </script>
5-Ajax-Json-JQuery
 @Get("/produtos/busca.json")
 public void buscaJson(String q) {
   result.use(json()).withoutRoot().from(dao.busca(q))
           .exclude("id", "descricao").serialize();
 }
6-Interceptor
@Intercepts
public class AutorizacaoInterceptor implements Interceptor{

    private final UsuarioWeb usuario;
    private final Result result;

    public AutorizacaoInterceptor(UsuarioWeb usuario, Result result) {
        this.usuario = usuario;
        this.result = result;
    }

    public boolean accepts(ResourceMethod method) {
        return !usuario.isLogado() && method.containsAnnotation(Restrito.
class);
    }

    public void intercept(InterceptorStack arg0, ResourceMethod arg1,
            Object arg2) throws InterceptionException {
        result.redirectTo(UsuarioController.class).loginForm();
    }
}
6-Interceptor
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Restrito {

}
6-Interceptor
 @Restrito
 @Post("/produtos")
 public void adiciona(Produto produto) {
      dao.salva(produto);
      result.redirectTo(this).lista();
 }
 @Restrito
 @Get("/produtos/novo")
 public void formulario() {
 }
 @Restrito
 @Get("/produtos/{id}")
 public Produto edita(Long id) {
      return dao.getProduto(id);
 }
 @Restrito
 @Put("/produtos/{produto.id}")
 public void altera(Produto produto) {
      dao.atualiza(produto);
      result.redirectTo(this).lista();
 }
 @Restrito
 @Delete("/produtos/{id}")
 public void remove(Long id) {
      Produto produto = dao.getProduto(id);
      dao.remove(produto);
      result.redirectTo(this).lista();
 }
Duvidas
Bibliografia
http://www.caelum.com.
br/download/caelum-java-web-vraptor-
hibernate-ajax-fj28.pdf
http://www.caelum.com.
br/download/caelum-java-web-fj21.pdf

https://github.com/clauvane
https://github.com/rponte

Mais conteúdo relacionado

PPTX
Vraptor - Alta produtividade no Desenvolvimento Web em Java
Kaio Valente
 
ODP
VRaptor4
Renan Montenegro
 
PPTX
Desvendando as ferramentas e serviços para o desenvolvedor Android
joaobmonteiro
 
PDF
Como conectar programas em linguagem java a bases de dados
Henrique Fernandes
 
ODP
Dojo de programação - Dia de Java - UFSCar
Luiz Ribeiro
 
KEY
Codifique melhor
Marcos Sousa
 
PDF
Teste de Integracao com DbUnit e JStryker
Washington Botelho
 
PDF
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
chackero
 
Vraptor - Alta produtividade no Desenvolvimento Web em Java
Kaio Valente
 
Desvendando as ferramentas e serviços para o desenvolvedor Android
joaobmonteiro
 
Como conectar programas em linguagem java a bases de dados
Henrique Fernandes
 
Dojo de programação - Dia de Java - UFSCar
Luiz Ribeiro
 
Codifique melhor
Marcos Sousa
 
Teste de Integracao com DbUnit e JStryker
Washington Botelho
 
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
chackero
 

Mais procurados (20)

ODP
Trabalhando com as views do Web2Py
Hugo Leonardo Costa e Silva
 
PDF
React - Compartilhando estado entre componentes
Jefferson Mariano de Souza
 
PPTX
Persistência com JPA e Hibernate
Fernando Oliveira
 
PPTX
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Vitor Ciaramella
 
ODP
TDD - Algumas lições aprendidas com o livro GOOS
Fábio Miranda
 
PPTX
Clean Code e Object Calisthenics - Aplicados no PHP
Rafael Neris
 
PDF
Android DevConference - Data Binding: Código limpo, manutenção garantida
iMasters
 
PDF
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Caelum
 
PPTX
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
Diego Castro
 
PDF
Minicurso sobre AndroidAnnotations, GreenDAO, EventBus e Crouton
Ricardo Longa
 
PDF
Combatendo code smells em aplicações Java
Emmanuel Neri
 
PPTX
TDC Florianópolis 2018 - Bolovo 2.0: Indo do EJB 2.0 ao Domain Driven Design
Alexandre Rodrigues
 
PPTX
Treze ferramentas/frameworks para desenvolvimento android
Ricardo Longa
 
PDF
Fundamentos de JDBC
Mario Jorge Pereira
 
PPTX
Design patterns
DouglasSoaresAndrSch
 
PPTX
Treze ferramentas/frameworks para desenvolvimento Android
Adriano Rocha
 
KEY
Spring MVC - QConSP
Eduardo Bregaida
 
PDF
Design Patterns na Programação de Jogo
Bruno Cicanci
 
PDF
Aula android 02.pdf
Carlos Cavalcanti
 
PPT
AspectJ — Programação orientada a aspectos em Java
elliando dias
 
Trabalhando com as views do Web2Py
Hugo Leonardo Costa e Silva
 
React - Compartilhando estado entre componentes
Jefferson Mariano de Souza
 
Persistência com JPA e Hibernate
Fernando Oliveira
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Vitor Ciaramella
 
TDD - Algumas lições aprendidas com o livro GOOS
Fábio Miranda
 
Clean Code e Object Calisthenics - Aplicados no PHP
Rafael Neris
 
Android DevConference - Data Binding: Código limpo, manutenção garantida
iMasters
 
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Caelum
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
Diego Castro
 
Minicurso sobre AndroidAnnotations, GreenDAO, EventBus e Crouton
Ricardo Longa
 
Combatendo code smells em aplicações Java
Emmanuel Neri
 
TDC Florianópolis 2018 - Bolovo 2.0: Indo do EJB 2.0 ao Domain Driven Design
Alexandre Rodrigues
 
Treze ferramentas/frameworks para desenvolvimento android
Ricardo Longa
 
Fundamentos de JDBC
Mario Jorge Pereira
 
Design patterns
DouglasSoaresAndrSch
 
Treze ferramentas/frameworks para desenvolvimento Android
Adriano Rocha
 
Spring MVC - QConSP
Eduardo Bregaida
 
Design Patterns na Programação de Jogo
Bruno Cicanci
 
Aula android 02.pdf
Carlos Cavalcanti
 
AspectJ — Programação orientada a aspectos em Java
elliando dias
 
Anúncio

Destaque (16)

PDF
Ns tutorial
SAMMMATHEW
 
PPT
Judge ch03 lecture
jaske78
 
PPT
Judge ch01 lecture
jaske78
 
PPT
Best friends
Tom Newnham
 
PDF
Room15 snapshoots
tbignold
 
PDF
Asevelvollisuuden hinta Seura 8_2012 Lauri Korolainen
Lauri Korolainen
 
PPT
Judge ch20 lecture
jaske78
 
PPT
Judge ch18 lecture
jaske78
 
PPS
Η Ιστορία της τέχνηςσε 3΄ λεπτά
tokasd
 
PPT
Judge ch17 lecture
jaske78
 
PPT
Judge ch16 lecture
jaske78
 
PPTX
Event marketing
jaihind123
 
DOCX
comparitive study of nike and adidas
dabralvipin
 
PDF
Rfp sample-request for-proposal
asim19908099
 
PPTX
4G LTE Mobile Broadband Overview
Sigit Priyanggoro
 
PPT
La vente à l'heure du digital. Entre high-tech et high-touch.
Les Brigades du Marketing - www.lesbrigadesdumarketing.com
 
Ns tutorial
SAMMMATHEW
 
Judge ch03 lecture
jaske78
 
Judge ch01 lecture
jaske78
 
Best friends
Tom Newnham
 
Room15 snapshoots
tbignold
 
Asevelvollisuuden hinta Seura 8_2012 Lauri Korolainen
Lauri Korolainen
 
Judge ch20 lecture
jaske78
 
Judge ch18 lecture
jaske78
 
Η Ιστορία της τέχνηςσε 3΄ λεπτά
tokasd
 
Judge ch17 lecture
jaske78
 
Judge ch16 lecture
jaske78
 
Event marketing
jaihind123
 
comparitive study of nike and adidas
dabralvipin
 
Rfp sample-request for-proposal
asim19908099
 
4G LTE Mobile Broadband Overview
Sigit Priyanggoro
 
La vente à l'heure du digital. Entre high-tech et high-touch.
Les Brigades du Marketing - www.lesbrigadesdumarketing.com
 
Anúncio

Semelhante a Vraptor (20)

PDF
Play Framework - FLISOL
grupoweblovers
 
PPT
VRaptor - Alta produtividade no Desenvolvimento Web em Java
Daniel Faria Gomes
 
PDF
Introducao ao Spring Web MVC
Eder Magalhães
 
PDF
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
David Robert Camargo de Campos
 
PDF
Android na Prática
Ramon Ribeiro Rabello
 
PDF
Use CDI em seus projetos Java !
Leonardo Brancalhão
 
PPTX
Palestra Novidades da linguagem C# 6
Renato Haddad
 
PDF
Integração do Flex com PHP através do AMFPHP
elliando dias
 
PDF
Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia
 
PPTX
Git, GitHub e OO
DouglasSoaresAndrSch
 
PDF
Introdução ao Zend Framework 2
Elton Minetto
 
PDF
Automação e virtualização de serviços
Elias Nogueira
 
PDF
PHP ao Extremo
Thiago Rigo
 
PDF
Ecosistema spring a_plataforma_enterprise_jav
Julio Viegas
 
PDF
Curso de Ruby on Rails - Aula 02
Maurício Linhares
 
PDF
Wicket 2008
Claudio Miranda
 
PPTX
Programação Orientada por Objectos - Aula 2
Manuel Menezes de Sequeira
 
PPT
Introdução à análise orientada a objetos parte 2
irenescotolo
 
PPTX
Técnicas de Refactoring
Rodrigo Branas
 
PDF
Evento Front End SP - Organizando o Javascript
Michel Ribeiro
 
Play Framework - FLISOL
grupoweblovers
 
VRaptor - Alta produtividade no Desenvolvimento Web em Java
Daniel Faria Gomes
 
Introducao ao Spring Web MVC
Eder Magalhães
 
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
David Robert Camargo de Campos
 
Android na Prática
Ramon Ribeiro Rabello
 
Use CDI em seus projetos Java !
Leonardo Brancalhão
 
Palestra Novidades da linguagem C# 6
Renato Haddad
 
Integração do Flex com PHP através do AMFPHP
elliando dias
 
Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia
 
Git, GitHub e OO
DouglasSoaresAndrSch
 
Introdução ao Zend Framework 2
Elton Minetto
 
Automação e virtualização de serviços
Elias Nogueira
 
PHP ao Extremo
Thiago Rigo
 
Ecosistema spring a_plataforma_enterprise_jav
Julio Viegas
 
Curso de Ruby on Rails - Aula 02
Maurício Linhares
 
Wicket 2008
Claudio Miranda
 
Programação Orientada por Objectos - Aula 2
Manuel Menezes de Sequeira
 
Introdução à análise orientada a objetos parte 2
irenescotolo
 
Técnicas de Refactoring
Rodrigo Branas
 
Evento Front End SP - Organizando o Javascript
Michel Ribeiro
 

Último (16)

PPTX
Curso de Java 2 - (PrimeiroPrograma, Variáveis, Tipos e Operadores.pptx
Anderson Maciel
 
PPTX
Curso de Java 6 - (Números, Data e Hora).pptx
Anderson Maciel
 
PPTX
Desenvolvimento-de-Produtos-Inovadores.pptx
ssuser1d7565
 
PPTX
Curso de Java 4 - (Orientação a Objetos).pptx
Anderson Maciel
 
PPTX
Curso de Java 3 - (Estruturas de Controle, Decisão, Loop, Procedimento).pptx
Anderson Maciel
 
PDF
Explorando o Futuro do Corpo: Implantes Neurais e o Biohacking dos Sentidos
cooperliora
 
PPTX
aplicativopenseira.pptx Aplicativo que organiza Pensamentos - Peça Publicitária
StelaNorie1
 
PPTX
Gestão de Mudanças - Os maiores desafios da Gestão de Mudanças e Gestão de Pr...
Gateware Group
 
PPTX
Curso de Java 7 - (ArrayList, Collections,(Set, List, Queue, Map)).pptx
Anderson Maciel
 
PPTX
Curso de Java 5 - (Strings) Tipo de Dados.pptx
Anderson Maciel
 
PPTX
21 - Lógica de Programação com Portugol.pptx
Anderson Maciel
 
PDF
Certificado em Redes Neurais Artificiais em Python
CaioSilva506151
 
PPTX
Computacao-e-Tecnologias-Digitais-Por-Que-Aprender.pptx
RobertaOliveiradaFon1
 
PPTX
22 - Lógica de Programação com Portugol.pptx
Anderson Maciel
 
PPTX
Curso de Java 1 - (Introdução Geral).pptx
Anderson Maciel
 
PPTX
Gestão de Mudanças - Fases do processo de mudança organizacional
Gateware Group
 
Curso de Java 2 - (PrimeiroPrograma, Variáveis, Tipos e Operadores.pptx
Anderson Maciel
 
Curso de Java 6 - (Números, Data e Hora).pptx
Anderson Maciel
 
Desenvolvimento-de-Produtos-Inovadores.pptx
ssuser1d7565
 
Curso de Java 4 - (Orientação a Objetos).pptx
Anderson Maciel
 
Curso de Java 3 - (Estruturas de Controle, Decisão, Loop, Procedimento).pptx
Anderson Maciel
 
Explorando o Futuro do Corpo: Implantes Neurais e o Biohacking dos Sentidos
cooperliora
 
aplicativopenseira.pptx Aplicativo que organiza Pensamentos - Peça Publicitária
StelaNorie1
 
Gestão de Mudanças - Os maiores desafios da Gestão de Mudanças e Gestão de Pr...
Gateware Group
 
Curso de Java 7 - (ArrayList, Collections,(Set, List, Queue, Map)).pptx
Anderson Maciel
 
Curso de Java 5 - (Strings) Tipo de Dados.pptx
Anderson Maciel
 
21 - Lógica de Programação com Portugol.pptx
Anderson Maciel
 
Certificado em Redes Neurais Artificiais em Python
CaioSilva506151
 
Computacao-e-Tecnologias-Digitais-Por-Que-Aprender.pptx
RobertaOliveiradaFon1
 
22 - Lógica de Programação com Portugol.pptx
Anderson Maciel
 
Curso de Java 1 - (Introdução Geral).pptx
Anderson Maciel
 
Gestão de Mudanças - Fases do processo de mudança organizacional
Gateware Group
 

Vraptor

  • 2. Sobre Esta apresentacao tem como base o conhecimento adquirido atraves da apostila fj28 da caelum, a minha experiencia e as dicas dadas por profissionais mais experientes.
  • 3. Sumario 1. Controller 2. Component 3. RestFul 4. Validator 5. Ajax-Json-JQuery 6. Interceptor
  • 4. 1-Controller @Resource public class Mundo { public String boasVindas(){ return "Ola Mundo"; } public List<String> getPaises(){ List<String> listaDePaises = new ArrayList<String>(); listaDePaises.add("Brasil"); listaDePaises.add("Argentina"); listaDePaises.add("Chile"); listaDePaises.add("Venezuela"); return listaDePaises; } }
  • 5. 1-Controller @Resource public class ProdutosController { private final ProdutoDao dao; private final Result result; private final Validator validator; public ProdutosController(ProdutoDao dao, Result result, Validator validator) { this.dao = dao; this.result = result; this.validator = validator; }
  • 6. 2-Component @Component public class ProdutoDao { private Session session; public ProdutoDao(Session session) { this.session = session; } public void salva(Produto produto) { Transaction transaction = session.beginTransaction(); session.save(produto); transaction.commit(); }
  • 7. 2-Component @Component public class CriadorDeSessao implements ComponentFactory<Session> { private final SessionFactory sessionFactory; private Session session; public CriadorDeSessao(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @PostConstruct public void abre(){ session = sessionFactory.openSession(); } public Session getInstance() { return session; } @PreDestroy public void fecha(){ session.close(); } }
  • 8. 2-Component @Component @ApplicationScoped public class CriadorDeSessionFactory implements ComponentFactory<SessionFactory>{ private SessionFactory sessionFactory; @PostConstruct public void abre(){ AnnotationConfiguration annotationConfiguration = new AnnotationConfiguration(); annotationConfiguration.configure("hibernate.cfg.xml"); sessionFactory = annotationConfiguration.buildSessionFactory(); } public SessionFactory getInstance() { return sessionFactory; } @PreDestroy public void fecha(){ sessionFactory.close(); } }
  • 9. 3-RestFul @Get("/produtos/{id}") public Produto edita(Long id) { return dao.getProduto(id); } @Post("/produtos") public void adiciona(Produto produto) { validaFormulario(produto); dao.salva(produto); result.redirectTo(this).lista(); } @Put("/produtos/{produto.id}") public void altera(Produto produto) { validaFormulario(produto); dao.atualiza(produto); result.redirectTo(this).lista(); } @Delete("/produtos/{id}") public void remove(Long id) { Produto produto = dao.getProduto(id); dao.remove(produto); result.redirectTo(this).lista(); }
  • 10. 4-Validator public void adiciona(final Produto produto) { if (produto.getNome() == null ||produto.getNome().length() < 3) { validator.add(new ValidationMessage("Nome é obrigatório e precisa ter mais de 3 letras", "produto.nome")); } if (produto.getDescricao() == null ||produto.getDescricao().length() > 40) { validator.add(new ValidationMessage("Descrição é obrigatória não pode ter mais que 40 letras", "produto.descricao")); } if (produto.getPreco() <= 0) { validator.add(new ValidationMessage("Preço precisa ser positivo", "produto. preco")); } validator.onErrorUsePageOf(ProdutosController.class).formulario(); dao.salva(produto); result.redirectTo(this).lista(); }
  • 11. 4-Validator @NotNull(message = "O campo <b>nome</b> precisa ser preenchido!") @Length(min = 3, message = "O campo <b>nome</b> deve possuir no minimo 3 caracteres!") private String nome; @NotNull(message = "O campo <b>descricao</b> precisa ser preenchido!") @Length(max = 40, message = "O campo <b>descricao</b> deve possuir no maximo 40 caracteres!") private String descricao; @NotNull(message = "O campo <b>preco</b> precisa ser preenchido!") @Min(value = 0, message = "O campo <b>preco</b> nao pode ser negativo!") private Double preco;
  • 12. 4-Validator @Post("/produtos") public void adiciona(Produto produto) { validator.validate(produto); validator.onErrorUsePageOf(this).formulario(); dao.salva(produto); result.redirectTo(this).lista(); }
  • 13. 4-Validator <script type="text/javascript" src=".../jquery-1.3.2.min.js"></script> <script type="text/javascript" src=".../jquery.validate.min.js"></script> <form id="produtosForm" action="<c:url value="/produtos"/>" method="POST"> ... <script type="text/javascript"> $('#produtosForm').validate({ rules: { "produto.nome": { required: true, minlength: 3 }, "produto.descricao": { required: true, maxlength: 40 }, "produto.preco": { min: 0.0 } } }); </script>
  • 14. 5-Ajax-Json-JQuery <form action="<c:url value="/produtos/busca"/>"> <input id="busca" name="nome" /> </form> <script type="text/javascript"> $("#busca").puts("Busca produtos por nome"); $("#busca").autocomplete('/goodbuy/produtos/busca.json', { dataType: "json", parse: function(produtos) { return $.map(produtos, function(produto) { return { data: produto, value: produto.nome, result: produto.nome };}); }, formatItem: function(produto) { return produto.nome + "(" + produto.preco + ")"; } }); </script>
  • 15. 5-Ajax-Json-JQuery @Get("/produtos/busca.json") public void buscaJson(String q) { result.use(json()).withoutRoot().from(dao.busca(q)) .exclude("id", "descricao").serialize(); }
  • 16. 6-Interceptor @Intercepts public class AutorizacaoInterceptor implements Interceptor{ private final UsuarioWeb usuario; private final Result result; public AutorizacaoInterceptor(UsuarioWeb usuario, Result result) { this.usuario = usuario; this.result = result; } public boolean accepts(ResourceMethod method) { return !usuario.isLogado() && method.containsAnnotation(Restrito. class); } public void intercept(InterceptorStack arg0, ResourceMethod arg1, Object arg2) throws InterceptionException { result.redirectTo(UsuarioController.class).loginForm(); } }
  • 17. 6-Interceptor import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Restrito { }
  • 18. 6-Interceptor @Restrito @Post("/produtos") public void adiciona(Produto produto) { dao.salva(produto); result.redirectTo(this).lista(); } @Restrito @Get("/produtos/novo") public void formulario() { } @Restrito @Get("/produtos/{id}") public Produto edita(Long id) { return dao.getProduto(id); } @Restrito @Put("/produtos/{produto.id}") public void altera(Produto produto) { dao.atualiza(produto); result.redirectTo(this).lista(); } @Restrito @Delete("/produtos/{id}") public void remove(Long id) { Produto produto = dao.getProduto(id); dao.remove(produto); result.redirectTo(this).lista(); }