17.8 Formulardaten
 
Falls die Web-Seite eine GET- oder POST-Anfrage stellt, kann sie Daten übergeben. Hier unterscheiden sich die beiden Verfahren. Bei GET hängt der Client die Informationen hinter einem Fragezeichen an die URL an. Der Server extrahiert dann die Daten. Bei POST gelangen die Daten über einen Datenstrom zum Server.
Klassischerweise ist bei CGI-Programmen das Auseinanderpflücken der Parameter immer mit Programmieraufwand verbunden.1
In der Servlet-API finden wir dafür die nötige Unterstützung, die uns sogar davor bewahrt, den Unterschied zwischen POST und GET wahrzunehmen.
Einen Parameter mit getParameter() auslesen
Die Methode getParameter(String) auf dem Objekt HttpServletRequest liefert zu einem Schlüssel im Formular den entsprechenden Wert. Der String ist abhängig von der Groß- und Kleinschreibung. Der zurückgegebene Wert ist gleich im passenden Format und muss nicht erst eine Entschlüsselung durchlaufen. Liefert getParameter() einen Leer-String (also »«), so existiert zwar der Schlüssel, doch ist kein Wert kodiert. Ist er null, gibt es den Parameter nicht.
Wollen wir testen, ob der Benutzer gut in Form ist und ein Parameter eingetragen hat, schreiben wir:
Listing 17.8
paramda.jsp
<%
String name = null;
if ( (name=request.getParameter("param")) == null)
{
%>
Hoppla. Der Parameter fehlt ja.
<%
}
else
{
%>
Schön, der Parameter "<%= name %>" ist da.
<%
}
%>
Rufen wir das Skript http://localhost:8080/jt/paramda.jsp ohne Parameter auf, gibt es die benutzerdefinierte Ausgabe: »Hoppla. Der Parameter fehlt ja.«
Füllen wir den Parameter, kommt keine Fehlermeldung:
http://localhost:8080/jt/paramda.jsp?param=IstDa
Parametersammlungen mit getParameterValues() auslesen
Da ein Parameter auch mehr als einen Wert haben kann, hilft getParameter() nicht weiter, da dieser nur jeweils einen Wert liefert. Hier führt die Methode getParameterValues() zum Ziel, die ein Feld von Strings zurückgibt. (Damit ist kein zusammengesetzter String etwa für Suchmaschinen gemeint.) Sind wir an einer vollständigen Aufzählung der Schlüssel interessiert, liefert getParameterNames() ein Objekt vom Typ Enumeration zurück, mit dem wir durch das Feld wandern und die Werte mit getParameter() erfragen können.
Beispiel Auslesen von Parametern
|
Listing 17.9
parameterNames.jsp
<%
java.util.Enumeration paramNames = request.getParameterNames();
while ( paramNames.hasMoreElements() )
{
String param = (String) paramNames.nextElement();
out.print( "<p>" + param + " = " );
String[] paramValues = request.getParameterValues( param );
if ( paramValues.length == 1 )
{
String paramValue = paramValues[0];
if ( paramValue.length() == 0 )
out.println( "unbestimmt" );
else
out.println( paramValue );
}
else
{
for ( int i = 0; i < paramValues.length; i++ )
out.print( paramValues[i] + " " ) ;
out.println( "<p>" );
}
}
%>
Wenn wir das Programm mit der Zeile
http://localhost:8080/jt/parameterNames.jsp?a=1&b=2&c=&a=2
im Browser starten, erzeugt das Servlet folgende Ausgabe:
b = 2
a = 1 2
c = unbestimmt
Wir sehen, dass alle Parameter hier aufgeführt sind, doch in unbestimmter Reihenfolge. Dies ist aber egal. Das Programm erkennt, ob ein Wert gesetzt ist oder nicht beziehungsweise ob einem Schlüssel ein Wert zweimal zugewiesen wurde.
Tipp Für die Benennung der Formularfelder gibt es eine Spezifikation, die sich ECML (Electronic Commerce Modeling Language) nennt. Sie wird im RFC 3106 (http://www.faqs.org/rfcs/rfc3106.html) beschrieben. Das Format legt Felder fest, die insbesondere für E-Commerce genutzt werden können. Mitverantwortliche für diesen Standard sind unter anderem AOL, American Express, Compaq, CyberCash, Discover, Financial Services Technology Consortium, IBM, MasterCard, Microsoft, Novell, Sun, Visa.
|
1 Zusatzbibliotheken für die verbreiteten Sprachen wie Perl (mit dem Paket CGI.pm) oder Python (CGI) lösen die Aufgaben genauso elegant.
|