URLs amigables con Spring MVC

En este tutorial se va a hacer un ejemplo práctico utilizando Spring MVC para la configuración de URLs amigables de nuestra aplicación

URLs amigables con Spring MVC

Las URLs amigables son cada vez más
frecuentes y adictivas. Si implementamos en nuestra aplicación
este tipo de URLs, a medida que el usuario navega en las operaciones
puede visualizar en la barra de navegación URLs tan intuitivas
como miaplicacion.miempresa.com/clientes/misclientes/001/editar y
puede guardar un bookmark para volver a la edición de dicho
cliente.

Existe todo un estándar que no
sólo abarca las URLs amigables llamado REST (Transferencia de
Estado Representacional, ver
http://es.wikipedia.org/wiki/Representational_State_Transfer) donde
se describe cómo llevar el estado de interacción a la
URL, utilización jerárquica de los conceptos,
utilización de los verbos PUT/GET/POST del HTTP, etc.

Sin ser tan ambiciosos podemos
fácilmente implementar en Spring una solución a esta
funcionalidad utilizando los componentes que el framework contempla
para estos casos.

Vamos a hacer un ejemplo práctico
utilizando Spring MVC y para ello haremos:

  • Configuración del URL
    Handler

  • Configuración de los
    controladores

  • Mejora propuesta

Dado que no es el objetivo del tutorial
explicar Spring MVC, comenzaremos desde un nuevo proyecto Spring MVC
o modificando uno existente.

Configuración del URL Handler

La configuración de la
resolución de nombres consiste en incluir en el
applicationContext.xml (o donde hayamos configurado la aplicación)
la definición de un urlMapping
donde la clase que lo implementa sea SimpleUrlHandlerMapping
y en mappings
los pongamos los patrones de path utilizando asteriscos para las
partes que podrían variar cuando se trata de identificadores,
alias, etc. de un concepto. Si ningún patrón se
ajustará, entonces con defaultHandler
definimos cual controlador se invocará.

<bean
id=»urlMapping”
class=»org.springframework.web.servlet.handler.SimpleUrlHandlerMapping»>

<property
name=»defaultHandler» ref=»clienteListar» />

<property
name=»mappings»>

<props>

<prop
key=»/clientes/misclientes/*/editar.html»>
clienteEditar</prop>

</props>

</property>

</bean>

Configuración de los controladores

En el applicationContext.xml (o donde
hayamos configurado los controladores) comprobaremos que todos los
controladores utilizados en el mappings
de urlMapping
estén incluidas:

<bean
id=»login»
class=»com.miempresa.miaplicacion.controller.clienteListar»
/>

<bean
id=»login»
class=»com.miempresa.miaplicacion.controller.clienteEditar»
/>

Y en el propio controlador, en caso de
necesitar obtener un valor incluido en una URL (como en
/clientes/misclientes/001/editar) siempre podemos utilizar algo como:

String[]
valoresUrl = url.split(«/»);

String
idCliente = valoresUrl[2];

Mejora propuesta

Como mejora a esta solución, en
Autentia hemos implementado una subclase del SimpleUrlHandlerMapping
donde implementamos la extracción de los valores
de las variables contenidas en los mismos haciéndolos
configurables desde una propiedad variablesRestUrls
de la clase configurada en el applicationContext.xml.

protected
Object lookupHandler(final String urlPath,

final
HttpServletRequest req) {

//
Obtener el handler

FlowController
controlador = (FlowController) super.lookupHandler(

urlPath,
req);

if
(controlador == null) {

controlador
= (FlowController) super.getDefaultHandler();

}

//
Según el flujo seleccionado, extraer los parámetros de
la URL e

//
inyectarlos como atributos del request

final
String flujoSeleccionado =
controlador.getArgumentHandler().getDefaultFlowId().toLowerCase();

final
String variablesRestUrl =
variablesRestUrls.getProperty(flujoSeleccionado);

if
(variablesRestUrl != null) {

final
String[] variables = variablesRestUrl.split(«/»);

final
String friendlyUrl = urlPath.replace(extensionControlador, «»);

final
String[] valoresUrl = friendlyUrl.split(«/»);

for
(int i = 0; i < variables.length && i <
valoresUrl.length; i++) {

if
(!variables[i].equals(«») &&
!variables[i].equals(«none»)) {

req.setAttribute(variables[i],
valoresUrl[i]);

}

}

}

return
controlador;

}

Como vemos, los valores extraídos
se introducen como atributo de la request utilizando el nombre
indicado.

Un ejemplo de configuración
sería:

<property
name=»variablesRestUrls»>

<value>

login-flow=/none

pglobal-flow=/none

cuentas-flow=/none/none

movimientos-flow=/none/none/aliasCuenta

transferencias-flow=/none

</value>

</property>

Dado que la programación de un
Handler es algo muy sencillo y que customizamos de acuerdo a nuestras
necesidades, no hemos incluído copia de nuestra solución
particular.

Desde Autentia contamos con los
conocimientos y experiencia para ayudarle a aplicar nuevas
tecnologías a su negocio.

No dude en contactarse con nosotros
mediante www.autentia.com .

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

He leído y acepto la política de privacidad

Información básica acerca de la protección de datos

  • Responsable: IZERTIS S.A.
  • Finalidad: Envío información de carácter administrativa, técnica, organizativa y/o comercial sobre los productos y servicios sobre los que se nos consulta.
  • Legitimación: Consentimiento del interesado
  • Destinatarios: Otras empresas del Grupo IZERTIS. Encargados del tratamiento.
  • Derechos: Acceso, rectificación, supresión, cancelación, limitación y portabilidad de los datos.
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad

Ingeniero en Informática

¿Quieres publicar en Adictos al trabajo?

Te puede interesar

22/06/2026

Juan Antonio Jiménez Torres

Vamos a instrumentalizar un SDD para un microservicio bancario. En este artículo sobre SDD - Spec Driven Development, instrumentalizado sobre OpenSpec vamos a construir una PoC de algo más serio que una tabla periódica. Un microservicio bancario muy simplificado que gestione cuentas y permita hacer transferencias

16/06/2026

Juan Antonio Jiménez Torres

Este es el segundo artículo sobre SDD, Spec Driven Development, instrumentalizado sobre OpenSpec. Pero esta vez nos acercaremos usando softwere gratuito. Por un lado OpenCode en lugar de ClaudeCode y usando el modelo gratuito Gemma4 de Google en lugar de otros de pago.

08/06/2026

Juan Antonio Jiménez Torres

Aprenderemos sobre SDD – Spec Driven Development instrumentalizado sobre OpenSpec. Haremos un primer acercamiento usando ClaudeCode con Sonnet, para luego, en un artículo posterior pasarnos a la versión gratuita de OpenCode con Gemma4