2012-11-15 22 views
10
<servlet-mapping> 
    <servlet-name>testServlet</servlet-name> 
    <url-pattern>/test/*</url-pattern> 
</servlet-mapping> 

यदि मैं /परीक्षण/पृष्ठ हिट करता हूं तो उपरोक्त काम करेगा। हालांकि, /परीक्षण या /test/ पर काम नहीं करेगा। मैं वसंत MVC का उपयोग कर रहा है, और मेरे अनुरोध मानचित्रण इस प्रकार है:स्प्रिंग एमवीसी में एक सर्वलेट मैपिंग में मैं यूआरएल पैटर्न निर्देशिका की जड़ कैसे मैप कर सकता हूं?

@RequestMapping(value = {"","/"}) 

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

मैं एक स्वतंत्र परियोजना के साथ की पुष्टि करने की प्रक्रिया में हूँ, लेकिन यह एक बग प्रतीत होता है वसंत के UrlPathHelper के साथ। जब कोई संदर्भ और सर्वलेट पथ होता है, तो निम्न विधि गलत पथ लौटाती है, और आपने बिना किसी पीछे की स्लैश के सर्वलेट को दबाया है।

<servlet-mapping> 
    <servlet-name>usersServlet</servlet-name> 
    <url-pattern>/users/*</url-pattern> 
</servlet-mapping> 

अब मैं इस तरह मेरे नियंत्रकों में से एक में एक अनुरोध मानचित्रण है:

public String getPathWithinApplication(HttpServletRequest request) { 
    String contextPath = getContextPath(request); 
    String requestUri = getRequestUri(request); 
    if (StringUtils.startsWithIgnoreCase(requestUri, contextPath)) { 
     // Normal case: URI contains context path. 
     String path = requestUri.substring(contextPath.length()); 
     return (StringUtils.hasText(path) ? path : "/"); 
    } 
    else { 
     // Special case: rather unusual. 
     return requestUri; 
    } 
} 

बस एक उदाहरण के रूप चलो कहते हैं कि मैं "व्यवस्थापक" के संदर्भ और निम्नलिखित सर्वलेट-मानचित्रण डालते हैं

@RequestMapping(value = {"","/"}) 

अगर मैं /व्यवस्थापक मारा/उपयोगकर्ताओं यह काम नहीं करेगा। हालांकि, अगर मैंने /व्यवस्थापक/उपयोगकर्ता/ पर काम किया है तो यह काम करेगा। अब अगर मैं दोनों काम वे उसके बाद निम्न होगा करने के लिए मेरे अनुरोध मानचित्रण बदलें:

@RequestMapping(value = {"/users","/"}) 

हालांकि, अब यूआरएल /व्यवस्थापक/उपयोगकर्ता/उपयोगकर्ताओं भी काम करेंगे (जो मैं क्या चाहते हो जाएगा नहीं है)।

उत्तर

2

सबसे पहले, मैपिंग प्रेषक सर्वलेट के बीच अंतर "/" और "/ *" के बीच अंतर। एक अंतर है!

"/ *" पर मैपिंग करते समय, सभी यूआरएल अनुरोध (इस तरह के कुछ सहित//WEB-INF/jsp/.../index.jsp ") प्रेषक सर्वलेट में मैप किए जाते हैं।

दूसरा, स्प्रिंग + टाइल्स का उपयोग करते समय, और अपनी टाईल्स परिभाषा में कुछ जेएसपी लौटने पर, इसे आंतरिक अग्रेषण अनुरोध के रूप में माना जाता है, और मूल अनुरोध के समान सर्लेट द्वारा संभाला जाता है। मेरे उदाहरण में, मैं रूट यूआरएल "/" का आह्वान करता हूं, जिसे घर() विधि द्वारा ठीक से पकड़ा जाता है, और उसके बाद टाइल्स द्वारा "index.jsp" पर भेजा जाता है, जिसे फिर से डिस्पैचर सर्वलेट द्वारा संभाला जा रहा है। जाहिर है, प्रेषक सर्वलेट "index.jsp" को संभाल नहीं सकता है, क्योंकि इसके लिए कोई नियंत्रक नहीं है।

हाँ, यह बदसूरत है, लेकिन ऐसा लगता है कि यह काम करता है।

तो, एकमात्र समाधान जो मैंने पाया है: वेब/एक्सएमएल में "/ *" वापस "/" को बदलने के लिए। इस तरह जेएसपी को टोमकैट के जेएसपी सर्वलेट द्वारा ठीक से प्रस्तुत किया जाता है, मुझे लगता है, और प्रेषक सर्वलेट नहीं। दुर्भाग्यवश, यह फ़िक्स स्प्रिंग द्वारा प्रेषित रूट यूआरएल को तोड़ देगा, इसलिए आपको अब रूट यूआरएल + टाइल्स का उपयोग करने का विचार छोड़ना होगा।

कृपया ध्यान दें कि जोड़ने स्पष्ट सर्वलेट मानचित्रण ".jsp -> बिलाव jsp web.xml में मदद नहीं करता है, का उपयोग करते समय"/* ", और यह बेकार है

फिर भी समस्या हल नहीं होती। ।

इसके अलावा इस वसंत MVC में समस्या यह है 3.0

+0

समस्या रूट पथ का उपयोग करने के साथ नहीं है। यदि मैं रूट पथ का उपयोग करता हूं तो मैं हमेशा '/ 'और' @RequestMapping (value = {"", "/"}) के साथ जाता हूं। मुझे इसके साथ कोई समस्या नहीं मिली है, और मैं टाइल्स 2 और स्प्रिंग एमवीसी 3 का उपयोग कर रहा हूं। समस्या पहले सर्वलेट पथ निर्दिष्ट करने के साथ है। जब भी आप सर्वलेट पथ की जानकारी निर्दिष्ट करते हैं, तब वसंत का अनुरोध मैपिंग उसके बाद सबकुछ है। तो तकनीकी रूप से, वही अनुरोध मैपिंग काम करना चाहिए क्योंकि यह सर्वलेट पथ की जड़ है। हालांकि, यह मामला प्रतीत नहीं होता है। –

3

मेरी सेटअप आमतौर पर इस तरह दिखता है:

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

नियंत्रक, जहां मैं मान लें कि आपके समान रूप से /test और /test/ हैंडल करना चाहते हैं:

@Controller 
public class MyController { 

    @RequestMapping("/test") 
    public String test() { 
     return "redirect:/welcome"; 
    } 

    @RequestMapping("/test/") 
    public String test() { 
     return "redirect:/welcome"; 
    } 

    @RequestMapping("/welcome") 
    public void test(ModelMap model) { 
     // do your stuff 
    } 
} 

इस तरह के सेटअप *.css औरके अनुरोधों को संभालने के लिए DispatcherServlet का कारण बनेंगेफाइलें, जो ज्यादातर मामलों में वांछित नहीं है। मुझे लगता है कि यह समस्या है भविक वर्णन करता है। उन संसाधनों आप इस तरह ResourceController आप कर सकते हैं के लिए: /resources/css और /resources/js से

<mvc:resources mapping="/css/**" location="/resources/css/" /> 
<mvc:resources mapping="/js/**" location="/resources/js/" /> 

फ़ाइलों को एक अतिरिक्त नियंत्रक लिखने के लिए मजबूर कर रहा बिना परोसा जाएगा।

+0

मुझे लगता है कि यह रूट नियंत्रक के रूप में काम नहीं करेगा –

+0

@ भाविक अंबानी क्यों नहीं? – Yevgeniy

+0

प्रश्न रूट नियंत्रक के बारे में है, अधिक संदर्भ के लिए मेरे नीचे दिए गए उत्तर –

4

Yevgeniy सही है, लेकिन अगर आपके DispatcherServlet डिफ़ॉल्ट सर्वलेट के लिए ऊपर ले जा रहा है, तो आप अपने web.xml में जोड़ने के लिए है:

<welcome-file-list> 
    <welcome-file>/</welcome-file> 
</welcome-file-list> 
+0

मैं अजीब नहीं हूँ , यह सही तरीका है! –

0

स्पर्श के बिना एक तरह से web.xml फ़ाइल सेट कर रहा है डिफ़ॉल्ट स्वागत फ़ाइल पथ के लिए मानचित्र।

@RequestMapping("/index.html") 
0

मेरे मामले में, हर यूआरएल जड़ "/" यूआरएल के अलावा काम कर रहा था।
समस्या यह थी कि मैंने अपनी परियोजनाओं के वेबपैड रूट फ़ोल्डर के अंदर index.htm फ़ाइल को हटाया नहीं था।