Realizzare una taglib non è un'operazione particolarmente complessa, ma se vogliamo realizzarla in maniera conforme allo standard Liferay dobbiamo stare attenti ad alcuni dettagli.
Ma in cosa consiste esattamente lo standard Liferay per le taglib?In pratica, quello che fanno le taglib di Liferay è includere una JSP ed inserire tutta la logica al suo interno; vediamo come.
Quello che vedremo adesso è come realizzare una semplicissima taglib che visualizza la data e l'ora corrente; la nostra attenzione, infatti, non è su cosa fa la taglib ma su come si crea.
Innanzitutto creiamo il nostro plugin di tipo portlet, al cui interno andremo ad inserire la nostra (o le nostre) taglib.
La prima cosa da creare è il TLD che contiene la definizione della taglib e di tutti i suoi attributi; pertanto creiamo il file WEB-INF/tld/my-taglib-library.tld
con il seguente contenuto:
<?xml version="1.0"?>
<taglib
version="2.0"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
>
<description>My taglib library</description>
<tlib-version>1.0</tlib-version>
<short-name>my-taglib-library</short-name>
<uri>http://dvel.it/liferay/tld/my</uri>
<tag>
<description>This is the clock taglib</description>
<name>clock</name>
<tag-class>it.dvel.liferay.taglib.ClockTag</tag-class>
<body-content>empty</body-content>
<attribute>
<description>Datetime pattern</description>
<name>pattern</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
<attribute>
<description>Portlet ID</description>
<name>portletId</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
Il significato è abbastanza ovvio ma mi soffermo solamente sui 2 attributi:
pattern
, è un semplice parametro per definire come visualizzare la data odierna;portletId
, indica il nome della portlet e serve per localizzare correttamente la JSP da utilizzare, altrimenti Liferay la cerca tra quelle di portale.
Dopodichè possiamo passare alla classe Java che implementa la taglib. Liferay mette già a disposizione una tassonomia di taglib molto vasta ma la classe Java di riferimento è sicuramente IncludeTag
che racchiude il meccanismo che ci interessa; pertanto andremo ad estendere proprio questa classe:
package it.dvel.liferay.taglib;
import javax.servlet.http.HttpServletRequest;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.taglib.util.IncludeTag;
public class ClockTag extends IncludeTag {
private static final String _PAGE = "/html/taglib/clock/page.jsp";
private String _pattern = StringPool.BLANK;
public void setPattern(String pattern) {
this._pattern = pattern;
}
@Override
protected void cleanUp() {
_pattern = StringPool.BLANK;
setPortletId(null);
}
@Override
protected String getPage() {
return _PAGE;
}
@Override
protected void setAttributes(HttpServletRequest request) {
request.setAttribute("my-taglib-library:clock:pattern", _pattern);
}
}
Questa classe richiede qualche spiegazione in più:
- ovviamente vanno definiti tutti i setter relativi ai parametri della taglib definiti nel TLD;
- il metodo
setPortletId
non c'è perchè è già presente nella superclasse; - il campo
_PAGE
rappresenta il percorso completo (all'interno del nostro plugin) della JSP da utilizzare; - il metodo
getPage
restituisce il valore del campo_PAGE
; - il metodo
cleanUp
serve per resettare tutti i campi della taglib al termine dell'elaborazione e serve nel caso in cui la taglib venga usata più volta in pagina; - il metodo
setAttributes
serve per iniettare nella request
tutti i parametri che verranno utilizzati poi nella JSP; - il nome di ciascun parametro deve seguire la seguente nomenclatura:
uri_taglibrary:nome_tag:nome_attributo
, ad esempiomy-taglib-library:clock:pattern
.
Infine possiamo definire la JSP creando il file /html/taglib/clock/page.jsp
:
<%@ include file="/html/init.jsp" %>
<%
String pattern =
GetterUtil.getString(request.getAttribute("my-taglib-library:clock:pattern"));
DateFormat dateFormat =
DateFormatFactoryUtil.getSimpleDateFormat(pattern, locale, timeZone);
%>
<%=dateFormat.format(new Date()) %>
Il suo funzionamento è estremamente banale, ma non è quello l'obiettivo di questo post.
Da notare unicamente il recupero del parametro pattern
attraverso la nomenclatura vista sopra.
Ok, e adesso?
Adesso potete utilizzare la vostra taglib, includendo prima il TLD:
<%@ taglib uri="http://dvel.it/liferay/tld/my" prefix="my-taglib-library" %>
<my-taglib-library:clock
pattern="dd MMMM yyyy hh:mm:ss"
portletId="1_WAR_mytagliblibraryportlet"
/>
Ovviamente gli attributi uri
e prefix
della direttiva taglib
si ricavano dal TLD e l'identificativo della portlet dipende da come l'avete chiamata.
Buon Natale a tutti!