2011-02-08 8 views
107

मैं एक साधारण, बहुत हल्का फ्रंट-कंट्रोलर बना रहा हूं। सही चुनने के लिए मुझे अलग-अलग हैंडलर (क्रियाओं) के अनुरोध पथों से मिलान करने की आवश्यकता है।HttpServletRequest में getRequestURI और getPathInfo विधियों के बीच क्या अंतर है?

मेरी स्थानीय मशीन HttpServletRequest.getPathInfo() और HttpServletRequest.getRequestURI() पर एक ही परिणाम लौटाएं। लेकिन मुझे यकीन नहीं है कि वे उत्पादन वातावरण में क्या करेंगे।

तो, इन पद्धतियों के बीच क्या अंतर है और मुझे क्या चुनना चाहिए?

+1

आप पा सकते हैं [इस उत्तर] http://stackoverflow.com/questions/3541077/डिजाइन-पैटर्न-वेब-आधारित-अनुप्रयोग/3542297 # 3542297) भी उपयोगी है। – BalusC

+0

@ बालससी: धन्यवाद, मैं पहले से ही उस उत्तर से कुछ सुझावों का उपयोग कर रहा हूं। – Roman

उत्तर

60

getPathInfo() यूआरआई के बाद अतिरिक्त पथ जानकारी देता है, जो आपके सर्वलेट तक पहुंचने के लिए उपयोग किया जाता है, जहां getRequestURI() पूर्ण यूआरआई देता है।

मैंने सोचा होगा कि वे अलग होंगे, क्योंकि सर्वलेट को अपने स्वयं के यूआरआई पैटर्न को पहले स्थान पर कॉन्फ़िगर किया जाना चाहिए; मुझे नहीं लगता कि मैंने कभी रूट (/) से सर्वलेट की सेवा की है।

उदाहरण के लिए यदि सर्वलेट 'फू' URI '/ foo' के लिए मैप किया गया है तो मैं सोचा होगा यूआरआई:

RequestURI = /foo/path/to/resource 

और

:

/foo/path/to/resource 

में परिणाम होगा

PathInfo = /path/to/resource 
+11

डिकोडिंग व्यवहार के बारे में उल्लेख करने लायक है। getRequestURI() स्ट्रिंग को डीकोड नहीं करता है। जहां GetPathInfo() डीकोड करता है। इस बहुत महत्वपूर्ण बिंदु के लिए –

+0

@KcDoD +1। –

16

निम्नलिखित सर्वलेट conf पर विचार करें:

<servlet> 
     <servlet-name>NewServlet</servlet-name> 
     <servlet-class>NewServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>NewServlet</servlet-name> 
     <url-pattern>/NewServlet/*</url-pattern> 
    </servlet-mapping> 

अब, जब मैं यूआरएल http://localhost:8084/JSPTemp1/NewServlet/jhi मारा, यह NewServlet आह्वान के रूप में यह पैटर्न ऊपर वर्णित के साथ मैप किया गया है जाएगा।

यहाँ:

  • getPathInfo()

    रिटर्न
    एक स्ट्रिंग, वेब कंटेनर द्वारा डिकोड, अतिरिक्त पथ जानकारी निर्दिष्ट:

    getRequestURI() = /JSPTemp1/NewServlet/jhi 
    getPathInfo() = /jhi 
    

    हम उन लोगों के लिए है वह आता है सर्वलेट पथ को फेंक दें लेकिन अनुरोध यूआरएल में क्वेरी स्ट्रिंग से पहले; या नल यूआरएल किसी भी अतिरिक्त पथ जानकारी नहीं है, तो

  • getRequestURI()

    रिटर्न
    एक स्ट्रिंग क्वेरी स्ट्रिंग के लिए प्रोटोकॉल नाम से URL के भाग युक्त

339

मैं यहां एक छोटी तुलना तालिका रखूंगा (बस इसे कहीं है):

सर्वलेट /test%3F/* के रूप में मैप किया गया है और आवेदन /app के तहत तैनात किया गया है।

http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S%3F+ID?p+1=c+d&p+2=e+f#a

Method    URL-Decoded Result   
---------------------------------------------------- 
getContextPath()  no  /app 
getLocalAddr()     127.0.0.1 
getLocalName()     30thh.loc 
getLocalPort()     8480 
getMethod()      GET 
getPathInfo()   yes  /a?+b 
getProtocol()     HTTP/1.1 
getQueryString()  no  p+1=c+d&p+2=e+f 
getRequestedSessionId() no  S%3F+ID 
getRequestURI()   no  /app/test%3F/a%3F+b;jsessionid=S+ID 
getRequestURL()   no  http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S+ID 
getScheme()      http 
getServerName()     30thh.loc 
getServerPort()     8480 
getServletPath()  yes  /test? 
getParameterNames()  yes  [p 2, p 1] 
getParameter("p 1")  yes  c d 

सर्वर ऊपर के उदाहरण में localhost:8480 पर चल रहा है और नाम 30thh.loc ओएस hosts फाइल में रखा गया था।

टिप्पणियाँ

  • "+" केवल क्वेरी स्ट्रिंग

  • एंकर "#a" सर्वर पर स्थानांतरित नहीं किया गया है में स्थान के रूप में नियंत्रित किया जाता है। केवल ब्राउज़र ही इसके साथ काम कर सकता है।

  • सर्वलेट मानचित्रण में url-pattern* साथ (उदाहरण के /test या *.jsp के लिए) खत्म नहीं होता है, तो getPathInfo() रिटर्न null

वसंत MVC प्रयोग किया जाता है

  • विधि getPathInfo() रिटर्न null

  • विधि getServletPath() संदर्भ पथ और सत्र आईडी के बीच का हिस्सा देता है।मूल्य ऊपर के उदाहरण में होगा /test?/a?+b

  • वसंत में @RequestMapping और @RequestParam का URL इनकोडिंग भागों के साथ सावधान रहें। यह छोटी गाड़ी (वर्तमान संस्करण 3.2.4) है और आमतौर पर not working as expected है।

+7

मैं आपका उत्तर प्रिंट कर रहा हूं और इसे हमारे कार्यालय पर एक पोस्टर के रूप में रखता हूं। यह कितना उपयोगी है! –

+1

'यदि सर्वलेट मैपिंग में यूआरएल-पैटर्न * के साथ समाप्त नहीं होता है (उदाहरण के लिए/test या * .jsp), getPathInfo() शून्य देता है। 'शानदार। –

+1

मेरा मानना ​​है कि 'getRequestURI()' और 'getRequestURL()' को इस मामले में 'एस% 3 एफ + आईडी' में गैर-डीकोडेड जेएसशनिड वापस करना चाहिए। कम से कम यह टॉमकैट/8.5.6 पर करता है। –

10

के अपने सर्वलेट तक पहुँचने के लिए पूर्ण URL है कि एक ग्राहक अपने पता बार में टाइप करेंगे टूट करते हैं:

http://www.example.com:80/awesome-application/path/to/servlet/path/info?a=1&b=2#boo

भागों हैं:

  1. योजना: http
  2. होस्टनाम: www.example.com
  3. पोर्ट: 80
  4. संदर्भ पथ: awesome-application
  5. सर्वलेट पथ: path/to/servlet
  6. पथ जानकारी: path/info
  7. क्वेरी: a=1&b=2
  8. टुकड़ा: boo

अनुरोध URI (getRequestURI द्वारा लौटाए गए) भागों 4, 5 और 6 के अनुरूप है।

(आकस्मिक रूप से, भले ही आप इसके लिए नहीं पूछ रहे हैं, विधि getRequestURL आपको भागों 1, 2, 3, 4, 5 और 6) देगी।

अब:

  • भाग 4 (संदर्भ पथ) कि सर्वर
  • भाग 5 (सर्वलेट पथ) में चले कई अन्य अनुप्रयोगों से बाहर अपने विशेष आवेदन के चयन करने के लिए प्रयोग किया जाता है प्रयोग किया जाता है कई अन्य सर्लेटों में से एक विशेष सर्वलेट का चयन करने के लिए जो आपके एप्लिकेशन के WAR
  • भाग 6 (पथ जानकारी) में आपके सर्वलेट के तर्क द्वारा व्याख्या की जा सकती है (उदाहरण के लिए यह आपके सर्वलेट द्वारा नियंत्रित कुछ संसाधनों को इंगित कर सकता है)।
  • भाग 7 (क्वेरी) भी अपने सर्वलेट getQueryString
  • भाग 8 (टुकड़ा) का उपयोग करने के लिए उपलब्ध कराया गया है यहां तक ​​कि सर्वर को नहीं भेजा जाता है और प्रासंगिक है और जाना जाता है केवल ग्राहक के लिए

निम्नलिखित हमेशा (URL एन्कोडिंग मतभेद को छोड़कर) रखती है:

requestURI = contextPath + servletPath + pathInfo 

Servlet 3.0 specification से निम्न उदाहरण बहुत उपयोगी है:


नोट: छवि, इस प्रकार मैं समय HTML में पुन: बनाने की जरूरत नहीं है: (

enter image description here

संबंधित मुद्दे