Il seguente articolo ha lo scopo di definire le basi per lo sviluppo di una portlet (JSR286) pluggabile in Liferay Portal. Per qualunque tipologia di sviluppo, siano esse portlet, Hook, Temi, Layout o Extension Environment il migliore strumento di lavoro è senza dubbio Liferay IDE. La guida di installazione è reperibile online.
La guida descrive anche come creare un Liferay Plug-in Project. Sono avviabili tre tipologie di progetto: Portlet, Hook (plugin per la customizzazione ed estensione delle funzionalità base), Ext (plugin che permette una completa customizzazione di Liferay). Nell’immagine a lato una rappresentazione dell’alberatura di un progetto di tipo Portlet.
Questo articolo si limiterà a descrivervi come creare gli oggetti dell’area di configurazione della Portlet e quelli responsabili del rendering dei contenuti dinamici.
Area di Configurazione
In liferay-portlet.xml aggiungere la riga
<liferay-portlet-app>
...
<portlet>
...
<configuration-action-class>it.qbr.jsp.action.ConfigurationActionImpl</configuration-action-class>
...
</portlet>
...
</liferay-portlet-app>
Creare in src la classe it.qbr.jsp.action.ConfigurationActionImpl che implementa com.liferay.portal.kernel.portlet.ConfigurationAction
@Override
public void processAction(PortletConfig portletConfig,
ActionRequest actionRequest, ActionResponse actionResponse)
throws Exception {
String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
if (!cmd.equals(Constants.UPDATE)) {
return;
}
String stringParameter = ParamUtil.getString(actionRequest, "stringParameter");
long longParameter = ParamUtil.getLong(actionRequest, "longParameter");
int intParameter = ParamUtil.getInteger(actionRequest, "intParameter");
String portletResource = ParamUtil.getString(actionRequest,"portletResource");
PortletPreferences preferences = PortletPreferencesFactoryUtil.getPortletSetup(actionRequest, portletResource);
preferences.setValue("stringParameter", stringParameter);
preferences.setValue("longParameter", String.valueOf(longParameter));
preferences.setValue("intParameter", String.valueOf(intParameter));
preferences.store();
SessionMessages.add(actionRequest, portletConfig.getPortletName()+ ".doConfigure");
}
@Override
public String render(PortletConfig portletConfig,
RenderRequest renderRequest, RenderResponse renderResponse)
throws Exception {
return "/configuration.jsp";
}
Creare init.jsp in modo da centralizzare il caricamento delle impostazioni della portlet.
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
<%@ taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %>
<%@ taglib uri="http://liferay.com/tld/theme" prefix="liferay-theme" %>
<%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %>
<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>
<%@ page import="com.liferay.portal.util.PortalUtil" %>
<%@ page import="com.liferay.portal.kernel.util.Constants" %>
<%@ page import="com.liferay.portal.kernel.util.Validator" %>
<%@ page import="com.liferay.portlet.PortletPreferencesFactoryUtil" %>
<%@ page import="javax.portlet.PortletPreferences" %>
<%@ page import="com.liferay.portal.kernel.util.ParamUtil" %>
<%@ page import="com.liferay.portal.kernel.util.PrefsParamUtil" %>
<%@ page import="com.liferay.portal.kernel.util.StringPool" %>
<liferay-theme:defineObjects />
<portlet:defineObjects />
<%
String currentURL = PortalUtil.getCurrentURL(request);
PortletPreferences preferences = renderRequest.getPreferences();
String portletResource = ParamUtil.getString(request, "portletResource");
if (Validator.isNotNull(portletResource)) {
preferences = PortletPreferencesFactoryUtil.getPortletSetup(request, portletResource);
}
String stringParameter = preferences.getValue("stringParameter", StringPool.BLANK);
long longParameter = Long.valueOf(preferences.getValue("longParameter", "0"));
int intParameter = Integer.valueOf(preferences.getValue("intParameter", "0"));
%>
A questo punto è possibile includere init.jsp in qualsiasi altra jsp per poter utilizzare le configurazioni.
Creare configuration.jsp, la pagina che renderizza il pannello di configurazione della portlet.
NOTA: il nome della jsp deve essere lo stesso del metodo render di ConfigurationActionImpl.
<%@include file="/init.jsp" %>
<liferay-portlet:actionURL portletConfiguration="true" var="configurationActionURL" />
<liferay-portlet:renderURL portletConfiguration="true" varImpl="configurationRenderURL" />
<aui:form action="<%= configurationActionURL %>" method="post" name="<portlet:namespace />fm">
<aui:input name="<%= Constants.CMD %>" type="hidden" value="<%= Constants.UPDATE %>" />
<aui:input name="redirect" type="hidden" value="<%= configurationRenderURL.toString() %>" />
<liferay-ui:panel collapsible="<%= true %>" extended="<%= true %>" id="ap-abstract" persistState="<%= true %>" title="configuration">
<aui:fieldset>
<aui:input type="text" name="stringParameter" value="<%=stringParameter %>" />
<aui:input type="text" name="longParameter" value="<%=longParameter %>" />
<aui:input type="text" name="intParameter" value="<%=intParameter %>" />
</aui:fieldset>
</liferay-ui:panel>
<aui:button-row>
<aui:button type="submit" value="Save" />
</aui:button-row>
</aui:form>
Rendering dei contenuti dinamici
In portlet.xml aggiungere
<portlet>
...
<portlet-class>it.qbr.jsp.action.ApPortletAction</portlet-class>
<init-param>
<name>view-template</name>
<value>/view.jsp</value>
</init-param>
...
</portlet>
Creare in src la classe it.qbr.jsp.action.ApPortletAction che estende com.liferay.util.bridges.mvc.MVCPortlet. Questo vuol dire che la nostra Portlet utilizzerà l’MVC di Liferay, ma naturalmente è possibile realizzare portlet utilizzando MVC di Struts piuttosto che Spring MVC.
public class ApPortletAction extends MVCPortlet {
@Override
public void render(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
HttpServletRequest httpRequest = (HttpServletRequest) request.getAttribute(PortletServlet.PORTLET_SERVLET_REQUEST);
ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
Locale locale = themeDisplay.getLocale();
PortletPreferences preferences = request.getPreferences();
String portletResource = ParamUtil.getString(request, "portletResource");
if (Validator.isNotNull(portletResource)) {
try {
preferences = PortletPreferencesFactoryUtil.getPortletSetup(request, portletResource);
} catch (PortalException e) {
e.printStackTrace();
} catch (SystemException e) {
e.printStackTrace();
}
}
//Recupero parametri da portalResource
String stringParameter = preferences.getValue("stringParameter", "");
long longParameter = Long.valueOf(preferences.getValue("longParameter", "0"));
int intParameter = Integer.valueOf(preferences.getValue("area", "0");
String viewString = stringParameter + " è pari a " + longParameter*intParameter;
request.setAttribute("viewString", viewString);
super.render(request, response);
}
Modificare la view.jsp
<%@include file="/init.jsp" %>
<% String viewString = (String)renderRequest.getAttribute("viewString"); %>
<h3><%=viewString %></h3>
Finito. Supponendo di aver configurato la Portlet con i seguenti parametri:
stringParameter: “Il valore della moltiplicazione tra longParameter e intParameter”
longParameter: 3
intParameter: 4
la Portelet renderizzerà un frammento di codice che come quello che segue:
<h3>Il valore della moltiplicazione tra longParameter e intParameter è pari a 12</h3>
Ambiente di sviluppo e requisiti:
Eclipse Indigo Release (Build id: 20110319-2305)
Liferay IDE plugin per Eclipse v1.5.3.x o superiore
Sun jdk1.6.0_23 o superiore
Liferay: liferay-portal-6.1.0-ce-ga1, liferay-plugins-sdk-6.1.0