2010-12-13 12 views
13

web.xml fragmentspring mvc jak pominąć DispatcherServlet dla plików * .html?

<!-- 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> 

To działa dobrze, ale chciałbym, aby nie pozwolić Dyspozytor Servlet obsłużyć żądania * .html. Jak mam to zrobić? Dzięki.

+1

To może być pomocne: http://stackoverflow.com/questions/1234298/can-springmvc-be-configured-to-process-all- request-but-exclude-static-content-d – AHungerArtist

+0

@AHungerArtist Dzięki za link. Znalazłem znacznie lepszą odpowiedź. –

Odpowiedz

5

Zaplanuj go na bardziej szczegółowym url-pattern.

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

Tworzenie Filter który jest odwzorowany na /*.

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

Który jest następujący w metodzie 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

To prawie dla mnie działa ... użycie getRequestURI zwróci ścieżkę zawierającą ścieżkę kontekstu. Zakładając, że twój kontekst to/ctx, żądanie do/ctx/foo zostanie wysłane do/ctx/spring/ctx/foo Myślę, że getServletPath() + getPathInfo() (jeśli pathInfo! = Null) działa lepiej – VoidPointer

+0

To rozwiązuje mój problem. Dzięki BalusC, jesteś niesamowity –

0

warto dodać to do swojej wiosennej XML 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> 

To spowoduje automatyczne mapowanie Wiosna wnioski z .html na kontrolerze. Na przykład. @RequestMapping(value = "/products/widgets", method = RequestMethod.GET) zwykle pułapkę URI z /products/widgets.html, a także /products/widgets. Dodanie powyższego kodu XML wymusza dokładne dopasowanie wzorców URI do wiosny (tylko te ostatnie będą pasować).

23

Wiosną MVC 3.x jest default servlet handler, aby zająć się tym problemem.

prostu dodać do config Wiosna XML:

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

Świetnie. Pamiętam tę konfigurację, ale nie pamiętam dokładnie kodu. Dziękuję Ci. – bnguyen82

+0

Dobrze, dziękuję – Ramp

+0

Uratowałeś mi dzień. Dziękuję – Bhaskara

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

może złapać jak /index, /*.html, /*.jsp ... i dać DispatcherServlet.

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

tylko można złapać /index, /main ..., bez przyrostka.

+0

Wow, najprostszy ze wszystkich. – Aakash

2

Rozwiązanie Lari (powyższe) jest świetne, i zadziałało dla mnie, ale musisz bardzo uważać z kolejnością, w której piszesz instrukcję, to musi być na początku dokumentu !!!

W moim przypadku było coś takiego:

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

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

Bardzo ładne rozwiązanie, rozwiązało również kilka innych problemów! – Aakash

Powiązane problemy