17.10 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ß-/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 es ist kein Wert kodiert. Ist er null, so gibt es den Parameter nicht.
Wollen wir testen, ob ein Parameter vom Benutzer eingetragen ist, 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, dann gibt es die benutzerdefinierte Ausgabe: »Hoppla. Der Parameter fehlt ja.«.
Füllen wir den Parameter, dann gibt es 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 nicht ein zusammengesetzter String zum Beispiel 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, dann erzeugt das Servlet folgende Ausgabe:
b = 2
a = 1 2
c = unbestimmt
Wir sehen, dass alle Parameter hier aufgeführt sind, jedoch in unbestimmter Reihenfolge. Dies ist aber egal. Das Programm erkennt, ob ein Wert gesetzt ist oder nicht beziehungsweise ob einem Schlüssel zweimal ein Wert 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.
|