Eigene JSP-Tag-Lib für Liferay

Logo Liferay

Um in Liferay auf Daten zuzugreifen, die in der Portlet-Klasse gesetzt werden (siehe z.B. erstes Plugin) muss zuerst mit

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
<portlet:defineObjects />

die erforderlichen Objekte initialisiert werden. Zum Zugriff auf eigene Daten muss man immer ein kleines Java-Snippet verwenden, wie z.B.:

<%
    Map<Company, List<User>> users = (Map<Company, List<User>>) renderRequest.getAttribute("users");
    int size = users.size();
    boolean found = size > 0;
%>

Dies hat aber den großen Nachteil, das man die Darstellung mit Logik vermischt. Jedoch kann man mit einer einfachen Erweiterung diesen Umstand umgehen.

Zur Lösung habe ich eine eigene Tag-Lib erstellt, die die Attribute aus dem RenderRequest in den PageContext überführt. Danach stehen die Attribute mittels EL zur Verfügung und können z.B. mit einer Schleife (c:forEach) weiter verarbeitet werden. Die Tag-Lib bringt ein Tag loadObjectsmit, dass diese Aufgabe erledigt. Zum Einbinden sind folgende Schritte erforderlich:

  • liferay-objects.tld muss in das Verzeichnis docrootWEB-INFtld kopiert werden
  • objectsTaglib-0.1-SNAPSHOT.jar muss in das Verzeichnis docrootWEB-INFlib kopiert werden

In der JSP wird dann einfach folgendes einfügt:

<%@ taglib uri="http://www.netpage-germany.de/JSP/LiferayObjects" prefix="objects"%> 
<objects:loadObjects/>

ebenso auch in der web.xml:

<taglib>
	<taglib-uri>http://www.netpage-germany.de/JSP/LiferayObjects</taglib-uri>
	<taglib-location>/WEB-INF/tld/liferay-objects.tld</taglib-location>
</taglib>

Nun kann die Darstellung ohne den Java-Code umgesetzt werden:

<c:forEach var="entry" items="${users}">
	<p><liferay-ui:message key="Firma" />: <strong>${entry.key.mx}</strong></p>
	<ul>
		<c:forEach var="user" items="${entry.value}">
			<li>${user.lastName}, ${user.firstName}
				(${user.displayEmailAddress})</li>
		</c:forEach>
	</ul>

</c:forEach>

Das Tag loadObjects  führt folgende Methode aus:

public class LoadObjectsTag extends TagSupport {

    private static final long serialVersionUID = 2522701324045836532L;

    private static Log log = LogFactory.getLog(LoadObjectsTag.class);

    @Override
    public int doStartTag() throws JspException {
        HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();

        Enumeration<String> e = request.getAttributeNames();
        while (e.hasMoreElements()) {
            String attribute = e.nextElement();

            log.trace("Request-Attribut found: " + attribute);
            if (pageContext.getAttribute(attribute) == null) {
                log.trace("PageContext no contains attribut - copy attribut to pageContext");
                pageContext.setAttribute(attribute, request.getAttribute(attribute));
            }
        }

        return SKIP_BODY;
    }

}

Das Beispiel findet sich unter meinem GitHub als Tag „ObjectsTaglib“.

Weitere Quellen:

Schreibe einen Kommentar