स्प्रिंग एमवीसी - स्प्रिंग नियंत्रक में एक नक्शे में सभी अनुरोधों को कैसे प्राप्त करें?


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}

स्प्रिंग एमवीसी के साथ मैं इसे कैसे प्राप्त कर सकता हूं?

जवाबों:


310

हालांकि अन्य उत्तर सही हैं, लेकिन निश्चित रूप से सीधे HttpServletRequest ऑब्जेक्ट का उपयोग करने के लिए "स्प्रिंग तरीका" नहीं है। उत्तर वास्तव में काफी सरल है और यदि आप स्प्रिंग एमवीसी से परिचित हैं तो आप क्या उम्मीद करेंगे

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

41
यदि आप सूची मानों को प्रोसेस करना @RequestParam MultiValueMap<String, String>
चाह

1
इसके लिए धन्यवाद। आप हेडर्स के साथ भी ऐसा ही कर सकते हैं: stackoverflow.com/a/19556291/2599745
Rob Worsnop

3
यह केवल तभी काम कर रहा है जब अनुरोध विधि GET या POST हो। यह PUT, DELETE आदि अनुरोध विधियों के लिए काम नहीं कर रहा है।
जॉर्ज सिगुरोग्लू

import org.springframework.ui.ModelMap;साथ ही जोड़ना न भूलें ।

@typelogic ModelMapको मानचित्र के रूप में सभी अनुरोधों को प्राप्त करने की आवश्यकता नहीं है; यह केवल ओपी कोड के लिए एक विवरण विशिष्ट है।
xlm

34

संपादित करें

यह बताया गया है कि वहाँ ( कम से कम 3.0 के रूप में ) एक शुद्ध स्प्रिंग MVC तंत्र मौजूद है जिसके द्वारा किसी को यह डेटा मिल सकता है। मैं इसे यहां विस्तार नहीं दूंगा, क्योंकि यह दूसरे उपयोगकर्ता का जवाब है। देखें @ AdamGent के जवाब जानकारी के लिए, और भूल नहीं है यह वोट दें करने के लिए।

स्प्रिंग 3.2 डॉक्यूमेंटेशन में इस तंत्र का उल्लेख RequestMappingजावाडोक पेज और जावाडोक पेज दोनों पर किया गया है RequestParam, लेकिन पूर्व में, यह केवल RequestMappingपृष्ठ में उल्लेखित है । 2.5 प्रलेखन में इस तंत्र का कोई उल्लेख नहीं है।

यह संभवतः अधिकांश डेवलपर्स के लिए पसंदीदा दृष्टिकोण है क्योंकि यह HttpServletRequestसर्वलेट-एआई जार द्वारा परिभाषित वस्तु से बाध्यकारी (कम से कम इस) को हटा देता है ।

/ संपादित करें

आपके पास अनुरोध क्वेरी स्ट्रिंग के माध्यम से पहुंच होनी चाहिए request.getQueryString()

GetQueryString के अलावा, क्वेरी मापदंडों को एक मानचित्र के रूप में request.getParameterMap () से भी पुनर्प्राप्त किया जा सकता है ।


12
मुझे संदेह है कि किसी ने इस उत्तर को केवल इसलिए अस्वीकृत कर दिया क्योंकि getQueryString एक स्ट्रिंग देता है और एक मानचित्र नहीं। ऑप मापदंडों के मानचित्र की तलाश में था। मैंने आपके उत्तर में getParameter को जोड़ने के लिए इसे और अधिक सही बनाने में मदद करने के लिए :) :)
jmort253

नहीं, क्योंकि मैं इसे करने के लिए स्प्रिंग एमवीसी तरीका नहीं है। @RequestParamख़ुशी से Mapएक पैरामीटर के रूप में ले जाएगा (मेरा उत्तर देखें)।
एडम जेंट

@AdamGent सवाल उस समय पूछा गया था जब स्प्रिंग 3.2 अभी तक जारी नहीं किया गया था। वापस जाएं और 3.1 के लिए JavaDoc पर एक नज़र डालें, और आप देखेंगे कि सभी क्वेरी स्ट्रिंग मापदंडों को पुनः प्राप्त करने के लिए उपयोग @RequestParamपर ऐसा कोई उल्लेख नहीं है Map<String,String>। और कृपया, नहीं लग रहा है तो जवाब आप यहाँ देख से अधिक से नफरत करते थे ... वे नहीं कर रहे हैं कि बुरा :) static.springsource.org/spring/docs/3.1.x/javadoc-api/org/...
निकोलस। hauschild

मुझे लगता है कि यह 3.1 में मौजूद था, लेकिन JavaDoced नहीं था। मैंने नहीं कहा कि मैं घृणित था, लेकिन हैरान @RequestParam Map<>था कि ऐसा नहीं किया गया था। मुझे इस बात में थोड़ी झुंझलाहट है कि मैंने कई आधुनिक परियोजनाओं में स्प्रिंग एमवीसी (स्प्रिंग 3.1 और अधिक से अधिक) देखे हैं, वे हर विधि पर HttpServletRequest और HttpServletResponse डालेंगे। और ऐसा लगता है क्योंकि जूनियर डेवलपर्स डॉक को देखने के बजाय StackOverflow और google का उपयोग करते हैं। इससे स्प्रिंग प्रोजेक्ट को नेटी एपीआई कहने के लिए सर्वलेट एप से स्विच करना मुश्किल हो जाता है। JAX-RS में दुर्व्यवहार के समान मुद्दे हैं लेकिन बहुत कम डिग्री पर।
एडम गेंट

और यह केवल सही स्थानों में नहीं, केवल 3.1 में JavaDoced है : " इसके अतिरिक्त, @RequestParam का उपयोग सभी अनुरोध मापदंडों तक पहुंच प्राप्त करने के लिए एक मानचित्र <स्ट्रिंग, स्ट्रिंग> या MultiValueMap <स्ट्रिंग, स्ट्रिंग> विधि पैरामीटर पर किया जा सकता है। " वास्तव में यह सभी संस्करण 3.0 में वापस चला जाता है (मुझे पता था कि मैंने 3.1 से पहले इसका इस्तेमाल किया था)। मेरी झुंझलाहट अभी भी इस बात में है कि लोगों ने शोध करने की जहमत नहीं उठाई :)
एडम जेंट

14

HttpServletRequest ऑब्जेक्ट पहले से ही मापदंडों का एक नक्शा प्रदान करता है। देखें request.getParameterMap () अधिक जानकारी के लिए।


1
गेट पैरामीटर मैप में POST अनुरोध से फॉर्म डेटा भी होगा। यदि उपयोगकर्ता क्वेरी स्ट्रिंग में कुंजियों को नहीं जानता है, तो वे कैसे क्वेरी स्ट्रिंग से आए और एक POST बॉडी के डेटा से क्या अंतर कर पाएंगे?
nicholas.hauschild

क्या आप मुझे बता रहे हैं कि आप एक फॉर्म पोस्ट को संसाधित करने जा रहे हैं, लेकिन आपको पता नहीं है कि वास्तविक फॉर्म पैरामीटर क्या हैं?
केविन

2
प्रश्न में कहा गया है कि वह नहीं जानता कि पैरामीटर नाम क्या हैं। इसके अलावा, मुझे नहीं पता कि वे क्या हैं। ;)
nicholas.hauschild

क्षमा करें, मुझे आधार थोड़ा हास्यास्पद लगता है।
केविन

11
यह एक डेटा संचालित एप्लिकेशन में समझ में आता है। जहाँ अनुरोध पथ और क्वेरी स्ट्रिंग क्लाइंट द्वारा किए जा सकते हैं, और अनुप्रयोग सर्वर तब इन रास्तों और क्वेरी स्ट्रिंग्स को कुंजियों के रूप में उपयोग करके संबंधित मान (किसी भी प्रकार के डेटा स्रोत से) को देखेगा।
nicholas.hauschild

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 );
       }

इस स्थिति में, यह छात्रनाम और छात्र के नाम को क्रमशः नाम और ईमेल चर के साथ बांध देगा।


8

org.springframework.web.context.request.WebRequestअपने नियंत्रक विधि में एक पैरामीटर के रूप में उपयोग करें , यह विधि प्रदान करता है getParameterMap(), लाभ यह है कि आप अपने आवेदन को सर्वलेट एपीआई से तंग नहीं करते हैं, WebRequest JavaEE पैटर्न प्रसंग ऑब्जेक्ट का एक उदाहरण है।


6

दो इंटरफेस हैं

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

देशी सर्वलेट / पोर्टलेट एपीआई के संबंधों के बिना जेनेरिक अनुरोध पैरामीटर एक्सेस के साथ-साथ request/sessionविशेषता एक्सेस की अनुमति देता है

पूर्व .:

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

PS तर्क के बारे में डॉक्स हैं जिनका उपयोग नियंत्रक पैरामेट्स के रूप में किया जा सकता है।


धन्यवाद, यह काम करता है। क्या मैं पूछ सकता हूं कि String[]मूल्य के रूप में क्या है? मूल्य प्राप्त करने के लिए मुझे इसे 0 पर अनुक्रमित करना होगा।
truthadjustr

मानों की एक सरणी हो सकती है जैसे ( key=val1,val2या key=val1&key=val2यदि मुझे इन दोनों संकेतन का सही ढंग से वसंत समर्थन याद है) तो आपको 2 तत्वों के साथ सरणी मिल जाएगी
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- पथ पैरामीटर।

मुझे आश्चर्य हुआ कि स्प्रिंग एमवीसी दुनिया में बहुत सारे लोग एक दूसरे के लिए भ्रमित करते हैं। जबकि खोज के लिए क्वेरी पैरामीटर अधिक मापदंड की तरह हैं, पथ पैरामीटर सबसे अधिक संभावना एक संसाधन की पहचान करेंगे। यह कहने के बाद, इसका मतलब यह नहीं है कि आपके URI में कई पथ पैरामीटर नहीं हो सकते हैं, क्योंकि संसाधन संरचना को नेस्टेड किया जा सकता है। उदाहरण के लिए, मान लें कि आपको किसी विशिष्ट व्यक्ति के विशिष्ट कार संसाधन की आवश्यकता है:

www.my_site/customer/15/car/2 - 15 वें ग्राहक की दूसरी कार की तलाश।

सभी पाथ पैरामीटर्स को मैप में डालना क्या usecase होगा? पथ पैरामीटर में एक "कुंजी" नहीं होती है जब आप एक URI को देखते हैं, तो मानचित्र के अंदर की कुंजी आपके @ मैपिंग एनोटेशन से ली जाएगी, उदाहरण के लिए:

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

HTTP / REST परिप्रेक्ष्य पथ मापदंडों से वास्तव में मानचित्र पर प्रोजेक्ट नहीं किया जा सकता है। यह सब स्प्रिंग के लचीलेपन और किसी भी डेवलपर्स को समायोजित करने की उनकी इच्छा के बारे में है, मेरी राय में।

मैं कभी भी पथ मापदंडों के लिए मानचित्र का उपयोग नहीं करूंगा, लेकिन यह क्वेरी मापदंडों के लिए काफी उपयोगी हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.