Es ist in der Tat nicht explizit in der Servlet-Spezifikation definiertem, aber die HTML-Formulare spec definies zumindest explizit im application/x-www-form-urlencoded Abschnitt:
2. Steuer Namen/Werte in der Reihenfolge, in sie erscheinen aufgeführt sind das Dokument.
Also, dieser Teil ist sicher.Nun würde der Servletcontainer, logisch eine vernünftige und effiziente Implementierung, den HTTP-Eingabestream sofort verarbeiten, so wie er hereinkommt, so dass die Parameter in der Reihenfolge verarbeitet würden, wie sie im Anfrage-URI (GET) oder Anfrage-Body (POST) erscheinen. Sammeln sie in einem String[]
ist die einfachste Wahl, wie es auch ist wie in der Servlet-API verwendet, so sehe ich wirklich keinen Grund, es in einer HashSet
Struktur wie zuerst zu sammeln, oder tun Sie eine Collections#shuffle()
oder was auch immer und dann wandle es danach in String[]
um.
Ich kann zumindest aus Erfahrung sagen, Tomcat tut es richtig, so dass auch alle großen Container/Anwendungen, die auf Tomcat/Catalina (IBM Websphere, JBoss AS, Sun Glassfish, etc.) gebaut werden . Ich habe keine Erfahrung mit Weblogic, aber ich würde mich wundern, wenn es anders verarbeitet wird (sprich: weniger effizient).
Nur die Bestellung des Parameters Namen ist nicht garantiert, logisch, weil es von einem HashMap
unterstützt wird.
Zusammengefasst: Die Parameter in einem HashMap<String, String[]>
gesammelt werden. Die Namen sind garantiert nicht wegen der Art der HashMap
bestellt. Die Werte (ein Parametername kann mehrere Werte haben, z. B. foo=bar1&foo=bar2&foo=bar3
) sind wiederum aufgrund der Natur von String[]
geordnet, obwohl dies nicht explizit in der Servlet-API spezifiziert ist.
Um auf der sicheren Seite zu sein, möchten Sie einen anderen Ansatz verwenden, z.
foos=3&foo[0]=bar1&foo[1]=bar2&foo[2]=bar3
mit
int foos = Integer.valueOf(request.getParameter("foos"));
for (int i = 0; i < foos; i++) {
int foo = Integer.valueOf(request.getParameter("foo[" + i + "]"));
}
Da HttpServletRequest eine Schnittstelle ist, hängt es von seiner Implementierung ab. Obwohl ich würde überrascht sein, wenn es eine Implementierung gibt, die die Werte in der Reihenfolge nicht zurückgibt. – Fortega
Dokumentation der Schnittstelle * kann Verhalten diktieren, wenn der Designer dies wünscht, aber in diesem Fall nicht. – skaffman