Alta produtividade no
Desenvolvimento Web em Java
               Kaio Valente

 ksmvalente@gmail.com         @kaiovalente
Histórico
Action-Based x Component-Based
Listeners
            actionEvent


Solução?
<filter>
    <filter-name>vraptor</filter-name>
    <filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
</filter>

<filter-mapping>
    <filter-name>vraptor</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>




 @Resource
 public class PropostaController {
         public List<Proposta> listagem() {
                 return new ArrayList<Proposta>();
         }
 }
Requisições
/<nome_do_controller>/<nome_do_metodo>

Redirecionamento
/WEB-INF/jsp/<nome_do_controller>/<nome_do_metodo>.jsp

Coleções
<tipoDaCollection>List


<ul>
<c:forEach items="${propostaList}" var="proposta">
  <li> ${proposta.codigo} - ${proposta.descricao} </li>
</c:forEach>
</ul>
@Component
public class PropostaDAO {
         ...
}

@Resource
public class PropostaController {

         private PropostaDAO dao;

         public PropostaController(PropostaDAO dao) {
                  this.dao = dao;
         }

         public List<Proposta> listagem() {
                  return new ArrayList<Proposta>();
         }
}
<form action="${pageContext.request.contextPath}/proposta/adicionar">
  Descrição: <input type="text" name=“proposta.descricao" /><br/>
  Preço:      <input type="text" name=“proposta.preco" /><br/>
  <input type="submit" value="Salvar" />
</form>

 @Resource
 public class PropostaController {
           private PropostaDAO dao;
           private Result result;

         public PropostaController(PropostaDAO dao, Result result) {
                  this.dao = dao;
                  this.result = result;
         }

         public void adicionar(Proposta proposta) {
                  dao.salvar(proposta);
                  result.redirectTo(PropostaController.class).listagem();
         }
 }
@Resource
public class PropostaController {
             private Validator validator;

              public PropostaController(Validator validator) {
                          this.validator = validator;
              }
}

public void void adicionar(Proposta proposta) {
  if (proposta.getDescricao().isEmpty()) {
     validator.add(new ValidationMessage(“descricao.nao.informada", "erro"));
  }

    validator.onErrorUsePageOf(PropostaController.class).listagem();
    dao.salvar(proposta);
    result.redirectTo(PropostaController.class).listagem();
}

public void void adicionar(final Proposta proposta) {
  validator.checking(new Validations() {{
     that(!proposta.getDescricao().isEmpty(), "erro", " descricao.nao.informada");
  }});

    validator.onErrorUsePageOf(PropostaController.class).listagem();
    dao.salvar(proposta);
    result.redirectTo(PropostaController.class).listagem();
}
• Validação com mensagens parametrizadas

• Validação com Matchers do Hamcrest

• Validação com Bean Validation e Hibernate Validator

• Validação com suporte a Internacionalização



 <ul>
 <c:forEach items="${errors}" var=“error">
   <li> ${error.category} - ${error.message} </li>
 </c:forEach>
 </ul>
@Convert(Estado.class)
public class EstadoConverter implements Converter<Estado> {

public Estado convert(String value, Class<? extends Estado> type,
                            ResourceBundle bundle) {
    if (value == null || value.equals("")) {
       return null;
    }
    Estado estado = new Estado();
    try {
          estado.setId(Long.parseLong(value));
    } catch (NumberFormatException e) {
          estado = null;
    }
    return estado;
  }

}
@Intercepts
public class LoginInterceptor implements Interceptor {
          private Result result;
          private UserSession userSession;

public LoginInterceptor(Result result, UserSession userSession) {
    this.result = result;
    this.userSession = userSession;
}
public boolean accepts(ResourceMethod method) {
    return true;
}

public void intercept(InterceptorStack stack, ResourceMethod method,
                      Object resource) {

    if (userSession.isLogged()) {
        stack.next(method, resource);
    } else {
        result.redirectTo(LoginController.class).login();
    }
}
public vod loadJSon(Proposta proposta) {
  result.use(Results.json()).from(proposta).serialize();
}

Retorno
{“proposta": { “descricao": “Proposta 1”}}


public vod loadJSon(Proposta proposta) {
  result.use(Results.json()).from(proposta).include(“itemProposta”).serialize();
}

Retorno
{“proposta": { “descricao": “Proposta 1“,“itemProposta“ {
                                                “codigo”: “cod01"}
             }
}

public vod loadJSon(Usuario usuario) {
  result.use(Results.json()).from(usuario).exclude(“senha”).serialize();
}

Retorno
{"usuario": {
             "nome": "Joao",
             "login": "joao"
}}
<context-param>
    <param-name>br.com.caelum.vraptor.packages</filter-name>
    <param-value>br.com.caelum.vraptor.util.jpa</filter-class>
</context-param>
Comunidade

• github.com/caelum/vraptor

• caelum-vraptor@googlegroups.com

• vraptor.caelum.com.br/comunidade.jsp
Onde Começar?
• vraptor.caelum.com.br/documentacao/v
  raptor3-guia-de-1-minuto

• vraptor.caelum.com.br/documentacao/v
  raptor3-o-guia-inicial-de-10-minutos
Obrigado!


              Kaio Valente

ksmvalente@gmail.com         @kaiovalente

Vraptor - Alta produtividade no Desenvolvimento Web em Java

  • 1.
    Alta produtividade no DesenvolvimentoWeb em Java Kaio Valente ksmvalente@gmail.com @kaiovalente
  • 2.
  • 3.
  • 4.
    Listeners actionEvent Solução?
  • 5.
    <filter> <filter-name>vraptor</filter-name> <filter-class>br.com.caelum.vraptor.VRaptor</filter-class> </filter> <filter-mapping> <filter-name>vraptor</filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping> @Resource public class PropostaController { public List<Proposta> listagem() { return new ArrayList<Proposta>(); } }
  • 6.
  • 7.
    @Component public class PropostaDAO{ ... } @Resource public class PropostaController { private PropostaDAO dao; public PropostaController(PropostaDAO dao) { this.dao = dao; } public List<Proposta> listagem() { return new ArrayList<Proposta>(); } }
  • 8.
    <form action="${pageContext.request.contextPath}/proposta/adicionar"> Descrição: <input type="text" name=“proposta.descricao" /><br/> Preço: <input type="text" name=“proposta.preco" /><br/> <input type="submit" value="Salvar" /> </form> @Resource public class PropostaController { private PropostaDAO dao; private Result result; public PropostaController(PropostaDAO dao, Result result) { this.dao = dao; this.result = result; } public void adicionar(Proposta proposta) { dao.salvar(proposta); result.redirectTo(PropostaController.class).listagem(); } }
  • 9.
    @Resource public class PropostaController{ private Validator validator; public PropostaController(Validator validator) { this.validator = validator; } } public void void adicionar(Proposta proposta) { if (proposta.getDescricao().isEmpty()) { validator.add(new ValidationMessage(“descricao.nao.informada", "erro")); } validator.onErrorUsePageOf(PropostaController.class).listagem(); dao.salvar(proposta); result.redirectTo(PropostaController.class).listagem(); } public void void adicionar(final Proposta proposta) { validator.checking(new Validations() {{ that(!proposta.getDescricao().isEmpty(), "erro", " descricao.nao.informada"); }}); validator.onErrorUsePageOf(PropostaController.class).listagem(); dao.salvar(proposta); result.redirectTo(PropostaController.class).listagem(); }
  • 10.
    • Validação commensagens parametrizadas • Validação com Matchers do Hamcrest • Validação com Bean Validation e Hibernate Validator • Validação com suporte a Internacionalização <ul> <c:forEach items="${errors}" var=“error"> <li> ${error.category} - ${error.message} </li> </c:forEach> </ul>
  • 11.
    @Convert(Estado.class) public class EstadoConverterimplements Converter<Estado> { public Estado convert(String value, Class<? extends Estado> type, ResourceBundle bundle) { if (value == null || value.equals("")) { return null; } Estado estado = new Estado(); try { estado.setId(Long.parseLong(value)); } catch (NumberFormatException e) { estado = null; } return estado; } }
  • 12.
    @Intercepts public class LoginInterceptorimplements Interceptor { private Result result; private UserSession userSession; public LoginInterceptor(Result result, UserSession userSession) { this.result = result; this.userSession = userSession; } public boolean accepts(ResourceMethod method) { return true; } public void intercept(InterceptorStack stack, ResourceMethod method, Object resource) { if (userSession.isLogged()) { stack.next(method, resource); } else { result.redirectTo(LoginController.class).login(); } }
  • 13.
    public vod loadJSon(Propostaproposta) { result.use(Results.json()).from(proposta).serialize(); } Retorno {“proposta": { “descricao": “Proposta 1”}} public vod loadJSon(Proposta proposta) { result.use(Results.json()).from(proposta).include(“itemProposta”).serialize(); } Retorno {“proposta": { “descricao": “Proposta 1“,“itemProposta“ { “codigo”: “cod01"} } } public vod loadJSon(Usuario usuario) { result.use(Results.json()).from(usuario).exclude(“senha”).serialize(); } Retorno {"usuario": { "nome": "Joao", "login": "joao" }}
  • 14.
    <context-param> <param-name>br.com.caelum.vraptor.packages</filter-name> <param-value>br.com.caelum.vraptor.util.jpa</filter-class> </context-param>
  • 15.
  • 16.
    Onde Começar? • vraptor.caelum.com.br/documentacao/v raptor3-guia-de-1-minuto • vraptor.caelum.com.br/documentacao/v raptor3-o-guia-inicial-de-10-minutos
  • 17.
    Obrigado! Kaio Valente ksmvalente@gmail.com @kaiovalente