2010-12-13 16 views
13

web.xml टुकड़ावसंत एमवीसी * .html फ़ाइलों के लिए DispatcherServlet कैसे बाईपास करने के लिए?

<!-- Handles all requests into the application --> 
<servlet> 
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/app-config.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

यह ठीक काम करता है, लेकिन मैं जाने नहीं करने के लिए डिस्पैचर सर्वलेट संभाल * .html अनुरोध करना चाहते हैं। मैं यह कैसे करूँ? धन्यवाद।

+1

यह कुछ मदद की हो सकती है: http://stackoverflow.com/questions/1234298/can-springmvc-be-configured-to-process-all- अनुरोध-लेकिन-बहिष्कृत-स्थैतिक-सामग्री-डी – AHungerArtist

+0

@AHungerArtist लिंक के लिए धन्यवाद। मुझे वहां बहुत बेहतर जवाब मिला। –

उत्तर

5

इसे अधिक विशिष्ट url-pattern पर मानचित्र करें।

<servlet-mapping> 
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
    <url-pattern>/spring/*</url-pattern> 
</servlet-mapping> 

एक Filter जो /* पर मैप किया गया है बनाएँ।

<filter-mapping> 
    <filter-name>Your Dispatcher Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
<filter-mapping> 

doFilter() विधि में निम्नलिखित में से कौन सा करता है।

String uri = ((HttpServletRequest) request).getRequestURI(); 
if (uri.endsWith(".html")) { 
    chain.doFilter(request, response); // Just let it go (assuming that files are in real not placed in a /spring folder!) 
} else { 
    request.getRequestDispatcher("/spring" + uri).forward(request, response); // Pass to Spring dispatcher servlet. 
} 
+0

यह लगभग मेरे लिए काम करता है ... getRequestURI का उपयोग करके संदर्भ पथ सहित पथ वापस कर देगा। मान लें कि आपका संदर्भ/ctx है,/ctx/foo को अनुरोध/ctx/spring/ctx/foo को भेजा जाएगा मुझे लगता है कि getServletPath() + getPathInfo() (अगर pathInfo! = Null) बेहतर काम करता है – VoidPointer

+0

यह मेरी समस्या का समाधान करता है। धन्यवाद बलुस, आप भयानक –

0

अपने स्प्रिंग एक्सएमएल config को यह जोड़ने का प्रयास करें:

<!-- This will override the default DefaultAnnotationHandlerMapping that is created, 
    - and not map file extensions automagically --> 
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="useDefaultSuffixPattern" value="false"/> 
</bean> 

यह स्वचालित रूप से आपके नियंत्रक को .html अनुरोध मानचित्रण से वसंत नहीं कर पाएगा। जैसे @RequestMapping(value = "/products/widgets", method = RequestMethod.GET) आमतौर पर /products/widgets.html के साथ यूआरआई को /products/widgets पर फंस जाएगा। उपर्युक्त एक्सएमएल बलों को वसंत द्वारा यूआरआई पैटर्न के सटीक मिलान को जोड़ना (केवल बाद वाला मैच होगा)।

23

वसंत एमवीसी 3.x में इस समस्या का ख्याल रखने के लिए default servlet handler है।

सिर्फ वसंत एक्सएमएल config से जोड़ें:

<mvc:default-servlet-handler/> 
+0

ग्रेट हैं। मुझे यह कॉन्फ़िगरेशन याद है लेकिन मुझे बिल्कुल कोड याद नहीं है। धन्यवाद। – bnguyen82

+0

अच्छा, धन्यवाद – Ramp

+0

आपने मेरा दिन बचाया। धन्यवाद – Bhaskara

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

पकड़ने कर सकते हैं /index की तरह, /*.html, /*.jsp ..., और DispatcherServlet को दे।

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

केवल प्रत्यय के बिना पकड़ कर सकते हैं /index, /main ...,।

+0

वाह में मेरे लिए काम किया, वाह सबसे सरल है। – Aakash

2

लारी का समाधान (ऊपर) बहुत अच्छा है, और मेरे लिए काम किया है, लेकिन आपको उस निर्देश के साथ बहुत सावधान रहना होगा जिसमें आप निर्देश लिखते हैं, इसे दस्तावेज़ की शुरुआत में होना चाहिए !!!

मेरे मामले में था की तरह कुछ:

<mvc:annotation-driven /> 
<mvc:default-servlet-handler/> 

<context:annotation-config /> 
<context:component-scan base-package="org.civitana.controller" /> 
+0

बहुत अच्छा समाधान, कुछ अन्य समस्याओं को भी हल किया! – Aakash

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

  • कोई संबंधित समस्या नहीं^_^