Las URLs de un portlet tienen sus particularidades, ¿Sabés cómo acceder a ellas desde tus vistas?
En el último artículo vimos que para poder realizar peticiones a nuestros portlets necesitamos usar sus URLs, pero estas no son absolutas como estamos acostumbrados, sino que son generadas dinámicamente por nuestro portal. Tenemos 2 formas de obtenerlas, una nos la provee JSP (si utilizamos esta tenología para nuestras vistas) y la otra es parte de la especificación de portlets, veamos como obtenerlas y algunos ejemplos.
Java Server Pages
Con JSP podemos generar paginas web de manera dinámica utilizando Java. Para lograr esto nos provee de una serie de tags que nos deja ejecutar codigo java dentro de la página, además de los tags standard la especificación de portlets pone a nuestra disposición una serie de tags que nos permite crear las url directamente en nuestro archivo .jsp.
Tags para acceder a las url
<portlet:renderURL/> <portlet:actionURL/> <portlet:resourceURL/>
Con estos tags podemos generar una url en el lugar, por ejemplo podríamos tener un link a una vista de la siguiente manera:
<a href="/<portlet:renderURL/>">Render</a>
Ya que no especificamos ningun parámetro esta url irá al metodo render por defecto de nuestro Controller. Si bien esta forma de generar la url nos sirve, podemos mejorar la legibilidad de nuestro JSP guardandola en una variable con el atributo var:
<portlet:renderURL var="miURLRender" />
De esta manera, podemos utilizar el expression language de las JSP para acceder a la variable utilizando la notacion ${variable}
<a href="/${miURLRender}">Render</a>
Si necesitamos agregar parámetros a nuestras URL los podemos agregar como tags hijas del tag de url, pudiendo especificar el nombre y valor del parámetro:
<portlet:actionURL var="crearUsuarioURL"> <portlet:param name="action" value="crear"/> </portlet:actionURL>
Forms
Como ejemplo de uso de la ultima url que creamos, podemos tener un formulario que nos permita ingresar el nombre y apellido de un nuevo usuario, al estar usando spring mvc, tenemos a disposición una serie de tags para hacer el nexo entre los datos que ingresamos y un objeto del modelo, un simple formulario se vería de la siguiente manera:
El código que nos permite generarlo es similar al html, pero hace uso de la biblioteca de tags de form de spring MVC, que nos permite interactuar con el modelo.
En este ejemplo vamos a usar el tag <form:form> y el tag <form:input>, pero tenemos muchas mas opciones según nuestras necesidades. Con el tag form especificamos el action (a que url vamos a enviar la petición) y podemos especificar el modelAttrbute, que nos dice a que objeto de nuestro modelo vamos a pasarle los datos ingresados.
Para poder utilizar estas etiquetas debemos declarar el namespace al principio de nuestra jsp junto con los otros que utilicemos, por ejemplo:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
Dentro del tag form podemos tener uno o varios inputs, en este caso de texto, a los que indicaremos por parametro el path: el nombre del atributo del objeto que deseamos setear.
<form:form action="${crearUsuarioURL}" modelAttribute="user"> Nombre: <form:input path="nombre" /> <br/><br/> Apellido: <form:input path="apellido" /> <br/><br/> <input type="submit" value="Crear" /> </form:form>
Con el nombre y apellido que ingresemos, al tocar el botón de crear, se generará una petición a nuestro portlet y podrá recibir como @ModelAttribute el objeto user y utlizarlo directamente.
Si utilizamos liferay debemos agregar la siguiente línea al archivo liferay-portlet.xml, dentro del tag correspondiente al nuestro para evitar tener que agregar el espacio de nombres a los inputs.
<requires-namespaced-parameters>false</requires-namespaced-parameters>
AJAX
Para realizar una peticion ajax necesitamos una url que identifique nuestro recurso, veamos como crearla desde nuestro JSP
<portlet:resourceURL id="jsonIvan" var="urlIvan"/>
Vemos que la estructura es similar a las url anteriores pero aparece el atributo id, que nos permite identificar a que recurso nos estamos refiriendo. Esta url es accesible ahora desde nuestra JSP, pero las peticiones ajax las solicitará el cliente desde javascript, una forma simple de darle acceso a js a nuestra url es declarar una variable dentro de un tag script en nuestra jsp:
<script> var personaURL = '${urlIvan}'; </script>
Con esta variable y cualquier biblioteca de ajax podremos realizar la petición y, por ejemplo, mostrarla por consola:
fetch(personaURL) .then(response => response.json()) .then(data => console.log(data));
Otras tecnologías de vista
portletMVC4Spring nos da la posibilidad de utilizar Thymeleaf como motor de plantillas en nuestros portlets, como este template engine no nos brinda una herramienta para crear las url en el template, debemos utilizar la otra forma de creación para acceder a nuestras URL. Luego de tenerlas podremos utilizar los tags de form con normalidad. Si ya conocés thymeleaf esta forma puede resultarte de utilidad.
URLs desde el controller
Tenemos la opción de crear las URL programáticamente en nuestro método de render, para esto contamos con los métodos createRenderURL, createResourceURL y createActionURL de RenderResponse, veamos como se crearían las últimas 2 urls de la sección anterior desde el controller:
ActionURL actionURL = renderResponse.createActionURL(); actionURL.getActionParameters().setValue("action", "errorRedirect"); modelMap.put("redirigirAErrorURL", actionURL);
- Creamos una url de action con createActionURL
- Obtenemos la lista de parámetros de nuestra url con getActionParameters y con setValue agregamos nuestro nuevo parámetro.
- Agregamos la url al model bajo la clave redirigirAErrorURL
De manera similar podemos crear la URL de resource:
ResourceURL resourceURL = renderResponse.createResourceURL(); resourceURL.setResourceID("jsonIvan"); modelMap.put("urlIvan", resourceURL);
- Creamos una url de action con createResourceURL
- Especificamos nuestro id con setResourceID
- Agregamos la url al model bajo la clave urlIvan
De esta manera tenemos disponibles las url dentro del model de SpringMVC y podemos acceder desde las vistas.
Seguimos sumando herramientas para el desarrollo de portlets con Spring: ya podemos generar las url para nuestros métodos definidos en el controller e interactuar con este desde el front-end de nuestro portlet, espero que con estos ejemplos tengas más claro el funcionamiento de los portlets con MVC ¡Hasta la próxima!