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

Comentários

Tags: , , , ,

Deixe uma resposta