2012-12-05 15 views
196

विशेष वर्णों को संभालने के दौरान @RequestParam और @PathVariable के बीच क्या अंतर है? + को स्पेस के रूप में @RequestParam द्वारा स्वीकार किया गया था। @PathVariable के मामले में, + को + के रूप में स्वीकार किया गया था।@RequestParam बनाम @PathVariable

उत्तर

335

देख यूआरएल http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 हो जाता है 5 दिसंबर, 2013 को उपयोगकर्ता 1234 के लिए चालान, नियंत्रक विधि इस तरह दिखेगी:

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET) 
public List<Invoice> listUsersInvoices(
      @PathVariable("userId") int user, 
      @RequestParam(value = "date", required = false) Date dateOrNull) { 
    ... 
} 

इसके अलावा, अनुरोध पैरामीटर वैकल्पिक हो सकते हैं, लेकिन पथ चर नहीं कर सकते - अगर वे थे, तो यह यूआरएल पथ पदानुक्रम बदल देगा और अनुरोध मैपिंग संघर्ष पेश करेगा। उदाहरण के लिए, /user/invoices उपयोगकर्ता null के लिए चालान या आईडी "चालान" वाले उपयोगकर्ता के बारे में विवरण प्रदान करेगा?

+0

क्या पोस्ट अनुरोध के साथ @pathVariable काम कर सकते हैं? – ishanbakshi

+2

'@ PathVariable' किसी भी अनुरोध विधि –

+0

में उपयोग किया जा सकता है एक बहुत अच्छा उदाहरण। – Sid

0

यह हो सकता है कि आवेदन/x-www फार्म-urlencoded + को Midia प्रकार परिवर्तित अंतरिक्ष, और रिसीवर + परिवर्तित अधिक जानकारी के लिए यूआरएल space.check करने से डेटा को डिकोड होगा। http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1

59

@RequestParam एनोटेशन अनुरोध से क्वेरी पैरामीटर मानों तक पहुंचने के लिए उपयोग किया गया। निम्नलिखित अनुरोध URL को देखो:

http://localhost:8080/springmvc/hello/101?param1=10&param2=20 

ऊपर URL अनुरोध में, param1 और param2 के लिए मूल्यों नीचे के रूप में पहुँचा जा सकता है:

public String getDetails(
    @RequestParam(value="param1", required=true) String param1, 
     @RequestParam(value="param2", required=false) String param2){ 
... 
} 

निम्नलिखित द्वारा समर्थित मानकों की सूची इस प्रकार @ RequestParam एनोटेशन:

  • DefaultValue - यह एक fallback तंत्र के रूप में डिफ़ॉल्ट मान है यदि अनुरोध मूल्य होने नहीं है या यह रिक्त है ।
  • नाम - पैरामीटर के नाम बाध्य करने के लिए
  • आवश्यक - चाहे पैरामीटर अनिवार्य है या नहीं। यदि यह सत्य है, तो उस पैरामीटर को भेजने में असफल हो जायेगा।
  • मूल्य - यह नाम के लिए एक उपनाम का श्रेय

@PathVariable

@PathVariable पैटर्न है कि आने वाली अनुरोध के लिए यूआरआइ में प्रयोग किया जाता है की पहचान करता है।के नीचे अनुरोध URL पर नजर डालते हैं:

http://localhost:8080/springmvc/hello/101?param1=10&param2=20

ऊपर URL अनुरोध नीचे के रूप में अपने स्प्रिंग MVC में लिखा जा सकता है:

@RequestMapping("/hello/{id}") public String getDetails(@PathVariable(value="id") String id, 
    @RequestParam(value="param1", required=true) String param1, 
    @RequestParam(value="param2", required=false) String param2){ 
....... 
} 

@PathVariable एनोटेशन केवल अनुरोध यूआरआई टेम्पलेट बाध्य करने के लिए एक विशेषता मूल्य। इसे एकल विधि में एकाधिक @PathVariable एनोटेशन का उपयोग करने की अनुमति है। लेकिन, सुनिश्चित करें कि एक से अधिक तरीकों में एक ही पैटर्न नहीं है। @MatrixVariable

http://localhost:8080/spring_3_2/matrixvars/stocks;BT.A=276.70,+10.40,+3.91;AZN=236.00,+103.00,+3.29;SBRY=375.50,+7.60,+2.07

और यह

@RequestMapping(value = "/{stocks}", method = RequestMethod.GET) 
    public String showPortfolioValues(@MatrixVariable Map<String, List<String>> matrixVars, Model model) { 

    logger.info("Storing {} Values which are: {}", new Object[] { matrixVars.size(), matrixVars }); 

    List<List<String>> outlist = map2List(matrixVars); 
    model.addAttribute("stocks", outlist); 

    return "stocks"; 
    } 

लेकिन आप सक्षम करना होगा के लिए नियंत्रक विधि:

इसके अलावा वहाँ एक और अधिक दिलचस्प टिप्पणी है

<mvc:annotation-driven enableMatrixVariables="true" > 
+0

क्या कोई स्ट्रिंग, जैसे 'userName' में एक प्रकार है परम या नहीं? मैं इसे एक चर बनाने की ओर झुका रहा हूं, लेकिन यह भी एक param हो सकता है। – cst1992

+0

.. और यहां मूल पोस्ट है: - http://javabeat.net/spring-mvc-requestparam-pathvariable/ –

-1
@PathVariable - must be placed in the endpoint uri and access the query parameter value from the request 
@RequestParam - must be passed as method parameter (optional based on the required property) 
http://localhost:8080/employee/call/7865467 

@RequestMapping(value=“/call/{callId}", method = RequestMethod.GET) 
public List<Calls> getAgentCallById(
      @PathVariable(“callId") int callId, 
      @RequestParam(value = “status", required = false) String callStatus) { 

    } 

http://localhost:8080/app/call/7865467?status=Cancelled 

@RequestMapping(value=“/call/{callId}", method = RequestMethod.GET) 
public List<Calls> getAgentCallById(
      @PathVariable(“callId") int callId, 
      @RequestParam(value = “status", required = true) String callStatus) { 

}