Spring MVC-Spring 컨트롤러의 맵에서 모든 요청 매개 변수를 얻는 방법은 무엇입니까?


183

샘플 URL :

../search/?attr1=value1&attr2=value2&attr4=value4

attr1, att2 및 attr4의 이름을 모릅니다.

요청 매개 변수 이름-> 값의 맵에 액세스 할 수있는 한 이와 비슷한 작업을 수행하고 싶습니다.

@RequestMapping(value = "/search/{parameters}", method = RequestMethod.GET)
public void search(HttpServletRequest request, 
@PathVariable Map<String,String> allRequestParams, ModelMap model)
throws Exception {//TODO: implement}

Spring MVC로 어떻게 이것을 달성 할 수 있습니까?

답변:


310

다른 답변은 정확하지만 HttpServletRequest 객체를 직접 사용하는 "봄 방법"은 아닙니다. 대답은 실제로 매우 간단하며 Spring MVC에 익숙 경우 예상 되는 것입니다.

@RequestMapping(value = {"/search/", "/search"}, method = RequestMethod.GET)
public String search(
@RequestParam Map<String,String> allRequestParams, ModelMap model) {
   return "viewName";
}

41
이름이 같은 확인란 그룹과 같은 목록 값을 처리하려면 다음을 사용하십시오. @RequestParam MultiValueMap<String, String>
IcedDante

1
고마워 헤더를 사용하여 동일한 작업을 수행 할 수 있습니다. stackoverflow.com/a/19556291/2599745
Rob Worsnop

3
요청 메소드가 GET 또는 POST 인 경우에만 작동합니다. PUT, DELETE 등 요청 메소드에는 작동하지 않습니다.
George Siggouroglou

추가 import org.springframework.ui.ModelMap;하는 것을 잊지 마십시오 .
truthadjustr

@typelogic ModelMap은 모든 요청 매개 변수를 맵으로 가져 오는 데 필요하지 않습니다. 그것은 단순히 OP 코드에 대한 세부 사항입니다.
xlm

34

편집하다

이 데이터를 얻을 수있는 순수한 Spring MVC 메커니즘 이 존재한다는 것이 지적되었다 ( 적어도 3.0에서 ). 다른 사용자의 답변이므로 여기서 자세히 설명하지 않습니다. 참조 AdamGent의 대답 @ 을 참조하십시오.

Spring 3.2 문서에서이 메커니즘은 RequestMappingJavaDoc 페이지와 JavaDoc 페이지 모두에 언급되어 RequestParam있지만 이전에는 RequestMapping페이지 에서만 언급되어 있습니다. 2.5 문서에는이 메커니즘에 대한 언급이 없습니다.

이것은 HttpServletRequest서블릿 -api jar에 의해 정의 된 객체 에 대한 바인딩을 제거하기 때문에 대부분의 개발자에게 선호되는 방법 일 것 입니다.

/편집하다

를 통해 요청 쿼리 문자열에 액세스 할 수 있어야합니다 request.getQueryString().

getQueryString 외에도 query 매개 변수는 request.getParameterMap () 에서 맵 으로 검색 될 수 있습니다 .


12
getQueryString이 Map이 아닌 String을 반환하기 때문에 누군가이 답변을 다운 투표했다고 생각합니다. op는 매개 변수의 맵을 찾고있었습니다. 나는 그것이 더 정확한 :) +1 도움말 메이크업에 대한 답에 getParameterMap 추가
jmort253

스프링 MVC 방식이 아니기 때문에 다운 투표를하지 않았습니다. @RequestParam기꺼이 Map매개 변수로 사용할 것입니다 (내 답변 참조).
Adam Gent

@AdamGent Spring 3.2가 아직 릴리스되지 않은 시점에 질문이 제기되었습니다. 돌아가서 JavaDoc for 3.1을 살펴보면 모든 쿼리 문자열 매개 변수를 검색하기 위해 를 사용 @RequestParam하는 것에 대한 언급이 없음을 알 수 있습니다 Map<String,String>. 그리고 제발, 당신이 여기에 보이는 대답에 대해 너무 혐오 하지 마십시오 ... 그들은 그렇게 나쁘지 않습니다 :) static.springsource.org/spring/docs/3.1.x/javadoc-api/org/…
nicholas. hauschild

나는 그것이 3.1에 존재한다고 생각했지만 JavaDoced는 아니었다. 나는 혐오감을 말하지 않았지만 그 길이 끝나지 않았다는 충격을 받았다 @RequestParam Map<>. Spring MVC (spring 3.1 이상)를 본 많은 현대 프로젝트에서 모든 메소드에 HttpServletRequest 및 HttpServletResponse를 넣을 것이라는 약간의 고민이 있습니다. 그리고 주니어 개발자가 문서를 보지 않고 StackOverflow와 Google을 사용하기 때문입니다. 이로 인해 Spring 프로젝트는 서블릿 API에서 Netty API로 전환하기가 어렵습니다. JAX-RS는 유사한 남용 문제를 가지고 있지만 훨씬 적은 수준입니다.
Adam Gent

또한 올바른 위치에있는 것이 아니라 3.1에서 JavaDoced입니다 . " 또한 @RequestParam을 Map <String, String> 또는 MultiValueMap <String, String> 메소드 매개 변수에서 사용하여 모든 요청 매개 변수에 액세스 할 수 있습니다. ". 사실 그것은 3.0 버전으로 돌아갑니다 (3.1 이전에 사용했음을 알았습니다). 사람들이 연구를 귀찮게하지 않았다는 점에 여전히 불만이 있습니다.
Adam Gent

14

HttpServletRequest 객체는 이미 매개 변수 맵을 제공합니다. 자세한 내용은 request.getParameterMap () 을 참조하십시오.


1
Get 매개 변수 맵에는 ​​POST 요청의 양식 데이터도 포함됩니다. 사용자가 쿼리 문자열의 키를 모르는 경우 쿼리 문자열에서 나온 것과 POST 본문의 데이터를 어떻게 구별 할 수 있습니까?
nicholas.hauschild

양식 게시를 처리하겠다고 말하고 있지만 실제 양식 매개 변수가 무엇인지 모릅니다.
Kevin

2
문제는 매개 변수 이름이 무엇인지 모른다는 것입니다. 또한 나는 그들이 무엇인지 모른다. ;)
nicholas.hauschild

죄송합니다. 전제를 조금 어리석게 생각합니다.
케빈

11
데이터 기반 애플리케이션에서 의미가 있습니다. 클라이언트가 요청 경로와 쿼리 문자열을 구성 할 수있는 곳에서 응용 프로그램 서버는 이러한 경로와 쿼리 문자열을 키로 사용하여 모든 종류의 데이터 소스에서 해당 값을 찾습니다.
nicholas.hauschild 1

12

당신은 단순히 이것을 사용할 수 있습니다 :

Map<String, String[]> parameters = request.getParameterMap();

잘 작동합니다


10

다음은 맵에서 요청 매개 변수가져 오는 간단한 예입니다 .

 @RequestMapping(value="submitForm.html", method=RequestMethod.POST)
     public ModelAndView submitForm(@RequestParam Map<String, String> reqParam) 
       {
          String name  = reqParam.get("studentName");
          String email = reqParam.get("studentEmail");

          ModelAndView model = new ModelAndView("AdmissionSuccess");
          model.addObject("msg", "Details submitted by you::
          Name: " + name + ", Email: " + email );
       }

이 경우 studentName 및 studentEmail의 값을 각각 이름 및 이메일 변수와 바인딩합니다.


8

org.springframework.web.context.request.WebRequest컨트롤러 메소드에서 매개 변수로 사용 하면 메소드가 제공됩니다. getParameterMap()이점은 애플리케이션을 Servlet API에 고정하지 않으며 WebRequest는 JavaEE 패턴 컨텍스트 오브젝트의 예입니다.


6

두 가지 인터페이스가 있습니다

  1. org.springframework.web.context.request.WebRequest
  2. org.springframework.web.context.request.NativeWebRequest

기본 서블릿 / 포틀릿 API에 연결하지 않고request/session 속성 요청뿐만 아니라 일반 요청 매개 변수 액세스를 허용합니다. .

전의.:

@RequestMapping(value = "/", method = GET)
public List<T> getAll(WebRequest webRequest){
    Map<String, String[]> params = webRequest.getParameterMap();
    //...
}

PS는 있다 컨트롤러 PARAMS로 사용할 수 있습니다 인수에 대한 문서.


작동합니다 감사합니다. 내가 String[]가치관 의 요점은 무엇 입니까? 값을 얻으려면 0으로 색인화해야합니다.
truthadjustr

값의 배열이있을 수 있습니다 같은 key=val1,val2key=val1&key=val2(나는이 두 가지 표기법의 제대로 봄 지원을 기억한다면) 당신은 두 요소 배열을 얻을 수 있도록
katoquro

6

나는 파티에 늦을지도 모르지만 내 이해에 따라 다음과 같은 것을 찾고 있습니다.

for(String params : Collections.list(httpServletRequest.getParameterNames())) {
    // Whatever you want to do with your map
    // Key : params
    // Value : httpServletRequest.getParameter(params)                
}

2
@SuppressWarnings("unchecked")
Map<String,String[]> requestMapper=request.getParameterMap();
JsonObject jsonObject=new JsonObject();
for(String key:requestMapper.keySet()){
    jsonObject.addProperty(key, requestMapper.get(key)[0]);
}

모든 매개 변수는에 저장됩니다 jsonObject.


1

쿼리 매개 변수와 경로 매개 변수에는 근본적인 차이가 있습니다. 다음과 같이 진행됩니다 : www.your_domain?queryparam1=1&queryparam2=2-쿼리 매개 변수. www.your_domain/path_param1/entity/path_param2-경로 매개 변수.

내가 놀란 것은 Spring MVC 세계에서 많은 사람들이 서로를 혼동한다는 것입니다. 쿼리 매개 변수는 검색 조건과 비슷하지만 경로 매개 변수는 리소스를 고유하게 식별 할 가능성이 높습니다. 그렇다고해서 리소스 구조가 중첩 될 수 있기 때문에 URI에 여러 경로 매개 변수를 가질 수 없다는 의미는 아닙니다. 예를 들어 특정 사람의 특정 자동차 리소스가 필요하다고 가정 해 봅시다.

www.my_site/customer/15/car/2 -15 번째 고객의 두 번째 차를 찾고 있습니다.

모든 경로 매개 변수를 맵에 넣는 유스 케이스는 무엇입니까? URI 자체를 볼 때 경로 매개 변수에는 "키"가 없습니다. 맵 내부의 키는 @Mapping 주석에서 가져옵니다. 예를 들면 다음과 같습니다.

@GetMapping("/booking/{param1}/{param2}")

HTTP / REST 관점에서 경로 매개 변수는 실제로 맵에 투영 될 수 없습니다. Spring의 유연성과 개발자의 변덕을 수용하려는 욕구에 관한 것입니다.

경로 매개 변수에 맵을 사용하지는 않지만 쿼리 매개 변수에 매우 유용 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.