Obtención de Parámetros de Solicitud HTML con ModelAndView y Filtros

Requisito: Capturar parámetros de solicitudes HTML

Implementación mediante:

  1. Intercepción de solicitudes HTML mediante filtros
  2. Almacenamiento de parámetros usando ModelAndView
  3. Recuperación en páginas HTML mediante expresiones ${clave}

1. Interceptar solicitudes HTML con filtros

Configuración en web.xml:

<filter>
  <filter-name>filtroHtml</filter-name>
  <filter-class>filtros.ProcesadorHtml</filter-class>
</filter>
<filter-mapping>
  <filter-name>filtroHtml</filter-name>
  <url-pattern>*.html</url-pattern>
</filter-mapping>

Código del filtro:

package filtros;

import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class ProcesadorHtml implements Filter {
  
  public void doFilter(ServletRequest solicitud, ServletResponse respuesta, 
                       FilterChain cadena) throws IOException, ServletException {
    
    HttpServletRequest req = (HttpServletRequest) solicitud;
    HttpServletResponse res = (HttpServletResponse) respuesta;
    req.setCharacterEncoding("UTF-8");
    res.setCharacterEncoding("UTF-8");
    
    StringBuilder parametros = new StringBuilder();
    Enumeration<String> nombres = req.getParameterNames();
    
    while(nombres.hasMoreElements()) {
      String nombre = nombres.nextElement();
      parametros.append("&").append(nombre).append("=").append(req.getParameter(nombre));
    }
    
    String contexto = req.getContextPath();
    String ruta = normalizarRuta(req.getRequestURI());
    
    if(ruta.contains(".")) {
      res.sendRedirect(contexto + "/html/cargar?ruta=" + 
                      ruta.substring(contexto.length() + 1, ruta.indexOf(".")) + 
                      parametros);
      return;
    }
    cadena.doFilter(req, res);
  }
  
  private String normalizarRuta(String url) {
    return url.replace("//", "/").replace(":", ":/");
  }
  
  public void init(FilterConfig config) {}
  public void destroy() {}
}

Controlador HTML

package controladores;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;

@Controller
@RequestMapping("/html")
public class ControladorHtml {

  @GetMapping("/cargar")
  public ModelAndView cargarPagina(HttpServletRequest solicitud, String ruta) {
    ModelAndView vista = new ModelAndView(ruta);
    String dominio = solicitud.getServerName();
    int puerto = solicitud.getServerPort();
    String contexto = solicitud.getContextPath();
    
    vista.addObject("rutaBase", 
                   solicitud.getScheme() + "://" + dominio + ":" + puerto + contexto + "/");
    
    vista.addObject("titulo", 
                   solicitud.getParameter("nombre") != null ? solicitud.getParameter("nombre") : "");
    
    return vista;
  }
}

Clase base del controlador

package base;

import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.WebDataBinder;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;

public abstract class ControladorBase {
  
  @InitBinder
  public void configurarBinding(WebDataBinder binder) {
    binder.registerCustomEditor(
      java.util.Date.class, 
      new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)
    );
  }
  
  protected String obtenerRutaBase(HttpServletRequest solicitud) {
    return solicitud.getScheme() + "://" + 
           solicitud.getServerName() + ":" + 
           solicitud.getServerPort() + 
           solicitud.getContextPath();
  }
}

2. Almacenamiento de parámetros con ModelAndView

Los objetos se añaden al ModelAndView mediante addObject() y se envían a la vista.

3. Recuperación en HTML

<script>
  const rutaBase = '${rutaBase}';
  const tituloPagina = '${titulo}';
</script>

Etiquetas: SpringMVC JavaEE ServletAPI ModelAndView Filtros

Publicado el 6-11 06:28