URLs amigables con Spring MVC

0
26617

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 .

Dejar respuesta

Please enter your comment!
Please enter your name here