Arquitetura interna do VRaptor

Fala galera,

Estou estudando as apostilas Fj-11 e FJ-21 após ficar algum tempo afastado da programação. Em um capítulo da apostila FJ-21 fala sobre Frameworks MVC e explica diferentes maneiras que um Framework tem de implementar as “lógicas” da aplicação. Alguns usam uma interface em comum, outros obrigam a herdar classes do Framework e por fim no caso do VRaptor e Spring MVC usam annotations.

Gostaria de entender como o VRaptor e o Spring MVC fazem isso? Tentei olhar no código-fonte de ambos mas não encontrei as respostas que eu queria. Basicamente tenho as seguintes dúvidas:

  1. Ao anotar uma classe com @Controller automaticamente todos os métodos dessa classe viram URLS que podem ser acessadas pela aplicação. Quais as classes fazem isso? E como elas fazem? Tentei procurar por isAnnotationPresente(Controller.class), imaginando que teria uma Servlet principal que faria um Scan nos pacotes e recuperasse as classes que teriam essa anotação, porém não encontrei nenhuma classe.

  2. Quais as classes do VRaptor fazem o papel de orquestrador? Pois nem é preciso declarar nada no Web.xml. Imaginei que teria algum Servlet mapeado com url-pattern “/” que interceptaria todas as requisições e faria esse papel. Porém também não consegue achar tal classe.

Enfim, gostaria de entender melhor o processo como um todo.

Obrigado

Olá,

  1. No Spring framweork, os métodos dessa classe não se tornam URL’s automaticamente, é necessário usar as anotações @RequestMapping, e a partir da versão 4.3, também tem as anotações @GetMapping e @PostMapping

Veja: http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html

No VRaptor4, segundo sua documentação:

O VRaptor automaticamente redirecionará todas as requisições à URI /produtos/lista para esse método. Ou seja, a convenção para a criação de URIs é /<nome_do_controller>/<nome_do_metodo>. Ao terminar a execução do método, o VRaptor fará o dispatch da requisição para o JSP /WEB-INF/jsp/produtos/lista.jsp. Ou seja, a convenção para a view padrão é /WEB-INF/jsp/<nome_do_controller>/<nome_do_metodo>.jsp.

Esse é um caso típico de Convenção sobre Configuração.

A primeira pergunta ficaria mais clara e específica se a tivesse iniciado com “1) No VRaptor 4, ao anotar uma classe com @Controller…”

  1. veja: http://stackoverflow.com/questions/30259153/do-i-really-need-web-xml-for-a-servlet-based-java-web-application

Para entender melhor o Spring MVC: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html

O VRaptor4 tem documentação em português, então pesquise lá primeiro.

Veja também: https://pablonobrega.wordpress.com/tag/convencao-sobre-configuracao/

Acredito que o livro da casa do código ou a documentação do mesmo, não chegam a explicar com exatidão isso.
O código do vraptor está no github, talvez seja uma ótima maneira de vc estudar o mesmo.

Olá, obrigado pelas respostas. Mas na verdade a documentação não tem as informações que eu preciso, a documentação é mais do ponto de vista que quem está usando, o que estou procurando e coisas a respeito do código-fonte.

Quanto ao web.xml, postei essa mesma pergunta na lista do vraptor. O fato de não precisar do web.xml é porque na verdade o VRaptor possui um @WebFilter sendo ele próprio um filtro que mapeia todas as requisições.

Att

Olá,

Cheguei a olhar o código-fonte, mas mesmo assim não ficou claro para mim como o VRaptor implementava alguma coisas.

Talvez o @Lucas_Cavalcanti ou o @rodrigo.turini possam ajudar.

Daniel,

o VRaptor 4 é baseado no CDI, então o que ele faz é marcar a anotação @Controller como “especial”, assim o próprio CDI procura por ela e a usa pra criar os componentes.

Essa é a classe que é rodada pra cada controller que o CDI encontra:

Valeu Lucas pela explicação. Ainda preciso estudar melhor o CDI para entender isso. Enxergava o CDI somente como Injeção de Dependências, mas parece que é bem mais poderoso.

Uma última questão. Entendo que mapear uma notação interna do VRaptor para algum qualifier do CDI faz o CDI procurar e criar os componentes necessários, mas e quanto às URLS? Como por exemplo cada método do VRpator automaticamente vira uma URL? Quem faz esse papel?

Att

No link que eu te mandei o código chama o Router que é o componente que lê os métodos do Controller e transforma em URLs…

Tem outro componente que participa nisso, que é o RoutesParser.