Uma forma de aprender uma nova linguagem de programação ou um novo framework é fazer um “Hello World” ou um CRUD, para entender o básico da tecnologia, como ciclo de vida, dependências, configurações, limitações e etc.
Como precisaria aprender como utilizar o Spring MVC e o Struts Tiles, antiga biblioteca do Struts que virou um projeto independente, então desenvolvi um CRUD para praticar e resolvi disponibilizá-lo, tentando explicar o seu funcionamento.
O projeto é um CRUD de cadastro de Modelos de Celulares com apenas dois campos. Simples assim! Quero descrever apenas a parte do Spring MVC e o Struts Tiles, as outras partes da aplicação não serão o foco do post.
O projeto faz conexão com o banco via JDBC e também possui uma infraestrutura para os testes das camadas de DAO e Controller. Utiliza também maven e o framework Spring para Injeção de dependência versão 3.0.3.RELEASE.
O Spring MVC para tratar as requisições entre a interface e o Controller, permitindo a utilização de objetos em um formulário web. Ele é como outros frameworks MVC web para facilitar o desenvolvimento, com a vantagem de ser integrado totalmente com o container Spring IoC, proporcionando todas as vantagens que o Spring proporciona.
Para configurá-lo inicialmente é preciso mapear o servlet DispatcherServlet no web.xml do projeto. Por exemplo:
3 4 5 6 7 8 9 10 11 12 13 | <web-app> <servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring-mvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> |
Na inicialização o servlet ‘spring-mvc’ DispatcherServlet irá procurar pelo arquivo spring-mvc-servlet.xml ( [Nome do Servlet]-servlet.xml ) dentro da pasta WEB-INF do seu projeto. No exemplo acima, todas as requisições serão tratadas também pelo servlet ‘spring-mvc’ DispatcherServlet.
Sobre os Controllers, o Spring possui tipos específicos de controllers de formulário(form-specific controllers), command-based controllers e etc. Para definir que uma classe como Controller basta anotá-la como @Controller como temos no exemplo da classe CelularController
3 4 | @Controller public class CelularController { |
As classes anotadas como @Controller irão interpretar e transformar em dados vindos de um formulário em dados do modelo.
Na CelularController existe outra anotação chamada @RequestMapping, onde você mapeia qual o endereço da URL que precisará acessar para que o método seja chamado, através do parâmetro “value”. O parâmetro “method” existe para definir como vai ser o método de request(GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE). Na classe CelularController temos como exemplo:
3 4 5 6 | @RequestMapping(value = "/cadastro/remove", method = RequestMethod.POST) public String removerModelo(@RequestParam(value = "nome", required = true) String nome, @ModelAttribute Celular celular, WebRequest request) throws Exception { } |
Existe também a anotação @ModelAttribute. Definindo um atributo com essa anotação o Spring irá fazer o bind dos parâmetros vindo do request para os atributos desse objeto.
A grande mágica acontece quando você cria um método é anota como @InitBinder, assim no exemplo:
3 4 5 6 7 8 | @InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(String.class, new StringTrimmerEditor(false));
binder.setValidator((org.springframework.validation.Validator) this.validator);
} |
@InitBinder permite identificar métodos que inicializarão o WebDataBinder que é utilizado para popular os atributos vindos do formulário com os atributos dos objetos anotados com @ModelAttribute.
Para que essas classes mapeadas com @Controller, @ModelAttribute ou @InitBinder sejam Injetadas pelo container do Spring é preciso que no arquivo spring-mvc-servlet.xml seja mapeado o pacote onde essas classes estarão. No caso do exemplo:
3 | <context:component-scan base-package="net.valdemarjr" scoped-proxy="targetClass" /> |
Para fazer a configuração do Struts Tiles com Spring MVC será necessário definir dois beans no spring-mvc-servlet.xml:
3 4 5 | <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView" /> <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer" /> |
E então fazer os métodos das classes de controle retornar a String mapeada no arquivo tiles.xml. Por exemplo no método “processarFormulario”, o retorno no método é “cadastro.formulario”, que está definido como:
3 4 5 | <definition name="cadastro.formulario" extends="titulo"> <put-attribute name="conteudo" value="/WEB-INF/jsp/cadastro/formulario.jsp" /> </definition> |
Fazendo com que a página seja retornada para o JSP “formulario.jsp”.
Nunca tinha utilizado o Spring MVC, achei legal utilizar todo o poder do Spring para um framework MVC e integrado com Struts Tiles que potencializa a capacidade de componentização da camada de apresentação. Bom é isso, o projeto está no github e pode ser baixando, testado e alterado.
Comments
Tags: maven, mvc, spring, Spring MVC, tiles