Przykładowy adres URL:
../search/?attr1=value1&attr2=value2&attr4=value4
Nie znam nazw attr1, att2 i attr4.
Chciałbym móc zrobić coś takiego (lub podobnego, nie przejmuj się, o ile mam dostęp do mapy param name name -> value:
@RequestMapping(value = "/search/{parameters}", method = RequestMethod.GET)
public void search(HttpServletRequest request,
@PathVariable Map<String,String> allRequestParams, ModelMap model)
throws Exception {//TODO: implement}
Jak mogę to osiągnąć za pomocą Spring MVC?
java
spring
spring-mvc
MDb
źródło
źródło
@RequestParam MultiValueMap<String, String>
import org.springframework.ui.ModelMap;
.ModelMap
nie jest potrzebny, aby uzyskać wszystkie parametry żądania jako mapę; to po prostu szczegół specyficzny dla kodu OP.Edytować
Wskazano, że istnieje ( przynajmniej od 3.0 ) czysty mechanizm Spring MVC, za pomocą którego można uzyskać te dane. Nie będę go tutaj szczegółowo opisywać, ponieważ jest to odpowiedź innego użytkownika. Zobacz odpowiedź @ AdamGent, aby poznać szczegóły, i nie zapomnij głosować za nią.
W dokumentacji Spring 3.2 mechanizm ten jest wymieniony zarówno na
RequestMapping
stronie JavaDoc, jak iRequestParam
JavaDoc, ale wcześniej wspomniano tylko naRequestMapping
stronie. W dokumentacji 2.5 nie ma wzmianki o tym mechanizmie.Jest to prawdopodobnie preferowane podejście dla większości programistów, ponieważ usuwa (przynajmniej to) wiązanie z
HttpServletRequest
obiektem zdefiniowanym przez jar apletu-api./Edytować
Powinieneś mieć dostęp do ciągu zapytania zapytania za pośrednictwem
request.getQueryString()
.Oprócz getQueryString parametry zapytania można również pobrać z request.getParameterMap () jako mapę.
źródło
@RequestParam
chętnie przyjmieMap
jako parametr (patrz moja odpowiedź).@RequestParam
na zasadzieMap<String,String>
, aby pobrać wszystkie parametry ciągu zapytania. I proszę, nie czuj się tak wkurzony odpowiedziami, które tutaj widzisz ... nie są takie złe :) static.springsource.org/spring/docs/3.1.x/javadoc-api/org/…@RequestParam Map<>
tak się nie stało. Mam lekką irytację w związku z tym, że wiele nowoczesnych projektów, które widziałem Spring MVC (wiosna 3.1 i nowsza), będą umieszczać HttpServletRequest i HttpServletResponse na każdej metodzie. I wydaje się, że jest tak, ponieważ młodsi programiści używają StackOverflow i Google zamiast patrzeć na dokument. Utrudnia to projektowi Spring zmianę z apletu apletu na API Netty. JAX-RS ma podobne problemy z nadużyciami, ale w znacznie mniejszym stopniu.Obiekt HttpServletRequest już udostępnia mapę parametrów. Aby uzyskać więcej informacji, patrz request.getParameterMap () .
źródło
możesz po prostu użyć tego:
To powinno działać dobrze
źródło
Oto prosty przykład uzyskiwania parametrów żądania na mapie.
W takim przypadku powiąże wartość studentName i studentEmail odpowiednio ze zmiennymi name i email.
źródło
Użyj
org.springframework.web.context.request.WebRequest
jako parametru w metodzie kontrolera, zapewnia on tę metodęgetParameterMap()
, zaletą jest to, że nie dokręcasz aplikacji do interfejsu API serwletu, WebRequest jest przykładem obiektu kontekstowego wzorca JavaEE.źródło
Istnieją dwa interfejsy
org.springframework.web.context.request.WebRequest
org.springframework.web.context.request.NativeWebRequest
Umożliwia ogólny dostęp do parametrów żądania oraz
request/session
dostęp do atrybutów, bez powiązań z natywnym interfejsem API serwletów / portletów .Dawny.:
PS Istnieją dokumenty dotyczące argumentów, które można wykorzystać jako parametry kontrolera.
źródło
String[]
tej wartości? Muszę zindeksować go do 0, aby uzyskać wartość.key=val1,val2
lubkey=val1&key=val2
(jeśli dobrze pamiętam, że obsługuję oba te zapisy), więc otrzymasz tablicę z 2 elementamiMogę spóźnić się na przyjęcie, ale według mojego zrozumienia szukasz czegoś takiego:
źródło
Wszystkie parametry zostaną zapisane w
jsonObject
.źródło
Istnieje zasadnicza różnica między parametrami zapytania a parametrami ścieżki. Wygląda to tak:
www.your_domain?queryparam1=1&queryparam2=2
- parametry zapytania.www.your_domain/path_param1/entity/path_param2
- parametry ścieżki.Zaskoczyło mnie to, że w świecie Spring MVC wiele osób myli jeden z drugim. Podczas gdy parametry zapytania są bardziej podobne do kryteriów wyszukiwania, parametry ścieżki najprawdopodobniej jednoznacznie zidentyfikują zasób. To powiedziawszy, nie oznacza to, że nie możesz mieć wielu parametrów ścieżki w twoim URI, ponieważ struktura zasobów może być zagnieżdżona. Załóżmy na przykład, że potrzebujesz określonego zasobu samochodowego konkretnej osoby:
www.my_site/customer/15/car/2
- szukam drugiego samochodu 15. klienta.Jaki byłby użyteczny przykład umieszczenia wszystkich parametrów ścieżki na mapie? Parametry ścieżki nie mają „klucza”, gdy patrzysz na sam URI, te klucze wewnątrz mapy zostałyby pobrane z adnotacji @Mapping, na przykład:
Z perspektywy perspektywy HTTP / REST parametrów ścieżki nie można tak naprawdę rzutować na mapę. Moim zdaniem, chodzi o elastyczność Springa i chęć zaspokojenia wszelkich zachcianek deweloperów.
Nigdy nie użyłbym mapy dla parametrów ścieżki, ale może być całkiem przydatny dla parametrów zapytania.
źródło