Spring MVC HanderMapping

La interface HandlerMapping es utilizada por el DispatcherServlet para determinar cual es el controlador que debe manejar una petición HTTP, este componente analiza la URL de la petición y determina a que controlador se debe llamar para responder a la misma, el HandlerMapping utilizado por defecto es DefaultAnnotationHandlerMapping, si utilizamos la anotación @EnableWebMvc o su etiqueta XML equivalente <mvc:annotation-driven /> en la configuración se utilizará la clase RequestMappingHandlerMapping, ambas clases utilizan  las anotaciones @Controller y @RequestMapping.

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"carmelo.spring.controller"})
public class WebAppConfig {

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

Siendo esta nuestra configuración ya tendremos definido un HandlerMapping según lo dicho previamente, con esto podemos definir un controlador usando las anotaciones @Controller y @RequestMapping, los detalles del ViewResolver los puedes ver en el tutorial Spring MVC ViewResolver.

@Controller
public class HomeController {

    @RequestMapping("/home.html")
    public String homeController(Model model){
        return "home";
    }
}

El funcionamiento de este controlador ya lo hemos explicado en tutoriales anteriores, mas específicamente en Spring MVC Controladores, lo que deseamos mostrar es que nuestro HandlerMapping usara la anotación @RequestMapping para responder a una determinada petición.

BeanNameUrlHandlerMapping

El BeanNameUrlHandlerMapping mapea una URL usando el nombre del bean controlador, es decir la URL a la que responder un controlador estará determinada por su nombre, recordemos que podemos indicar el nombre de un bean en la anotación, si este no aparece se utilizara el nombre del método con la letra inicial en minúscula.

Agregamos los siguientes bean a nuestra configuración:

@Bean
public HandlerMapping handlerMapping() {
    return new BeanNameUrlHandlerMapping();
}

@Bean("/inicio.html")
public HomeController homeController() {
    return new HomeController();
}

El primero define el HandlerMapping y el segundo el controlador que responderá a la URL definida por el nombre del bean, en nuestro caso: "/index.html".

public class HomeController extends AbstractController {

    @Override
    protected ModelAndView handleRequestInternal(
            HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        return new ModelAndView("home");
    }
}

Para definir el controlador extendemos la clase AbstractController, el resultado es el siguiente.

Spring MVC HandlerMapping (BeanNameUrlHandlerMapping)

Esta vista es creado usando la tecnología JSP, si deseas conoce más de la misma puedes ir al tutorial Spring MVC Vistas JSP.

SimpleUrlHandlerMapping

Este componente funciona de manera muy similar al anterior, salvo que este utiliza una colección para almacenar las URL y sus correspondientes controladores, usaremos un objeto Properties para este propósito, a través de su método put() ingresamos primero la URL y luego el nombre del controlador para la misma, ejemplo:

@Bean
public HandlerMapping handlerMapping() {
    Properties urlMaps = new Properties();
    urlMaps.put("/index.html", "homeController");

    SimpleUrlHandlerMapping handler = new SimpleUrlHandlerMapping();
    handler.setMappings(urlMaps);

    return handler;
}

@Bean
public HomeController homeController() {
    return new HomeController();
}

Podemos agregar todas las URL y los controladores que deseemos, la clase controladora no necesita cambios, si vemos el navegador debemos visualizar el mismo resultado que en el ejemplo anterior.

En este ejemplo variamos la URL ahora es "/index.html".

Spring MVC HandlerMapping (SimpleUrlHandlerMapping)

Con esto finalizamos el tutorial en el que estudiamos el componente HandlerMapping, vimos los componentes usados por defecto, estos utilizan las anotaciones @Controller y @RequestMapping, también utilizamos los componentes SimpleUrlHandlerMapping y el BeanNameUrlHandlerMapping en nuestro proyecto de ejemplo.

Comentarios

Temas relacionados

Entradas populares de este blog

tkinter Grid

Conectar SQL Server con Java

Controles y Contenedores JavaFX 8 - I

Histogramas OpenCV Python