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

Vraptor

  • 1.
  • 2.
    Sobre Esta apresentacao temcomo 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 CriadorDeSessaoimplements 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 CriadorDeSessionFactoryimplements 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}") publicProduto 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(finalProduto 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") publicvoid 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> <scripttype="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:urlvalue="/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") publicvoid buscaJson(String q) { result.use(json()).withoutRoot().from(dao.busca(q)) .exclude("id", "descricao").serialize(); }
  • 16.
    6-Interceptor @Intercepts public class AutorizacaoInterceptorimplements 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; importjava.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(); }
  • 19.
  • 20.