Introdução ao VRaptor em Java

Introdução ao VRaptor em Java

1. Overview

Neste artigo, daremos uma olhada emVRaptor, uma estrutura da web Java MVC simples e direta que utiliza a tecnologia Java Contexts e Dependency Injection e é fácil de entender.

Assim como Spring -it relies heavily on annotations and works great with Hibernate.

Ele também vem com alguns plugins úteis - como para internalização e teste de unidade.

Então, vamos explorar os diferentes componentes do VRaptor e criar um projeto de amostra.

2. Dependências e configuração do Maven

Uma maneira rápida de começar a trabalhar é baixarvraptor-blank-project-distribution doofficial repository.

O projeto em branco é apenas um esqueleto que pode ser desenvolvido para se tornar um aplicativo da Web completo.

Depois de baixar e descompactar o projeto, vamos renomear o diretório paravraptor (ou qualquer outro nome).

O diretório deve conter:

  • src/

  • pom.xml

  • eREADME.md

O projeto é baseado em Maven e vem com o plugintomcat7 Maven, que fornece o contêiner de servlet para executar o aplicativo.

Ele também vem com umIndexController padrão que possui apenas um método -index().

Por padrão, a visualização a ser renderizada por este método está localizada emwebapp/WEB-INF/jsp/index/index.jsp - segue a convençãoWEB-INF/jsp/controller_name/method_name.

Para iniciar o servidor, executaremos o comandomvn tomcat7: _run_ a partir da raiz do projeto.

Se for bem-sucedido, se visitarmoshttp://localhost:8080,, um navegador exibirá “It works!! VRaptor!“.

If we face the “java.lang.LinkageError: loader constraint violation”, then, we have to modify the following dependencies in pom.xml:


    org.jboss.weld.servlet
    weld-servlet-core
    2.1.2.Final
    
        
        org.jboss.spec.javax.el
        jboss-el-api_3.0_spec
        
    


    org.jboss.weld
    weld-core-impl
    2.1.2.Final
    
       
          org.jboss.spec.javax.el
      jboss-el-api_3.0_spec
       
    

O culpado é oel-api que está incluído emweld-servlet-coreeweld-core-impl com escopocompile; isso leva a um conflito de dependências.

As seguintes dependências serão necessárias ao longo da linha, então vamos incluí-las empom.xml:


    br.com.caelum.vraptor
    vraptor-freemarker
    4.1.0-RC3

    mysql
    mysql-connector-java
    8.0.8-dmr



    org.freemarker
    freemarker
    2.3.27-incubating

A versão mais recente dos artefatosvraptor-freemarker,mysql-connector-java efreemarker pode ser encontrada no Maven Central.

Agora que estamos prontos, vamos construir um blog simples.

3. Suporte para Hibernar

O VRaptor fornece vários plugins para interação com bancos de dados, um deles é ovraptor-hibernate que __ funciona com Hibernate 4.

O plugin torna o beanSessionFactory do Hibernate disponível em tempo de execução via CDI.

Com o plugin instalado, precisamos de um arquivo de configuração padrão do Hibernate - um exemplo pode ser encontrado no repositório.

O VRaptor usa uma técnica chamada Producers para disponibilizar objetos para o gerenciamento de DI. Mais detalhes sobre estehere.

4. Definindo Rotas Web no VRaptor

No VRaptor, as definições de rota residem em controladores que são simplesmente objetos Java anotados com@Controller - assim como no Spring.

A anotação@Path é usada para mapear um caminho de solicitação para um controlador específico e as anotações@Get, @Post, @Put, @Deletee@Patch são usadas para especificar os tipos de solicitação HTTP.

A configuração do mapeamento de rota é semelhante ao método JAX-RS, mas não implementa o padrão oficialmente.

Além disso, ao definir um caminho, é possível especificar uma variável de caminho entre chaves:

@Get("/posts/{id}")

O valor deid pode então ser acessado dentro de um método de controlador:

@Get("/posts/{id}")
public void view(int id) {
    // ...
}

Quando um formulário é enviado para uma rota específica, o VRaptor pode preencher automaticamente um objeto com os dados do formulário enviados.

Vamos ver isso em ação na próxima seção do artigo.

5. Visualizações e mecanismo de modelo

Por padrão, as visualizações podem ser implementadas usando JSP. No entanto, outros mecanismos de modelo também podem ser usados ​​- neste artigo, trabalharemos com o Freemarker.

Vamos começar criandoindex.ftl and saving no diretório de visualização padrão (src / main / resources / templates):



    
    VRaptor Blank Project


It works!! ${variable}

Agora, podemos usar a visualização definida com uma classeFreemarkerView para renderização de visualização:

@Path("/")
public void index() {
    result.include("variable", "VRaptor!");
    result.use(FreemarkerView.class).withTemplate("index");
}

O objetoResult mantém o estado do modelo - ele possui métodos para redirecionar para outra página, URL ou método de controlador; ele pode ser injetado no controlador usando CDI.

Em nosso exemplo, ovariable é resolvido pelo Freemarker. Assim, o marcador${variable} emindex.ftl é substituído pelo “VRaptor!”.

Usos mais avançados estão documentadoshere.

6. Exemplo de tratamento de envio de formulário

Vamos ver como podemos lidar com envios de formulários com validação:

@Post("/post/add")
public void add(Post post) {
    post.setAuthor(userInfo.getUser());
    validator.validate(post);
    if(validator.hasErrors()) {
        result.include("errors", validator.getErrors());
    }
    validator.onErrorRedirectTo(this).addForm();

    Object id = postDao.add(post);

    if(Objects.nonNull(id)) {
       result.include("status", "Post Added Successfully");
         result.redirectTo(IndexController.class).index();
    } else {
        result.include(
          "error", "There was an error creating the post. Try Again");
        result.redirectTo(this).addForm();
    }
}

O objetoPost é validado primeiro usandoJava bean validation antes de ser persistido no banco de dados usandopostDao.add().

Os campos do objetoPost são preenchidos automaticamente a partir dos valores dos dados do formulário enviados - que correspondem aos campos de entrada do formulário no arquivo de visualização.

Observe que o nome do campo de entrada deve ser prefixado com o nome do objeto em minúsculas.

Por exemplo, a visualização responsável por adicionar uma nova postagem possui campos de entrada:post.title epost.post que correspondem aos campostitleepost emPost.java respectivamente:



O arquivoadd.ftl completo pode ser encontrado no código-fonte.

Se houver um erro no envio do formulário, a mensagem de erro será incluída e o usuário redirecionado para o mesmo métodoadd():

if(validator.hasErrors()) {
    result.include("errors", validator.getErrors());
}
validator.onErrorRedirectTo(this).addForm();

7. Conclusão

Em conclusão, olhamos para o VRaptor de relance e vimos como a funcionalidade básica do MVC pode ser alcançada.

Odocumentation contém mais detalhes sobre a estrutura, bem como os plug-ins disponíveis.

O código-fonte completo, incluindo uma amostradatabase.sql, está disponívelover on Github.