2008-10-24 16 views
51

मैं SpringMVC का उपयोग कर एक वेब एप्लिकेशन लिखने की कोशिश कर रहा हूं। आम तौर पर मैं बस कुछ मेक-अप फ़ाइल एक्सटेंशन को स्प्रिंग के फ्रंट कंट्रोलर पर मैप करता हूं और खुशी से रहता हूं, लेकिन इस बार मैं रीस्ट-जैसी यूआरएल के लिए जा रहा हूं, बिना फ़ाइल-नाम एक्सटेंशन के।कोई भी सर्वलेट मैपिंग समझा सकता है?

सामने नियंत्रक करने के लिए अपने संदर्भ पथ के अंतर्गत सब कुछ का मिलान का मतलब है मैं भी स्थिर फ़ाइलों का ध्यान रखना चाहिए (इसे "एप्लिकेशन" कहते हैं), कुछ मैं नहीं बल्कि ऐसा नहीं चाहते हैं (क्यों अभी तक एक और weel एक नए अंदाज़ में?), तो टोमकैट के डिफ़ॉल्ट सर्वलेट के साथ कुछ संयोजन (चलिए इसे "टॉमकैट" कहते हैं) जाने का तरीका प्रतीत होता है।

मैं की तरह

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

<servlet-mapping> 
    <servlet-name>tomcat</servlet-name> 
    <url-pattern>*.ext</url-pattern> 
</servlet-mapping> 

कुछ कर रही है और मेरे स्थैतिक सामग्री की फ़ाइल एक्सटेंशन में से हर एक के लिए बाद दोहरा काम करने के लिए बात हो गया। मैं बस सोच रहा हूं कि निम्नलिखित सेटअप क्यों हैं, जो मेरे ऊपर एक के बराबर हैं, काम न करें।

<!-- failed attempt #1 --> 
<servlet-mapping> 
    <servlet-name>app</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    <servlet-name>tomcat</servlet-name> 
    <url-pattern>*.ext</url-pattern> 
</servlet-mapping> 

<!-- failed attempt #2 --> 
<servlet-mapping> 
    <servlet-name>app</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    <servlet-name>tomcat</servlet-name> 
    <url-pattern>/some-static-content-folder/*</url-pattern> 
</servlet-mapping> 

क्या कोई भी कुछ प्रकाश डाल सकता है?

+0

http://static.springsource.org/spring-webflow/docs/2.0:

यह एक बिलाव बग संस्करण 6.0.29 में तय हो का परिणाम था। एक्स/संदर्भ/एचटीएमएल/ch12s03.html –

+0

_ ** संबंधित: ** _ http://stackoverflow.com/a/14225540/814702 – informatik01

उत्तर

42

मुझे लगता है कि मुझे पता चल सकता है कि क्या हो रहा है।

अपने कामकाजी वेब.एक्सएमएल में आपने अपना सर्वलेट डिफ़ॉल्ट सर्वलेट होने के लिए सेट किया है (/ स्वयं डिफ़ॉल्ट डिफॉल्ट है जिसे बुलाया जाता है अगर कोई अन्य मैचों नहीं है), तो यह किसी भी अनुरोध का उत्तर देगा जो किसी अन्य मैपिंग से मेल नहीं खाता है।

विफल 1 में आपका/* मैपिंग वैध पथ मैपिंग प्रतीत होता है। Web.xml में/* मैपिंग के साथ यह अन्य पथ मैपिंग को छोड़कर सभी अनुरोधों का उत्तर देता है। विनिर्देश एक्सटेंशन मैपिंग के मुताबिक स्पष्ट मैपिंग्स हैं जो स्पष्ट मैपिंग द्वारा अधिलेखित हैं। यही कारण है कि एक्सटेंशन मानचित्रण विफल रहा। सबकुछ स्पष्ट रूप से ऐप पर मैप किया गया था।

असफल 2 में, ऐप स्थिर सामग्री मैपिंग से मेल खाने वाली सामग्री को छोड़कर, सब कुछ के लिए ज़िम्मेदार है। मैंने जो त्वरित परीक्षण स्थापित किया है, उसे दिखाने के लिए। यहाँ एक उदाहरण है।

/some-static-content-folder/test.png 

और फ़ाइल नहीं मिला था: /some-static-content-folder/test.png

test.png मैंने कोशिश पहुंचने का प्रयास कर सकते हैं। हालांकि

/some-static-content-folder/some-static-content-folder/test.png 

यह आ रहा है। तो ऐसा लगता है कि टॉमकैट डिफ़ॉल्ट सर्लेट (कम से कम 6.0.16) सर्वलेट मैपिंग को छोड़ देता है और शेष पथ का उपयोग करके फ़ाइल को खोजने का प्रयास करेगा। इस पोस्ट के अनुसार Servlet for serving static content जेटी आपको वह व्यवहार देता है जो मैं और मैं उम्मीद कर रहा था।

क्या कोई कारण है कि आप अपने बाकी कॉल के लिए रूट निर्देशिका जैसे मानचित्र कुछ नहीं कर सकते हैं। Rest_root फ़ोल्डर में चलने वाली किसी भी चीज के लिए आप ज़िम्मेदार हैं/rest_root/* से मैप किए गए ऐप की तरह कुछ, लेकिन जब तक आप एक और स्पष्ट मैपिंग नहीं करते हैं, तब तक कहीं और टोमकैट द्वारा संभाला जाना चाहिए। मैं आपके बाकी सर्वलेट को पथ मैपिंग पर सेट करने का सुझाव देता हूं, क्योंकि यह इरादा बेहतर घोषित करता है।/या/* उपयुक्त प्रतीत नहीं होता है, क्योंकि आपको अपवादों को मैप करना होगा।एक उदाहरण के रूप एसओ का उपयोग करना, मेरे बाकी मैपिंग

/उपयोगकर्ताओं/की तरह कुछ होगा उपयोगकर्ता सर्वलेट

/पदों/* पदों सर्वलेट के लिए

मानचित्रण आदेश

के लिए *
  1. स्पष्टीकरण (पथ मैपिंग्स)
  2. लागू (एक्सटेंशन मैपिंग)
  3. डिफ़ॉल्ट (/)

कृपया जो भी गलत हो, उसे सही करें।

+0

"विफल प्रयास # 1" के लिए स्पष्टीकरण लक्ष्य पर मृत है। अभी भी दूसरे को नहीं समझ सकता है। – agnul

+0

यदि/* पहले से ही "ऐप" सर्वलेट में मैप किया गया है, तो आप "/" मैपिंग से क्या प्राप्त करते हैं? –

+0

मैपिंग आउट/यदि आप/* का उपयोग करते हैं, तो इसका कोई लाभ नहीं है, क्योंकि इसे कभी भी कॉल नहीं किया जाएगा।/* का नुकसान यह है कि आपको सब कुछ संभालने की आवश्यकता होगी, जहां आप अभी भी एक्सटेंशन मैपिंग सेट कर सकते हैं। –

2

मैंने कभी इस तरह के सर्वलेट को मैप करने की कोशिश नहीं की है, लेकिन मैं तर्क दूंगा कि/* दोनों तकनीकी रूप से/* के साथ शुरू होते हैं, और दोनों मैचों के लिए समान चरित्र का उपयोग किया जाता है।

3

संदर्भ के लिए, "विफल प्रयास # 2" टॉमकैट> = से 6.0.29 के संस्करण में बिल्कुल सही है।

https://issues.apache.org/bugzilla/show_bug.cgi?id=50026

<!-- Correct for Tomcat >= 6.0.29 or other Servlet containers --> 
<servlet-mapping> 
    <servlet-name>app</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    <servlet-name>default</servlet-name> 
    <url-pattern>/some-static-content-folder/*</url-pattern> 
</servlet-mapping> 
संबंधित मुद्दे