Esta va a ser la primera entrada de blog sobre el mappeo de Friendly URLs en Liferay. Inicialmente vamos a explicaros como acortar las direcciones url y en la próxima entrada os propondremos una recopilación de ejemplos sobre como implementarlas.

Las urls generadas en Liferay pueden ser algo tediosas, es por ello que a partir de la versión 6 Liferay nos ofrece una manera de definirlas para que resulten mucho más sencillas.

Cualquiera que se haya fijado en ellas ha podido apreciar como son urls muy largas, cargadas de parámetros con sus correspondientes valores. Esto hace que las urls no sean legibles y dificulta su entendimiento. Muchas veces no necesitamos añadir todos estos valores, porque no siempre los necesitamos en la petición,  o porque algunos de ellos son valores predeterminados y otros tienen valores constantes.

Para solventar todo esto Liferay propone el friendly URL mapping. Una nueva manera de definir las urls para que estas sean mas cortas y mas fáciles de comprender.

Una friendly url de ejemplo podría ser la siguiente:

http://localhost:8080/web/guest/home/-/my-portlet/edit

Y la url generada equivaliente sería esta:

http://localhost:8080/web/guest/home?p_p_id=myportlet_WAR_myportletportlet&
p_p_lifecycle=0 &p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_count=2&
_myportlet_WAR_myportletportlet_mvcPath=%2Fedit.jsp

Si comparamos la dos urls podemos ver como las friendly urls nos permiten quitar todo lo innecesario y mostrar en la url lo realmente importante siendo legible. En la primera url, podemos observar como la parte “friendly” empieza con “-/” y continua con la ruta “reducida”. Por contra en la segunda, observamos una serie de parámetros que, además de ser poco relevantes para el usuario dificultan la lectura de la misma. En la siguiente tabla recopilamos los parámetros que podemos encontrar en una url de Liferay y a que equivalen exactamente.

NombreDescripción
p_p_idEl id del portlet.
p_p_lifecycleLa etapa del ciclo de vida de la actual request. Puede tomar tres valores:0: fase render o render URL, 1: fase action o action URL o 2: server resource URL.
p_p_stateEl estado de la ventana del portlet: normal, maximizada, or minimizada.
p_p_modeEl modo del portlet: view, edit o help.
p_p_col_idHace referencia al id de la columna en el layout donde esta situado el portlet.
p_p_col_posHace referencia a la posición en la columna donde el portlet está situado.
p_p_col_countEs el número de columnas en el layout.
[p_p_id]_jspPageParámetro jspPage prefijado con el id del portlet, MVCPortlet lo emplea para la navegación entre páginas.
mvcPathPrarámetro que pasamos desde el tag <portlet:param/>.

Hemos de tener en cuenta que dentro de Liferay tenemos diferentes tipos de Portlet Urls, podemos crear ACTION URL, RENDER URL y RESOURCE URL y que a cada una podemos añadir además los parámetros que creamos necesarios. En la tabla anterior mostramos únicamente los generales.

Pasos a seguir para agregar esta funcionalidad:

  1. Declarar el mapper

Lo primero que tenemos que hacer es declarar un friendly URL mapper. Esto se debe hacer editando el fichero liferay-portlet.xml. Tenemos que añadir una serie  de tags de configuración, se recomienda hacerlo después del tag </icon>y antes de <instanceable>

Con esto acabamos de añadir 3 parámetros al liferay-portlet.xml:

  • Mapper class
  • Mapping
  • Routes

La Mapper Class es la clase implicada en mappear las friendly urls en Liferay. El mapping es el nombre con el que la ruta será identificada. Y por último routes es un fichero dónde se describen una serie de parámetros y patrones que ayudan a parsear las urls y hacen que se vean menos complicadas.

  1. Implementación de la Mapper Class

Como hemos dicho anteriormente para realizar la conversión entre tipos de urls necesitamos una clase Java que se encargue de ello. Liferay tiene su propia clase implementada para que la podamos utilizar por defecto, su nombre es DefaultFriendlyURLMapper.

En nuestro ejemplo es la que utilizamos y la podéis especificar del mismo modo entre los tags: 

<friendly-url-mapper-class>
         com.liferay.portal.kernel.portlet.DefaultFriendlyURLMapper
</friendly-url-mapper-class>

Pero si queremos, podemos hacer el mappeado con una implementación propia del Mapper Class en función de nuestras necesidades. El único requisito que debe cumplir nuestra propia clase es, o bien implementar la interfaz FriendlyURLMapper o extender la clase DefaultFriendlyURLMapper.

  1. Configurar el fichero xml de friendly-url-routes

Crearemos el fichero my-portlet-friendly-url-routes.xml para declarar las rutas. Por convención este fichero se ha de colocar en el mismo package dónde tengáis las clases Java. En el añadiremos una serie de tags, que nos permetirán declarar el patrón para parsear las urls y declarar una serie de parámetros y sus valores para configurar en las urls. Es importante informar el nombre completo del archivo “friendly-url-routes.xml”, incluyendo el package en el archivo cuando declaramos el mapper en el liferay-portlet.xml.

Para su mejor compresión definiremos los tags implicados a continuación antes de entrar de lleno en la configuración.

  • Routes: Es el tag que contiene el conjunto de elementos Friendly URL mapper routes (tag equivalente: “route” en el xml).
  • Route: Elemento que contiene la información de cada dirección url
  • Pattern: Es el elemento que especifica el patrón que han de seguir las friendly url. Es la cadena que aparece en la barra de direcciones. Si nuestro portlet fuera instanciable, deberíamos añadir en él el id de la instancia del portlet.

Hemos de tener en cuenta que hemos de localizar los tags en el orden que se listan, sino nuestra url no será válida y obtendremos un “syntax error”.

  • Ejemplo de la configuración de nuestro archivo my-portlet-friendly-url-routes.xml:
<?xml version="1.0"?><!DOCTYPE routes PUBLIC "-//Liferay//DTD Friendly URL Routes 6.2.0//EN"
"http://www.liferay.com/dtd/liferay-friendly-url-routes_6_2_0.dtd">

<routes>
      <route>
       <pattern>/page/{jspPageName}</pattern>
       <generated-parametername"mvcPath">/page/{jspPageName}.jsp</generated-parameter>
      </route>
</routes>
  • Ejemplo de la configuración de nuestro archivo my-portlet-friendly-url-routes.xml, para portlets instanciables:
<?xml version="1.0"?><!DOCTYPE routes PUBLIC "-//Liferay//DTD Friendly URL Routes 6.2.0//EN"
"http://www.liferay.com/dtd/liferay-friendly-url-routes_6_2_0.dtd">

<routes>
      <route>
       <pattern>/{instanceId}/action/{actionName}</pattern>
       <generated-parametername"javax.portlet.action">{actionName}</generated-parameter>
       <ignored-parametername"p_auth">/</ignored-parameter>
       <ignored-parametername"p_auth">/</ignored-parameter>
       <implicit-parametername"p_p_lifecycle">1</implicit-parameter>
       <implicit-parametername"p_p_state">">normal</implicit-parameter>
       <implicit-parametername"p_p_mode">view</implicit-parameter>
      </route>
</routes>

Se ha de añadir una nueva entrada entre las llaves <route></route>. El pattern es una expresión regular que permite incluirle parámetros con valor númerico como en las urls extendidas. Esto nos puede servir para pasar parámetros en las llamadas.

Los parámetros a incluir en la url pueden ser de diferentes tipos en función de nuestras necesidades. Los listamos y detallamos a continuación. Sobretodo hemos de tener en cuenta que para que nuestra URL este bien formada hemos de seguir el orden que especificamos. Por orden:

  • generated-parameter
  • ignored-parameter
  • implicit-parameter
  • overridden-parameter

 Generated-parameter, este elemento especifica el patrón de un parámetro que será generado a partir de otros parámetros en el momento de reconocimiento de la url.  Cuando una url está construida estos parámetros virtuales son parseados desde el generated-parameter y se vuelven disponibles para que el patrón los incluya.

Como en el ejemplo anterior:

<routes>
      <route>
       <pattern>/page/{jspPageName}</pattern>
       <generated-parametername"mvcPath">/html/jsps/{jspPageName}.jsp</generated-parameter>
      </route>
</routes>

El atributo nombre especifica el nombre del parámetro generado.

Ignored-parameter, este elemento especifica que este parámetro en concreto será ignorado y no incluido en la url generada. Este tipo de parámetros no tiene ningún efecto en el reconocimiento de las urls.

<routes>
      <route>
       <pattern>/page/{jspPageName}</pattern>
       <generated-parametername"mvcPath">/html/jsps/{jspPageName}.jsp</generated-parameter>
       <ignored-parametername"p_auth"></ignored-parameter>
       <ignored-parametername"p_p_id"></ignored-parameter>
      </route>
</routes>

El atributo nombre especifica el nombre del parámetro que se ignorará.

Implicit-parameter, este elemento especifica un parámetro que no está presente en el patrón de la ruta. Son parámetros que Liferay puede asumir cómo comunes para un determinado tipo de ruta. De este modo Liferay los asume para este tipo de rutas sin necesidad de que nosotros tengamos que añadirlas en el momento de definir la URL.

<routes>
      <route>
       <pattern>/view</pattern>
       <implicit-parametername"p_p_lifecycle">0</implicit-parameter>
       <implicit-parametername"jspPage">/html/jsps/view.jsp</implicit-parameter>
      </route>
</routes>

El atributo nombre especifica el nombre del parámetro implícito.

Overridden-parameter, este elemento especifica un parámetro cuyo valor será anulado en el momento en el que se reconoce la URL. El valor se anulará independientemente de si tenía un valor previo diferente, y tomará el valor de un parámetro implícito o de uno extraído de la URL.

<routes>
      <route>
       <pattern>/product/edit/</pattern>
       <ignored-parametername"productId"></ignored-parameter>
       <implicit-parametername"jspPage">/editProduct.jsp</implicit-parameter>
       <overridden-parametername"productId">0</overridden-parameter>
      </route>
</routes>

El atributo nombre especifica el nombre del parámetro que será anulado.

Siguiendo estos sencillos pasos y estableciendo la configuración necesaria, el portlet tendrá unas urls reducidas y más legibles. 

En la próxima entrada podréis ver con más detalle diferentes ejemplos de implementación de friendly URLs. Esperamos que lo pongáis en práctica y esta guia os sirva de ayuda.


Leave a Reply

Your email address will not be published. Required fields are marked *