Grails: Portlets Teil 1

Da ich bei meiner Arbeit viel mit Portalen, Webanwendungen und Grails zu tun habe, wollte ich nun einmal das Portlet-Plugin für Grails ausprobieren.
Aktuell werden zwei Container unterstützt: Liferay und Pluto. Ich habe mich mal für Apache Pluto entschieden, da ich jetzt keine Präferenz für eine Umgebung hatte ... und es bereits Anleitungen für Liferay gibt ;-)
Hier möchte ich die notwendigen Schritte erläutern, um eine Portletanwendung erfolgreich zum Laufen zu bringen.

Voraussetzungen:

  • Grails Version 1.1.1
  • Tomcat 5.5.x + Pluto 1.1.7 (optional - siehe Deployment)

Vorgehen:

Zuerst muss natürlich eine Grails-Anwendung erstellt werden. grails create-app PortletTest

Danach können die Plugins installiert werden, welche für die Portlet-entwicklung benötigt werden.

grails install-plugin portlets grails install-plugin portlets-pluto grails install-plugin pluto

Jetzt sind erst einmal die Voraussetzungen erfüllt und wir können beginnen, ein erstes Portlet zu erstellen. grails create-portlet First

Grails erzeugt uns eine Portlet-Klasse FirstPortlet.groovy im Ordner grails-app/portlets.

import javax.portlet.*

class FirstPortlet {

def title = 'Portlet Title'
def description = '''
Description about the portlet goes here.
'''
def displayName = 'Display Name'
def supports = ['text/html':['view', 'edit', 'help']]

// Liferay server specific configurations
def liferay_display_category = 'MyCategory'

def actionEdit = {
//TODO Define action phase
portletResponse.setPortletMode(PortletMode.VIEW)
}

def renderEdit = {
//TODO Define render phase. Return the map of the variables bound to the view
['mykey':'myvalue']
}

def actionView = {
//TODO Define action phase
}

def renderView = {
//TODO Define render phase. Return the map of the variables bound to the view
['mykey':'myvalue']
}

def actionHelp = {
//TODO Define action phase
portletResponse.setPortletMode(PortletMode.VIEW)
}

def renderHelp = {
//TODO Define render phase. Return the map of the variables bound to the view
['mykey':'myvalue']
}
}

Das allein reicht aber nicht, denn es müssen noch die Views erstellt werden. grails generate-portlet-views First

Wenn alles geklappt hat, befinden sich nun im Ordner grails-app/views je eine GSP-Seite pro Portlet Modus:

  • view.gsp
  • edit.gsp
  • help.gsp

Damit wären wir schon mit den Grundsätzlichen fertig und das Portlet muss nur noch deployed werden.

Deployment:

Variante 1 "Nutzung des Pluto-Plugins" : grails install-plugin pluto grails run-app

Das Plugin integriert Apache Pluto in das Kommando run-app. Vorteil dieser Lösung ist, dass man keinen separaten Tomcat + Pluto benötigt.

Variante 2 "Deployen in eigener Serverinstanz" : grails war

Danach das WAR-Archiv in den webapps - Ordner des Tomcat kopieren - fertig.

Probleme:

Natürlich kann dabei nicht immer alles sofort glatt gehen. Über die folgenden Problem bin ich gestolpert.

Fehler bei der Angabe von Packages

Beim Ausführen von grails generate-portlet-views net.example.First erhielt ich die folgende Fehlermeldung: Unable to generate portlet.xml: FirstPortlet

Der Fehler trat immer auf, sobald ich versucht habe, die Portletklasse in ein Package zu schieben. Ohne Package-Angabe beim Anlegen trat der Fehler nicht auf.

Fehler beim Deployment

OutOfMemory - Exception (PermGen) beim Deployment im Tomcat. Dagegen half das Erhöhen der maximalen PermGen-Größe: -XX:MaxPermSize=128m