Beispiel-URL:
../search/?attr1=value1&attr2=value2&attr4=value4
Ich kenne die Namen von attr1, att2 und attr4 nicht.
Ich möchte in der Lage sein, so etwas zu tun (oder ähnliches, egal, solange ich Zugriff auf die Karte des Anforderungsparameters habe -> Wert:
@RequestMapping(value = "/search/{parameters}", method = RequestMethod.GET)
public void search(HttpServletRequest request,
@PathVariable Map<String,String> allRequestParams, ModelMap model)
throws Exception {//TODO: implement}
Wie kann ich dies mit Spring MVC erreichen?
java
spring
spring-mvc
MDb
quelle
quelle
@RequestParam MultiValueMap<String, String>
import org.springframework.ui.ModelMap;
.ModelMap
wird nicht benötigt, um alle Anforderungsparameter als Map abzurufen. Das ist einfach ein Detail, das für den OP-Code spezifisch ist.Bearbeiten
Es wurde darauf hingewiesen, dass es ( mindestens ab 3.0 ) einen reinen Spring-MVC-Mechanismus gibt, mit dem man diese Daten erhalten kann. Ich werde hier nicht näher darauf eingehen, da es die Antwort eines anderen Benutzers ist. Siehe die Antwort von @ AdamGent Vergessen Sie nicht, diese zu bewerten.
In der Spring 3.2-Dokumentation wird dieser Mechanismus sowohl auf der
RequestMapping
JavaDoc-Seite als auch auf derRequestParam
JavaDoc-Seite erwähnt, zuvor jedoch nur auf derRequestMapping
Seite. In der 2.5-Dokumentation wird dieser Mechanismus nicht erwähnt.Dies ist wahrscheinlich der bevorzugte Ansatz für die meisten Entwickler, da dadurch (zumindest dieser) die Bindung an die entfernt wird
HttpServletRequest
durch die Servlet-API-JAR definierte Objekt entfernt wird./Bearbeiten
Sie sollten Zugriff auf die Anforderungsabfragezeichenfolge über haben
request.getQueryString()
.Zusätzlich zu getQueryString können die Abfrageparameter auch als Map aus request.getParameterMap () abgerufen werden .
quelle
@RequestParam
nehme gerne einenMap
als Parameter (siehe meine Antwort).@RequestParam
von aMap<String,String>
zum Abrufen aller Parameter für Abfragezeichenfolgen nicht erwähnt wird. Und bitte, fühlen Sie sich nicht so verabscheut über die Antworten, die Sie hier sehen ... sie sind nicht so schlecht :) static.springsource.org/spring/docs/3.1.x/javadoc-api/org/…@RequestParam Map<>
Weg nicht getan wurde. Ich ärgere mich leicht darüber, dass viele moderne Projekte, die ich in Spring MVC (Spring 3.1 und höher) gesehen habe, die HttpServletRequest und HttpServletResponse auf jede Methode setzen. Und es scheint, weil Junior-Entwickler StackOverflow und Google verwenden, anstatt sich das Dokument anzusehen. Dies macht es für das Spring-Projekt schwierig, von der Servlet-API zu einer Netty-API zu wechseln. JAX-RS hat ähnliche Missbrauchsprobleme, jedoch in weitaus geringerem Maße.Das HttpServletRequest-Objekt bietet bereits eine Zuordnung von Parametern. Weitere Informationen finden Sie unter request.getParameterMap () .
quelle
Sie können dies einfach verwenden:
Das sollte gut funktionieren
quelle
Hier ist das einfache Beispiel für das Abrufen von Anforderungsparametern in einer Map.
In diesem Fall werden der Wert von studentName und studentEmail mit den Variablen name und email verknüpft.
quelle
Verwenden Sie es
org.springframework.web.context.request.WebRequest
als Parameter in Ihrer Controller-Methode. Es stellt die Methode bereitgetParameterMap()
. Der Vorteil besteht darin, dass Sie Ihre Anwendung nicht an die Servlet-API binden. WebRequest ist ein Beispiel für ein JavaEE-Muster-Kontextobjekt.quelle
Es gibt zwei Schnittstellen
org.springframework.web.context.request.WebRequest
org.springframework.web.context.request.NativeWebRequest
Ermöglicht den Zugriff auf generische Anforderungsparameter sowie auf
request/session
Attribute ohne Verknüpfung mit der nativen Servlet / Portlet-API .Ex.:
PS Es gibt Dokumente zu Argumenten, die als Controller-Parameter verwendet werden können.
quelle
String[]
als Wert? Ich muss es auf 0 indizieren, um den Wert zu erhalten.key=val1,val2
oder gebenkey=val1&key=val2
(wenn ich mich richtig erinnere, dass Spring beide Notationen unterstützt), so dass Sie ein Array mit 2 Elementen erhaltenIch komme vielleicht zu spät zur Party, aber nach meinem Verständnis suchen Sie nach so etwas:
quelle
Alle Parameter werden in gespeichert
jsonObject
.quelle
Es gibt einen grundlegenden Unterschied zwischen Abfrageparametern und Pfadparametern. Es geht so:
www.your_domain?queryparam1=1&queryparam2=2
- Parameter abfragen.www.your_domain/path_param1/entity/path_param2
- Pfadparameter.Was ich überraschend fand, ist, dass in der MVC-Welt im Frühjahr viele Menschen einander verwechseln. Während Abfrageparameter eher Kriterien für eine Suche sind, identifizieren Pfadparameter eine Ressource höchstwahrscheinlich eindeutig. Dies bedeutet jedoch nicht, dass Sie nicht mehrere Pfadparameter in Ihrem URI haben können, da die Ressourcenstruktur verschachtelt werden kann. Angenommen, Sie benötigen eine bestimmte Fahrzeugressource einer bestimmten Person:
www.my_site/customer/15/car/2
- auf der Suche nach einem zweiten Auto eines 15. Kunden.Was wäre ein Anwendungsfall, um alle Pfadparameter in eine Karte einzufügen? Pfadparameter haben keinen "Schlüssel", wenn Sie sich einen URI selbst ansehen. Diese Schlüssel in der Karte werden beispielsweise aus Ihrer @ Map-Annotation entnommen:
Aus HTTP / REST-Sicht können Pfadparameter nicht wirklich auf eine Karte projiziert werden. Meiner Meinung nach dreht sich alles um die Flexibilität von Spring und den Wunsch, Entwickler nach Lust und Laune unterzubringen.
Ich würde niemals eine Karte für Pfadparameter verwenden, aber sie kann für Abfrageparameter sehr nützlich sein.
quelle