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.