सर्वलेट मैपिंग यूआरएल पैटर्न में / और / * के बीच अंतर


175

परिचित कोड:

<servlet-mapping>
    <servlet-name>main</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>main</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

मेरी समझ यह है कि /*नक्शे http://host:port/context/*

कैसे के बारे में /? यह निश्चित है कि यह http://host:port/contextकेवल रूट करने के लिए मैप नहीं करता है । वास्तव में, यह स्वीकार करेगा http://host:port/context/hello, लेकिन अस्वीकार http://host:port/context/hello.jsp

क्या कोई समझा सकता है कि http://host:port/context/helloमैप कैसे किया जाता है ?

जवाबों:


268

<url-pattern>/*</url-pattern>

/*एक सर्वलेट पर इस तरह के डिफ़ॉल्ट सर्वलेट और JSP सर्वलेट के रूप में servletcontainer द्वारा प्रदान की सभी सर्वलेट्स सहित अन्य सभी servlets, ओवरराइड करता है। आप जो भी अनुरोध करते हैं, वह उस सर्वलेट में समाप्त हो जाएगा। यह इस प्रकार सर्वलेट्स के लिए एक खराब URL पैटर्न है। आमतौर पर, आप उपयोग करना चाहते हैं /*एक पर Filterही। यह कॉल करके अधिक विशिष्ट URL पैटर्न पर सुनने वाले किसी भी सर्वलेट के लिए अनुरोध जारी रखने में सक्षम है FilterChain#doFilter()

<url-pattern>/</url-pattern>

/किसी अन्य सर्वलेट हावी नहीं होता। यह केवल सभी अनुरोधों के लिए सर्वलेटेनर के बिलिन डिफ़ॉल्ट सर्वलेट को बदलता है जो किसी अन्य पंजीकृत सर्वलेट से मेल नहीं खाता है। यह आमतौर पर केवल स्थैतिक संसाधनों (सीएसएस / जेएस / छवि / आदि) और निर्देशिका लिस्टिंग पर लगाया जाता है। सर्वलेटकॉर्नर का अंतर्निहित डिफ़ॉल्ट सर्वलेट HTTP कैश अनुरोधों, मीडिया (ऑडियो / वीडियो) स्ट्रीमिंग और फ़ाइल फिर से शुरू करने से निपटने में भी सक्षम है। आमतौर पर, आप डिफ़ॉल्ट सर्वलेट को ओवरराइड नहीं करना चाहते हैं क्योंकि आपको अन्यथा इसके सभी कार्यों का ध्यान रखना होगा, जो बिल्कुल तुच्छ नहीं है (JSF यूटिलिटी लाइब्रेरी OmniFaces का एक खुला स्रोत उदाहरण है)। इस प्रकार यह सर्वलेट्स के लिए एक खराब URL पैटर्न भी है। जैसे कि JSP पृष्ठों ने इस सर्वलेट को हिट क्यों नहीं किया है, ऐसा इसलिए है क्योंकि सर्वलेटक के अंतर्निहित JSP सर्वलेट को आमंत्रित किया जाएगा, जो पहले से ही अधिक विशिष्ट URL पैटर्न पर डिफ़ॉल्ट रूप से मैप किया गया है*.jsp

<url-pattern></url-pattern>

फिर खाली स्ट्रिंग URL पैटर्न भी है । जब संदर्भ रूट का अनुरोध किया जाएगा तो इसे लागू किया जाएगा। यह उस <welcome-file>दृष्टिकोण से अलग है जिसे किसी भी सबफ़ोल्डर द्वारा अनुरोध किए जाने पर इसे लागू नहीं किया जाता है। यदि आप " होम पेज सर्वलेट चाहते हैं तो यह वास्तव में आपके द्वारा खोजा जाने वाला URL पैटर्न है।" " चाहते हैं। मुझे केवल यह स्वीकार करना है कि मैं सहजता से रिक्त स्ट्रिंग URL पैटर्न और स्लैश URL पैटर्न की अपेक्षा करता हूं/ को बिल्कुल दूसरे तरीके से परिभाषित किया जाता है, इसलिए मैं समझ सकता हूं कि बहुत सारी शुरुआत इस पर भ्रमित हो गई थी। पर अब जो है वो है।

सामने नियंत्रक

मामले में आप वास्तव में एक सामने नियंत्रक सर्वलेट है करना चाहते हैं, तो आप सबसे अच्छा जैसे अधिक विशिष्ट URL पैटर्न पर यह नक्शा चाहते *.html, *.do, /pages/*, /app/*, आदि आप दूर एक आम URL पैटर्न पर सामने नियंत्रक URL पैटर्न और कवर निश्चित संसाधनों को छुपा सकते हैं जैसे /resources/*, /static/*, आदि एक सर्वलेट फिल्टर की मदद से। यह भी देखें कि सामने वाले नियंत्रक सर्वलेट द्वारा संकलित होने से स्थैतिक संसाधनों को कैसे रोका जाए, जो / * पर मैप किया जाता है । ध्यान दिया जाना चाहिए कि स्प्रिंग एमवीसी में एक अंतर्निहित स्थिर संसाधन सर्वलेट है, इसलिए आप /वसंत में स्थिर संसाधनों के लिए एक सामान्य यूआरएल पैटर्न को कॉन्फ़िगर करते हैं, तो आप इसके सामने के नियंत्रक को मैप कर सकते हैं । यह भी देखें कि स्प्रिंग एमवीसी में स्थिर सामग्री को कैसे संभालना है?


9
धन्यवाद। कुछ शोध के बाद, मैं एक सूक्ष्म बिंदु स्पष्ट करना चाहूंगा। / वेब सर्वर स्थापित डिफ़ॉल्ट सर्वलेट ओवरराइट करता है। उदाहरण के लिए, Tomcat एक DefaultServlet स्थापित करता है जो स्थैतिक संसाधनों का काम करता है। (सबसे अधिक संभावना अवांछनीय) साइड इफेक्ट के रूप में डिफ़ॉल्ट सर्वलेट से उपयोग / छुटकारा मिलता है।
कैंडी चिउ

खैर, मैं इसे "ओवरराइटिंग" नहीं कहूंगा, लेकिन "रिप्लेसिंग" करूंगा। यह उस तरह डिफ़ॉल्ट सर्वलेट को बदलने के लिए उपयोगी हो सकता है।
बालूसी 12

1
<url-pattern> </ url-pattern> एक त्रुटि फेंकता है: सर्वेंट मैपिंग में अमान्य <url-pattern>
स्लिम

त्रुटि संदेश टॉमकैट से था, मेरी आईडीई से नहीं; हालांकि, मैं टॉमकैट 6 का उपयोग कर रहा हूं, इसलिए शायद यह मुद्दा है;)
स्लिम

2
@ बाल्सक, क्या आप कृपया मुझे बता सकते हैं कि /**पैटर्न क्या दर्शाता है?
साजीब आचार्य

45

मैं मानचित्रण नियमों और एक उदाहरण के साथ BalusC के उत्तर को पूरक करना चाहता हूं।

सर्वलेट 2.5 नियम से मानचित्रण नियम:

  1. मानचित्र का सटीक URL
  2. मानचित्र वाइल्डकार्ड पथ
  3. नक्शा एक्सटेंशन
  4. डिफ़ॉल्ट सर्वलेट में मैप करें

हमारे उदाहरण में, तीन सर्वलेट हैं। / हमारे द्वारा स्थापित डिफ़ॉल्ट सर्वलेट है। टॉमकैट जेएसपी और जेपीएक्स की सेवा के लिए दो सर्वलेट्स स्थापित करता है। तो मैप करने के लिएhttp://host:port/context/hello

  1. इसके बाद कोई सटीक URL सर्वलेट्स इंस्टॉल नहीं किए गए हैं।
  2. कोई वाइल्डकार्ड पथ सेवकों को स्थापित नहीं करता है, अगले।
  3. किसी भी एक्सटेंशन से मेल नहीं खाता।
  4. डिफ़ॉल्ट सर्वलेट में मैप करें, वापस लौटें।

नक्शा http://host:port/context/hello.jsp

  1. इसके बाद कोई सटीक URL सर्वलेट्स इंस्टॉल नहीं किए गए हैं।
  2. कोई वाइल्डकार्ड पथ सेवकों को स्थापित नहीं करता है, अगले।
  3. पाया एक्सटेंशन सर्वलेट, वापसी।

25

शायद आपको यह जानने की जरूरत है कि कैसे यूरल्स की मैपिंग की जाती है, क्योंकि मैं 404घंटों तक पीड़ित हूं । अनुरोधों को संभालने वाले दो प्रकार के हैं। BeanNameUrlHandlerMappingऔर SimpleUrlHandlerMapping। जब हमने एक परिभाषित किया servlet-mapping, हम उपयोग कर रहे हैं SimpleUrlHandlerMapping। एक बात जो हमें जाननी चाहिए, वह यह है कि इन दो हैंडलर में एक आम संपत्ति होती है जिसे alwaysUseFullPathडिफॉल्ट कहा जाता हैfalse

falseयहाँ का अर्थ है कि स्प्रिंग एक नियंत्रक को एक यूआरएल मैप करने के लिए पूर्ण पथ का उपयोग नहीं करेगा। इसका क्या मतलब है? इसका मतलब है जब आप एक परिभाषित करते हैं servlet-mapping:

<servlet-mapping>
    <servlet-name>viewServlet</servlet-name>
    <url-pattern>/perfix/*</url-pattern>
</servlet-mapping>

हैंडलर वास्तव *में नियंत्रक को खोजने के लिए भाग का उपयोग करेगा । उदाहरण के लिए, निम्न नियंत्रक 404त्रुटि का सामना करेंगे जब आप इसका उपयोग करने का अनुरोध करेंगे/perfix/api/feature/doSomething

@Controller()
@RequestMapping("/perfix/api/feature")
public class MyController {
    @RequestMapping(value = "/doSomething", method = RequestMethod.GET) 
    @ResponseBody
    public String doSomething(HttpServletRequest request) {
        ....
    }
}

यह एक सही मैच है, है ना? लेकिन क्यों 404। जैसा कि पहले उल्लेख किया गया है, डिफ़ॉल्ट मान alwaysUseFullPathगलत है, जिसका अर्थ है कि आपके अनुरोध में, केवल /api/feature/doSomethingएक संबंधित नियंत्रक खोजने के लिए उपयोग किया जाता है, लेकिन उस पथ के बारे में कोई नियंत्रक परवाह नहीं करता है। आपको या तो अपने url को बदलने /perfix/perfix/api/feature/doSomethingया perfixMyController आधार से हटाने की आवश्यकता है @RequestingMapping


8

मुझे लगता है कि कैंडी का जवाब ज्यादातर सही है। एक छोटा सा हिस्सा है जो मुझे लगता है अन्यथा।

मेजबान को मैप करने के लिए: पोर्ट / संदर्भ / हेल्लो ।jsp

  1. इसके बाद कोई सटीक URL सर्वलेट्स इंस्टॉल नहीं किए गए हैं।
  2. पाया वाइल्डकार्ड रास्ते सर्विसलेट , वापसी।

मेरा मानना ​​है कि क्यों "/ *" मेजबान से मेल नहीं खाता है: पोर्ट / संदर्भ / हैलो क्योंकि यह एक फ़ाइल के बजाय एक पथ के रूप में "/ हैलो" व्यवहार करता है (क्योंकि इसमें विस्तार नहीं है)।


2

के बीच आवश्यक अंतर /*और /यह है कि मैपिंग के /*साथ एक सर्वलेट का विस्तार एक्सटेंशन मैपिंग (जैसे *.html) के साथ किसी भी सर्वलेट से पहले किया जाएगा , जबकि मैपिंग के साथ एक सर्वलेट/ का चयन किया जाएगा के बाद ही विस्तार मैपिंग माना जाता है (और किसी भी अनुरोध जो नहीं करता है 'के लिए इस्तेमाल किया जाएगा t कुछ और मैच --- यह "डिफ़ॉल्ट सर्वलेट") है।

विशेष रूप से, /*मानचित्रण हमेशा एक से पहले चुना जाएगा/ मैपिंग । या तो कंटेनर के स्वयं के डिफ़ॉल्ट सर्वलेट तक पहुंचने से किसी भी अनुरोध को रोकता है।

या तो सर्वलेट मैपिंग के बाद ही चयन किया जाएगा जो सटीक मिलान (जैसे /foo/bar) हैं और जो पथ मैपिंग की तुलना में लंबे समय तक हैं /*(जैसे /foo/*)। ध्यान दें कि रिक्त स्ट्रिंग मैपिंग संदर्भ रूट ( http://host:port/context/) के लिए एक सटीक मिलान है ।

जावा सर्वलेट स्पेसिफिकेशन के अध्याय 12 को http://download.oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.html पर संस्करण 3.1 में उपलब्ध देखें ।

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