Vamos a crear un portlet con un poquito de chicha utilizando Liferay IDE, no es el típico hola mundo, sino un pequeño formulario, así aprenderemos como procesar un formulario con Liferay.
Lo primero será crear el portlet, como vemos aquí:

Lo añadimos a Tomcat.

Con esto tenemos creado un portlet “Hola mundo”, pero vamos a ir un poco más allá, vamos a procesar un formulario para ver cómo se trabaja con los distintos modos del portlet y así tener un portlet con algo de funcionalidad.
Lo primero que vamos a hacer es crear una clase llamada UserRegistrationPortlet que extienda a GenericPortlet, esta clase estará dentro de la carpeta src, en el paquete com.jesuslc

Aunque antes vamos a explicar un poco el diseño del portlet.
Construiremos un portlet como este, donde tenemos un formulario con 3 cajas de texto y con 2 botones (enviar y reset). Además carga el dominio por defecto (especificado en portlet.xml) (@liferay.com)

Solo tiene un campo obligatorio (email) si lo rellenamos todo nos muestra los datos así. Este portlet no guarda nada en base de datos, solo muestra los datos del formulario.

Como vimos en otro post tenemos 3 modos (VIEW,EDIT y HELP) el modo view es que vemos al arrastrar el portlet a Liferay, los otros dos modos los explicaremos más adelante.
Para que todo nos quede claro, este es el diagrama de flujo del portlet.

Ahora vamos manos a la obra.
Lo primero es sobrescribir el método init() para que aparezca por defecto el dominio.
Después creamos los métodos para renderizar cada uno de los modos. Así que vallamos por partes.
Creamos el método renderForm para renderizar VIEW, esté método comprueba que primero si estamos en la página 2 (con los datos metidos) de ser así nos redirige a la página “success.jsp” (no creada), después comprueba si ha habido error al procesar el formulario (email no válido), en este caso muestra el mensaje de error. Si todo ha ido bien es que estamos al principio, es decir, el método nos lleva a la página de inicio (registration.jsp)
package com.jesuslc;
import java.io.IOException;
import java.util.ResourceBundle;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.PortletURL;
import javax.portlet.ProcessAction;
import javax.portlet.RenderMode;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
/**
* UseRegistrationPortlet class extends the GenericPortlet abstract class to
* implement the portlet functionality.
*
* @author jesuslc
*
*/
public class UserRegistrationPortlet extends GenericPortlet {
private String defaultEmail;
/*
* Overrides the init method of the GenericPortlet class to obtain the value
* of the defaultEmail initialization parameter specified in portlet.xml
* file. (non-Javadoc)
*
* @see javax.portlet.GenericPortlet#init()
*/
public void init() {
defaultEmail = getPortletConfig().getInitParameter("defaultEmail");
}
/**
* Renders the registration form or success JSP based on the value of
* request attribute actionStatus.
*
* @param request
* @param response
* @throws PortletException
* @throws IOException
*/
@RenderMode(name = "VIEW")
public void renderForm(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
// -- dispatch request to success.jsp if actionStatus is success
if ("success".equalsIgnoreCase((String) request
.getAttribute("actionStatus"))) {
PortletURL homeUrl = response.createRenderURL();
request.setAttribute("homeUrl", homeUrl);
getPortletContext()
.getRequestDispatcher("/WEB-INF/jsp/success.jsp").include(
request, response);
return;
}
// -- create action and render URLs for the registration form.
// -- Reset hyperlink fires a render request and Submit button
// -- results in an action request
PortletURL registerUserActionUrl = response.createActionURL();
registerUserActionUrl.setParameter(ActionRequest.ACTION_NAME,
"registerUserAction");
PortletURL resetRenderUrl = response.createRenderURL();
request.setAttribute("registerUserActionUrl", registerUserActionUrl);
request.setAttribute("resetRenderUrl", resetRenderUrl);
// -- if actionStatus is error then show the registration form populated
// -- with values that were entered by the user
if (!"error".equalsIgnoreCase((String) request
.getAttribute("actionStatus"))) {
request.setAttribute("email", defaultEmail);
}
getPortletContext().getRequestDispatcher(
"/WEB-INF/jsp/registrationForm.jsp").include(request, response);
}
/**
* Registers the user with the system. The current implementation of this
* method doesn't save user information.
*
* @param request
* @param response
* @throws PortletException
* @throws IOException
*/
@ProcessAction(name = "registerUserAction")
public void registerUser(ActionRequest request, ActionResponse response)
throws PortletException, IOException {
String email = request.getParameter("email");
// --set the information entered by the user on the registration
// --form as request attribute.
// -- NOTE : You can't transfer complex objects
// -- from action request to render request using setRenderParameter
//-- method
request.setAttribute("user", new User(
request.getParameter("firstName"), request
.getParameter("lastName"), email));
//-- if email is not entered, show an error message. the
//-- message is read from the resource bundle and forwarded
//-- to render request as request attribute
if (email == null || email.trim().equals("")) {
ResourceBundle bundle = getPortletConfig().getResourceBundle(
request.getLocale());
request.setAttribute("errorMsg", bundle
.getString("email.errorMsg.missing"));
//--set actionStatus to error
request.setAttribute("actionStatus", "error");
} else {
// --save the user information in the database - not implemented yet
// -- to show the success page, pass the information of success to
// render method
request.setAttribute("actionStatus", "success");
}
}
/**
* Renders the preferences page for the portlet.
*
* @param request
* @param response
* @throws PortletException
* @throws IOException
*/
@RenderMode(name = "EDIT")
public void renderPrefs(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
getPortletContext()
.getRequestDispatcher("/WEB-INF/jsp/preferences.jsp").include(
request, response);
}
/**
* Renders the help page for the portlet.
*
* @param request
* @param response
* @throws PortletException
* @throws IOException
*/
@RenderMode(name = "HELP")
public void renderHelp(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
getPortletContext().getRequestDispatcher("/WEB-INF/jsp/help.jsp")
.include(request, response);
}
}
Ahora tenemos que crear el método que procesa el formulario (@ProcessAction(name = «registerUserAction») este método lo único que hace es establecer las variables con los valores recogidos en el formulario y crear un objeto de la Clase User (todavía no la hemos creado), por tanto dará un error.

Consejo: Puede que por defecto se nos importe un clase del paquete HSQLDB, eliminar ese import. Lo que nosotros queremos es crear la clase User.
Creamos la Clase User con un constructor con 3 parámetros, hacemos que implemente Serializable, también creamos los métodos getter.
package com.jesuslc.userregistration;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1309605526151913956L;
private String firstName;
private String lastName;
private String email;
public User(String parameter, String parameter2, String email) {
firstName = parameter;
lastName = parameter2;
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
En este momento ya podemos crear nuestra primera página JSP, para ello creamos un nuevo archivo JSP dentro de WEB-INF/jsp

Y este es el formulario que tenemos que crear:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ page contentType="text/html" isELIgnored="false" %>
<fmt:setBundle basename="content.Language"/>
<form action="<c:out value='${requestScope.registerUserActionUrl}'/>" method="POST">
<table width="200px">
<tr>
<td colspan="2">
<font color="#FF0000"><c:out
value="${requestScope.errorMsg}"/></font>
</td>
</tr>
<tr>
<td><fmt:message key="label.firstName"/></td>
<td><input type="text" name="firstName" value="${requestScope.user.firstName}"></input></td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td><fmt:message key="label.lastName"/></td>
<td><input type="text" name="lastName" value="${requestScope.user.lastName}"></input></td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td><font color="#FF0000"><b>*</b></font> <fmt:message key="label.email"/></td>
<td><input type="text" name="email" value="${requestScope.email}"></input></td>
</tr>
<tr>
<td> </td>
</tr>
<tr align="center">
<td colspan="2">
<input type="submit"/>
<a href="<c:out value='${requestScope.resetRenderUrl}'/>">
<b><fmt:message key="label.reset"/></b>
</a>
</td>
</tr>
</table>
</form>
TIP: Puede que nos aparezca un error como este “Can not find the tag library descriptor for http://java.sun.com/jsp/jstl/core ” tan solo debemos copiar estas librerías en la carpeta lib

De la misma forma que hemos creado registrationForm.jsp, creamos ahora success.jsp. Esta página es la que se muestra después de rellenar el formulario y pulsar en “Enviar”.
Este es el código:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ page contentType="text/html" isELIgnored="false" %>
<fmt:setBundle basename="content.Language"/>
<table>
<tr>
<td colspan="2"><fmt:message key="success.message"/></td>
</tr>
<tr>
<td align="right"><b><fmt:message key="label.firstName"/></b></td>
<td><c:out value="${requestScope.user.firstName}"/></td>
</tr>
<tr>
<td align="right"><b><fmt:message key="label.lastName"/></b></td>
<td><c:out value="${requestScope.user.lastName}"/></td>
</tr>
<tr>
<td align="right"><b><fmt:message key="label.email"/></b></td>
<td><c:out value="${requestScope.user.email}"/></td>
</tr>
<tr>
<td colspan="3">
<a href="<c:out value='${requestScope.homeUrl}'/>">
<b><fmt:message key="label.home"/></b>
</a>
</td>
</tr>
</table>
Volvemos a hacer lo mismo para crear help.jsp
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<fmt:setBundle basename="content.Language"/>
<table width="200px">
<tr>
<td>
<fmt:message key="help.message"/>
</td>
</tr>
</table>
Y por último para preferences.jsp
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<fmt:setBundle basename="content.Language"/>
<table width="200px">
<tr>
<td>
<fmt:message key="preferences.message"/>
</td>
</tr>
</table>
TIP: Puede algunas cosas os parezcan raras, pero no os preocupéis. En sucesivos post iré entrando más a fondo en cada uno de los componentes de un portlet.
Ahora vamos a crear un archivo para el soporte del idioma. Como hemos visto los elementos que aparecen por pantalla como “Last name” aparecen en distintos archivos, por ello lo mejor es tener un punto común. Un archivo de properties que podemos modificar y que se modifiquen todos los items. Este archivo servirá en un futuro para explicar los portlets multiidioma.
Por ello ahora debemos crear un nuevo package llamado content que cuelga del proyecto y dentro de ese nuevo package un archivo llamado languaje.properties así.
Este archivo tiene el siguiente contenido:
category.com.jesuslc=Demos Jesus LC
javax.portlet.title=Test Register
label.registerUser=Register
label.reset=Reset
label.firstName=First Name
label.lastName=Last Name
label.email=Email:
label.home=Home
email.errorMsg.missing=Please enter Email
success.message=User information successfully saved
preferences.message=No personalization options available for the portlet
help.message=This is a help message
*Es importante que añadamos esa carpeta (content) al builth path, así que tan solo tenemos que pulsar botón derecho y…

Ya solo nos queda configurar el archivo portlet.xml de la siguiente manera:
<?xml version="1.0"?> <portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" version="2.0"> <portlet> <portlet-name>UserRegistration</portlet-name> <display-name>UserRegistration</display-name> <portlet-class>com.jesuslc.UserRegistrationPortlet</portlet-class> <init-param> <name>defaultEmail</name> <value>@liferay.com</value> </init-param> <supports> <mime-type>text/html</mime-type> <portlet-mode>VIEW</portlet-mode> <portlet-mode>EDIT</portlet-mode> <portlet-mode>HELP</portlet-mode> </supports> <resource-bundle>content.Language</resource-bundle> <container-runtime-option> <name>javax.portlet.actionScopedRequestAttributes</name> <value>true</value> </container-runtime-option> </portlet> </portlet-app>
Por otro lado configuramos el archivo portlet-liferay.xml así:
<?xml version="1.0"?> <!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 6.1.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_6_1_0.dtd"> <liferay-portlet-app> <portlet> <portlet-name>UserRegistration</portlet-name> <icon>/icon.png</icon> <instanceable>true</instanceable> <remoteable>true</remoteable> <header-portlet-css>/css/main.css</header-portlet-css> <footer-portlet-javascript>/js/main.js</footer-portlet-javascript> <css-class-wrapper>UserRegistration-portlet</css-class-wrapper> </portlet> </liferay-portlet-app>
Ya tenemos nuestro portlet listo para que funcione. Esto será lo que tenemos:

Referencias
- Libro Manning Portlets in Action de A. Sarin
– http://www.liferay.com/es/community/wiki/-/wiki/Main/Localization+of+Portlets+Outside+of+Liferay








Replica a Eloy Cancelar la respuesta