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:
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.
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.
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
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…”
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.
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?