File Upload mit JSF, Portlet und jQuery made easy and working

Im Portal, sei es nun Websphere oder Liferay oder andere funktioniert ja grundsätzlich nichts oder fast nichts  – in Bezug auf einen Fileupload -, was die Welt so (als OpenSource oder properitär) anbietet bzw. was in einer normalen Web/JSF-Anwendung grundsätzlich und gut funktioniert.

Sei es nun das native Apache Fileupload oder komplette Frontends wie die JSF-Lib Tomahawk oder jQuery.

Allerdings gibt es hier eine gar nicht zu aufwändige Alternative, die ungefähr wie folgt funktioniert (ich habe es ausprobiert, es geht).

  1. In einem Portlet includiert man in die Aufrufkette des Request über einen über PortletRequestDispatcher ein Servlet
  2. Dieses Servlet liest die über jQuery versandte Datei aus dem Request aus und wird vor dem JSF-Lifecyle aufgerufen
  3. Dazu benutzt man in diesem Servlet das Paket Apache Commons Fileupload (wie gewohnt)
  4. Den gelesenen InputStream legt man als Objekt in einem Request Attribut ab
  5. Im Portlet wieder angekommen, nach dem Ausflug zum Servlet, legt man dieses RequestAttribut in die Session oder belässt es im Request
  6. Die über den Upload Button verknüpfte (JSF)Action wird nun im JSF Cycle aufgerufen
  7. Der InputStream wird in der Action aus dem Request/der Session ausgelesen
  8. Dann kann man den InputStream, wie gewohnt, verarbeiten und z.B. in eine Datenbank schreiben

Fazit: Portlet und Servlet kann generisch und wieder verwendbar angelegt werden, so dass sich das für den JSF-Entwickler relativ seamless verwenden lässt.

Ich habe alle Freiheiten beim Upload und kann entsprechende GUI-Elemente in den JSF-Baum mischen, auch wenn es plain HTML oder jQuery z.b. ist.

Ansonsten wird in die Webanwendung nur zusätzlich ein entsprechendes und in einer Ausbaustufe generisches Servlet eingebunden.

Wer dazu Fragen hat, gerne melden.