Spring Agregar un Servlet o Filtro Adicional

Como sabemos el framework Spring MVC dispone de su propio Servlet, el llamado DispatcherServlet encargado de despachar las peticiones a los distintos controladores de nuestra aplicación web, pero que sucede si deseamos agregar nuestra propia implementación de un Servlet o tal ves un filtro, Spring nos permite agregar filtros o servlets adicionales de la menara que mostramos en seguida.

Agregar un Servlet es sencillo, solo debemos implementar la interface WebApplicationInitializer.

Este es nuestro Servlet demostrativo, no hace gran cosa, la idea es demostrar como se integra el mismo al framework Spring Web, puedes saber más sobre estas clases en, Introducción a los Servlet 3.1.

public class MyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        
        PrintWriter pw = resp.getWriter();
        pw.println("Hello Servlet...");    
    }
}

Para registrar esta clase usaremos el método addServlet() del objeto ServletContext en donde indicamos el nombre la y clase que implementa el Servlet, usando addMapping() mapeamos las URL que manejará.

public class MyServletInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        ServletRegistration.Dynamic myServlet = servletContext.addServlet("myServlet", MyServlet.class);
        myServlet.addMapping("/custom/");
    }
}

Esto es todo lo que requerimos, el resto de la aplicación corresponde a la configuración e inicialización del DispatcherServlet de Spring, para demostrar que ambos servlets funcionan en conjunto, agregamos una página .jsp que será manejada por Spring MVC.

Clase de inicialización: /carmelo/spring/WebAppInitializer

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebAppConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

}

Clase de configuración: /carmelo/spring/WebAppConfig

@EnableWebMvc
@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/", ".jsp");
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
    }
}

Si corremos y probamos en el navegador:

DispatcherServlet de Spring MVC

Agregar Servlet en Spring

De un modo muy similar también podemos registrar un filtro, usaremos la misma clase, solo que esta vez utilizaremos el método addFilter() del objeto ServletContext, igual debemos indicar el nombre del filtro y la clase que lo implementa, además de las URL sobre la que el mismo trabaja.

public class MyServletInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        FilterRegistration.Dynamic filter = servletContext.addFilter("myFilter", MyFiltro.class);
        filter.addMappingForUrlPatterns(null, false, "/custom/");     
    }
}

Hemos visto lo fácil que es agregar nuestros propios servlets o filters a una aplicación Spring Web MVC, debemos mencionar que hemos realizado toda la configuración usando código Java, esta solo está disponible si tenemos soporte como mínimo para la especificación Servlet 3.0, si no lo tienes deberás usar XML. 

Descargar código: agregar-servlet-spring.zip

Comentarios

Temas relacionados

Entradas populares de este blog

tkinter Grid

Conectar SQL Server con Java

Controles y Contenedores JavaFX 8 - I

tkinter Canvas