POST-Requests ohne WebTML-Form verarbeiten
Im Web werden per Browser erfasste Formulardaten in der Regel über einen so genannten POST-Request zum Server geschickt. Im Unterschied zum GET-Request, über den normalerweise Webseiten angefordert werden, kann der Browser im POST-Request zusätzliche Daten an die Zieladresse des Requests schicken, so wie in diesem Fall halt der Inhalt eines Webseiten-Formulars.
Nun werden in WGA Web-Formulare normalerweise als WebTML-Formulare realisiert. Deswegen erwartet WGA bei POST-Requests, dass diese in der Regel Daten zu WebTML-Formularen enthalten. In diesem Fall stehen diese Daten dann in Form des TMLScript-Objektes "tmlform" auf dem Server zur Verfügung.
Was aber, wenn WGA einmal Formulare verarbeiten soll, welche von einer anderen Quelle stammen, z.B. von einer anderen externen Webseite mit einem normalen HTML-Formular oder von einem ganz anderen externen Programm, welches kein Browser ist?
Nun werden in WGA Web-Formulare normalerweise als WebTML-Formulare realisiert. Deswegen erwartet WGA bei POST-Requests, dass diese in der Regel Daten zu WebTML-Formularen enthalten. In diesem Fall stehen diese Daten dann in Form des TMLScript-Objektes "tmlform" auf dem Server zur Verfügung.
Was aber, wenn WGA einmal Formulare verarbeiten soll, welche von einer anderen Quelle stammen, z.B. von einer anderen externen Webseite mit einem normalen HTML-Formular oder von einem ganz anderen externen Programm, welches kein Browser ist?
Abhängig vom Inhaltstyp
Grundsätzlich stellt bereits die J2EE-Plattform unterschiedliche Methoden zur Verfügung um auf gesendete Formulardaten zuzugreifen. Diese funktionieren in WGA jedoch teilweise nicht, was mit dem Inhaltstypen - auch "Encoding Type" genannt - dieser gesendeten Daten zu tun hat. Dieser Inhaltstyp bestimmt, in welchem Format die Formulardaten übermittelt werden. In normalen HTML-Formularen wird er über das Attribut "enctype" des <form>-Tags bestimmt.
Der Standardtyp ist hier "application/x-www-form-urlencoded". Er wird auch immer dann verwendet wenn ein HTML-Formular kein Attribut "enctype" angegeben hat. Die Verwendung dieses Typen ist in WGA unbedenklich. Die Daten können über die üblichen J2EE-Methoden - z.B. "request.getParameter()" - abgerufen werden. Dieser Typ hat jedoch einige Limitierungen, vor allem was das Übermitteln von spezielleren Zeichen angeht.
Auswertung von POST-Daten in WGA
Für anspruchsvollere Formulare gängig ist ein Typ namens "multipart/form-data" der auch von WGA für WebTML-Formulare verwendet wird. Erkennt WGA diesen Inhaltstypen so versucht es die Daten selbst zu verarbeiten, weswegen sie anderen Funktionalitäten nicht mehr zur Verfügung stehen, was das hier beschriebene Problem erst verursacht.
WGA erkennt POST-Requests die von WebTML-Formularen stammen an speziellen Systemfeldern, die mit übermittelt werden. Fehlen diese Felder, so werden die Daten nicht wie üblich zu einem Objekt "tmlform" aufbereitet welches sich in TMLScript verarbeiten liesse, weil es eben keine WebTML-Formulardaten sind.
Wie kommt man also stattdessen an seine Daten? Wer versucht über die ansonsten in J2EE übliche Methode die Daten über "request.getInputSteam()" oder "request.getReader()" abzurufen wird feststellen, dass dieser Eingabestrom bereits verarbeitet wurde und keine Daten mehr liefert. Diesen hat WGA selbst bereits ausgelesen um festzustellen ob es sich um WebTML-Formulardaten handelt.
Variable "multipartData"
Seit WGA 4.1 gibt es in diesem Fall einen anderen Ort, an welchen die ausgelesenen, und nicht für WebTML-Formulardaten befundenen, Daten zu finden sind: An einer WebTML-Variable names "multipartData".
Diese Variable enthält eine Liste, in welcher sich einzelne Java-Objekte befinden die jeweils einzelne Felddaten repräsentieren. Diese Objekte sind vom Typ "FileItem", einer Klasse der Bibliothek "Commons FileUpload" die WGA hinter den Kulissen verwendet. Ungeachtet des Namens von sowohl Objekt als auch Bibliothek enthalten sie nicht nur Daten von hochgeladenen Dateien sondern auch von normalen Formularfeldern. Die wichtigsten Methoden:
Grundsätzlich stellt bereits die J2EE-Plattform unterschiedliche Methoden zur Verfügung um auf gesendete Formulardaten zuzugreifen. Diese funktionieren in WGA jedoch teilweise nicht, was mit dem Inhaltstypen - auch "Encoding Type" genannt - dieser gesendeten Daten zu tun hat. Dieser Inhaltstyp bestimmt, in welchem Format die Formulardaten übermittelt werden. In normalen HTML-Formularen wird er über das Attribut "enctype" des <form>-Tags bestimmt.
Der Standardtyp ist hier "application/x-www-form-urlencoded". Er wird auch immer dann verwendet wenn ein HTML-Formular kein Attribut "enctype" angegeben hat. Die Verwendung dieses Typen ist in WGA unbedenklich. Die Daten können über die üblichen J2EE-Methoden - z.B. "request.getParameter()" - abgerufen werden. Dieser Typ hat jedoch einige Limitierungen, vor allem was das Übermitteln von spezielleren Zeichen angeht.
Auswertung von POST-Daten in WGA
Für anspruchsvollere Formulare gängig ist ein Typ namens "multipart/form-data" der auch von WGA für WebTML-Formulare verwendet wird. Erkennt WGA diesen Inhaltstypen so versucht es die Daten selbst zu verarbeiten, weswegen sie anderen Funktionalitäten nicht mehr zur Verfügung stehen, was das hier beschriebene Problem erst verursacht.
WGA erkennt POST-Requests die von WebTML-Formularen stammen an speziellen Systemfeldern, die mit übermittelt werden. Fehlen diese Felder, so werden die Daten nicht wie üblich zu einem Objekt "tmlform" aufbereitet welches sich in TMLScript verarbeiten liesse, weil es eben keine WebTML-Formulardaten sind.
Wie kommt man also stattdessen an seine Daten? Wer versucht über die ansonsten in J2EE übliche Methode die Daten über "request.getInputSteam()" oder "request.getReader()" abzurufen wird feststellen, dass dieser Eingabestrom bereits verarbeitet wurde und keine Daten mehr liefert. Diesen hat WGA selbst bereits ausgelesen um festzustellen ob es sich um WebTML-Formulardaten handelt.
Variable "multipartData"
Seit WGA 4.1 gibt es in diesem Fall einen anderen Ort, an welchen die ausgelesenen, und nicht für WebTML-Formulardaten befundenen, Daten zu finden sind: An einer WebTML-Variable names "multipartData".
Diese Variable enthält eine Liste, in welcher sich einzelne Java-Objekte befinden die jeweils einzelne Felddaten repräsentieren. Diese Objekte sind vom Typ "FileItem", einer Klasse der Bibliothek "Commons FileUpload" die WGA hinter den Kulissen verwendet. Ungeachtet des Namens von sowohl Objekt als auch Bibliothek enthalten sie nicht nur Daten von hochgeladenen Dateien sondern auch von normalen Formularfeldern. Die wichtigsten Methoden:
- fileItem.isFormField() ist true, wenn es sich um ein normales Formularfeld handelt, false bei hochgeladenen Dateien
- fileItem.getFieldName() ermittelt den Namen des Formularfeldes, wenn es ein solches ist
- fileItem.getString() gibt den Inhalt des Formularfeldes zurück, wenn es ein solches ist. Als optionaler Parameter kann ein Encoding angegeben werden in welchem das Feld aus den Formulardaten gelesen werden soll, z.B. fileItem.getString("UTF-8")
- fileItem.getName() gibt den Namen der hochgeladenen Datei zurück, wenn es eine solche ist
- fileItem.getInputStream() gibt den Inhalt einer hochgeladenen Datei als Eingabestrom zurück, wenn es eine solche ist
if (isDefined("multipartData")) {
for (var idx=0; idx < multipartData.size(); idx++) {
var field = multipartData.get(idx);
if (field.isFormField()) {
doc.setItemValue(field.getFieldName(), field.getString("UTF-8"));
}
}
doc.save();
}
for (var idx=0; idx < multipartData.size(); idx++) {
var field = multipartData.get(idx);
if (field.isFormField()) {
doc.setItemValue(field.getFieldName(), field.getString("UTF-8"));
}
}
doc.save();
}
Weiter zur nächsten Seite ...