Requisito: Capturar parámetros de solicitudes HTML
Implementación mediante:
- Intercepción de solicitudes HTML mediante filtros
- Almacenamiento de parámetros usando ModelAndView
- 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>